إنشاء حِزم APK متعدّدة لأحجام شاشات مختلفة

إذا نشرت تطبيقك على Google Play، عليك إنشاء مجموعة حزمات تطبيق Android وتحميلها. عند إجراء ذلك، يعمل Google Play تلقائيًا على إنشاء حِزم APK محسّنة وعرضها وفقًا لإعدادات جهاز كل مستخدم، وذلك حتى يتم تنزيل الرمز والموارد التي يحتاجونها لتشغيل تطبيقك. ومن المفيد نشر عدة حِزم APK إذا كنت لا تنشر على Google Play، ولكن عليك إنشاء كل حزمة APK وتوقيعها وإدارتها بنفسك.

عند تطوير تطبيق Android للاستفادة من حِزم APK متعددة على Google Play، من المهم تطبيق بعض الممارسات الجيدة من البداية وتجنُّب المشاكل غير الضرورية في عملية التطوير. يوضح لك هذا الدرس كيفية إنشاء ملفات APK متعددة لتطبيقك، بحيث يغطي كل منها فئة مختلفة من أحجام الشاشة. ستحصل أيضًا على بعض الأدوات اللازمة لجعل الحفاظ على قاعدة رموز APK متعددة بدون عناء قدر الإمكان.

تأكيد الحاجة إلى حِزم APK متعدّدة

عند محاولة إنشاء تطبيق يعمل على أحجام متعددة لأجهزة Android، فأنت تريد بطبيعة الحال أن يستفيد تطبيقك من كل المساحة المتاحة على الأجهزة الأكبر حجمًا، دون التضحية بالتوافق أو سهولة الاستخدام على الشاشات الأصغر حجمًا. وقد يبدو الأمر في البداية على الرغم من أن تعدد تطبيقات APK هو الحل الأفضل، إلا أن الأمر ليس كذلك في أغلب الأحيان. يتضمن القسم استخدام حزمة APK واحدة بدلاً من ذلك ضمن دليل مطوّري برامج APK المتعددين بعض المعلومات المفيدة حول كيفية تنفيذ ذلك باستخدام حزمة APK واحدة، بما في ذلك استخدام مكتبة الدعم. ينبغي لك أيضًا قراءة الدليل حول إتاحة الشاشات المتعددة، وهناك أيضًا مكتبة دعم يمكنك تنزيلها باستخدام حزمة SDK لنظام التشغيل Android، والتي تسمح لك باستخدام الأجزاء على الأجهزة التي تعمل بالإصدارات السابقة لـ Honeycomb (مع جعل إتاحة التوافق مع الشاشات المتعددة في حزمة APK واحدة أسهل كثيرًا).

فإذا تمكنت من إدارتها، فإن حصر تطبيقك بحزمة APK واحدة له العديد من المزايا، منها:

  • أصبحت عملية النشر والاختبار أسهل
  • هناك قاعدة رموز برمجية واحدة فقط يجب صيانتها
  • يمكن لتطبيقك التكيّف مع التغييرات في إعدادات الجهاز.
  • تعمل ميزة استعادة التطبيقات على جميع الأجهزة
  • ليس عليك القلق بشأن الإعدادات المفضّلة للسوق، أو السلوك من "عمليات الترقية" من حزمة APK إلى الملف التالي، أو اختيار حزمة APK المتوافقة مع أي فئة من الأجهزة.

يفترض الجزء المتبقي من هذا الدرس أنك قد بحثت عن الموضوع، واستوعبت بشكل مكثف المواد في الموارد المرتبطة، وقررت أن حزم APK متعددة هي المسار الصحيح لتطبيقك.

وضع مخطط للمتطلبات

ابدأ بإنشاء مخطط بسيط لتحديد عدد حزم APK التي تحتاجها بسرعة وأحجام الشاشة التي تغطيها كل حزمة APK. لحسن الحظ، من السهل تحديد متطلباتك بسرعة وسهولة، والحصول على مرجع لوقت لاحق. ابدأ بصف من الخلايا يمثل أحجام الشاشة المختلفة المتوفرة على نظام Android الأساسي.

صغير عادي كبير كبير جدًا

والآن أصبح بإمكانك استخدام الألوان في المخطط بحيث يمثل كل لون ملف APK. إليك مثال على كيفية تطبيق كل ملف APK على نطاق معين من أحجام الشاشات

صغير عادي كبير كبير جدًا

وحسب احتياجاتك، يمكنك أيضًا استخدام ملفَّي APK، إما "صغير وكل شيء آخر" أو "كبير وكل شيء آخر". يؤدي التلوين في الرسم البياني إلى تسهيل التواصل داخل الفريق. يمكنك الآن الإشارة إلى كل حزمة APK على أنّها "أزرق" أو "أخضر" أو "أحمر"، بغض النظر عن عدد أنواع الشاشات المختلفة التي تغطيها هذه الحزمة.

وضع جميع الرموز والموارد الشائعة في مشروع مكتبة

وسواء كنت تعدّل تطبيق Android حاليًا أو تبدأ تطبيقًا من نقطة الصفر، هذا هو أول إجراء عليك اتخاذه بخصوص قاعدة الترميز، وهو الأهم إلى حدّ كبير. يجب تحديث كل ما يتعلق بمشروع المكتبة مرة واحدة فقط (فكر في السلاسل المترجمة إلى اللغة ومظاهر الألوان والأخطاء التي يتم إصلاحها في التعليمات البرمجية المشتركة)، مما يؤدي إلى تحسين وقت التطوير ويقلل من احتمالية حدوث أخطاء كان من الممكن تجنبها بسهولة.

ملاحظة: بالرغم من أنّ تفاصيل التنفيذ المتعلّقة بكيفية إنشاء مشاريع المكتبة وتضمينها تقع خارج نطاق هذا الدرس، يمكنك التعرّف على ذلك بسرعة من خلال قراءة إنشاء مكتبة Android.

إذا كنت تحوّل تطبيقًا حاليًا لاستخدام دعم حزم APK متعددة، ابحث في قاعدة الرموز بحثًا عن كل ملف سلسلة مترجَم وقائمة القيم وألوان المظاهر ورموز القائمة والتنسيق التي لن تتغير في حزم APK، وضع كل ذلك في مشروع المكتبة. التعليمات البرمجية التي لن تتغير كثيرًا يجب أن تسري أيضًا في مشروع المكتبة. من المحتمل أن تجد نفسك تعمل على توسيع نطاق هذه الفئات لإضافة طريقة أو اثنتين من حزمة APK إلى حزمة APK.

من ناحية أخرى، إذا كنت تنشئ التطبيق من البداية، حاوِل قدر الإمكان كتابة الرموز البرمجية في مشروع المكتبة أولاً، ثم انقلها إلى ملف APK فردي فقط عند الضرورة. وهذه الطريقة أسهل في الإدارة على المدى الطويل مقارنةً بإضافتها إلى قسم آخر، ثم إضافة أخرى ثم الأخرى، ثم بعد مرور أشهر على محاولة معرفة ما إذا كان من الممكن نقل هذه النقطة إلى قسم المكتبة بدون استخدام أي شيء.

إنشاء مشاريع APK جديدة

يجب أن يكون هناك مشروع Android منفصل لكل حزمة APK تريد إصدارها. لتسهيل التنظيم، ضع مشروع المكتبة وجميع مشاريع APK ذات الصلة ضمن المجلد الرئيسي نفسه. تذكر أيضًا أنه يجب أن يكون لكل ملف APK اسم الحزمة نفسه، على الرغم من أنه ليس من الضروري مشاركة اسم الحزمة مع المكتبة. إذا كان لديك 3 حزم APK تتّبع المخطط الموضّح سابقًا، قد يبدو الدليل الجذري على النحو التالي:

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

بعد إنشاء المشاريع، أضِف مشروع المكتبة كمرجع لكل مشروع حزمة APK. إذا أمكن، حدِّد نشاط البدء في مشروع المكتبة، ووسِّع نطاق هذا النشاط في مشروع APK. من خلال تحديد نشاط بدء محدّد في مشروع المكتبة، يمكنك وضع جميع عمليات إعداد تطبيقاتك في مكان واحد حتى لا تضطر كل حزمة APK فردية إلى إعادة تنفيذ مهام "عامة" مثل إعداد "إحصاءات Google" وإجراء عمليات فحص للتراخيص وأي إجراءات إعداد أخرى لا تتغيّر كثيرًا من حزمة APK إلى حزمة APK.

ضبط البيانات

عندما ينزِّل المستخدم تطبيقًا يستخدم حِزم APK متعددة من خلال Google Play، يتم اختيار ملف APK الصحيح المطلوب استخدامه من خلال قاعدتَين بسيطتَين:

  • يجب أن يُظهر البيان أنّ حِزمة APK معيّنة مؤهلة.
  • من بين حِزم APK المؤهلة، يفوز أعلى رقم إصدار

على سبيل المثال، لنأخذ مجموعة من حزم APK المتعددة التي تم توضيحها سابقًا، ونفترض أنه تم ضبط كل حزمة APK بحيث تتوافق مع جميع أحجام الشاشات الأكبر من حجم الشاشة "الهدف". عند استخدام الإصدار بشكل فردي، سيبدو النطاق المحتمل لكل حزمة APK على النحو التالي:

صغير عادي كبير كبير جدًا
صغير عادي كبير كبير جدًا
صغير عادي كبير كبير جدًا

مع ذلك، باستخدام القاعدة "أعلى رقم إصدار مفوز"، إذا ضبطنا سمة رمز الإصدار في كل حزمة APK على النحو التالي الأحمر ≥ الأخضر ≥ أزرق، سيتم تصغير الرسم البياني فعليًا إلى ما يلي:

صغير عادي كبير كبير جدًا

والآن، لنفترض أيضًا أن ملف APK الأحمر له بعض المتطلبات، على عكس الملفين الآخرين. تتضمن صفحة الفلاتر على Google Play في دليل مطوّري برامج Android قائمة كاملة بالأسباب المحتملة. على سبيل المثال، لنفترض أن اللون الأحمر يتطلب كاميرا أمامية. في الواقع، الهدف الأساسي من حزمة APK الحمراء هو استخدام مساحة الشاشة الإضافية المتاحة للقيام بأشياء ترفيهية باستخدام تلك الكاميرا الأمامية. لكن، اتضح، لا تحتوي جميع الأجهزة الكبيرة الحجم حتى على كاميرات أمامية! رعب!

لحسن الحظ، إذا كان المستخدم يتصفّح Google Play من أحد هذه الأجهزة، سينظر Google Play إلى الظاهر، وسيرى أنّ اللون الأحمر يُدرج الكاميرا الأمامية كشرط، ويتجاهلها بهدوء بعد أن يقرّر أنّ اللون الأحمر (Red) وهذا الجهاز ليسا متطابقَين مع المتطلبات الرقمية. ستلاحظ حينها أنّ اللون الأخضر لا يتوافق فقط مع الأجهزة ذات الحجم الكبير، ولكنه لا يهمه ما إذا كانت هناك كاميرا أمامية أم لا. سيظل بإمكان المستخدم تنزيل التطبيق من Google Play، لأنّه على الرغم من العطل الذي حدث في الكاميرا الأمامية بالكامل، لا يزال هناك ملف APK يتوافق مع هذا الحجم المحدَّد للشاشة.

حتى يظل كل ملفات APK في "مسارات" منفصلة، فمن المهم أن يكون لديك نظام جيد لبرمجة الإصدار. ويمكن العثور على النموذج المقترَح في قسم رموز الإصدار ضمن دليل المطوِّر. ونظرًا لأن المجموعة النموذجية من حِزم APK تتعامل فقط مع واحد من 3 أبعاد محتملة، سيكون يكفي فصل كل حزمة APK بمقدار 1000 وتزايده من هناك. قد يبدو هذا كما يلي:

أزرق: 1001، 1002، 1003، 1004...
الأخضر: 2001، 2002، 2003، 2004...
الأحمر:3001، 3002، 3003، 3004...

من خلال وضع كل هذه الخيارات معًا، قد تظهر ملفات بيانات Android على النحو التالي:

أزرق:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

أخضر:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

أحمر:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

تجدر الإشارة إلى أنّ حِزم APK المتعددة ستعمل من الناحية الفنية باستخدام علامة الشاشات المتوافقة أو علامة الشاشات المتوافقة. يُفضل بشكل عام استخدام الشاشات المتوافقة، ومن غير السيئ بشكل عام استخدام كلتا العلامتين في نفس البيان. إنه يجعل الأمور معقدة بلا داعٍ، وتزيد من فرصة الأخطاء. تجدر الإشارة أيضًا إلى أنّه بدلاً من الاستفادة من القيم التلقائية (تكون القيم الصغيرة والعادية صحيحة دائمًا بشكل تلقائي)، تحدِّد البيانات بوضوح القيمة لكل حجم شاشة. يمكن أن يوفر هذا عليك المتاعب لاحقًا. على سبيل المثال، إذا كان البيان الذي يتضمّن حزمة تطوير برامج (SDK) مستهدَفة أقل من 9، سيتم ضبط xlarge تلقائيًا على false، لأنّ هذا الحجم لم يكن متوفرًا بعد. لذا كن واضحًا!

مراجعة قائمة تحقق الإطلاق التجريبي

قبل التحميل إلى Google Play، تحقق جيدًا من العناصر التالية. تذكر أن هذه الملفات ذات صلة تحديدًا بحِزم APK متعددة، ولا تمثل بأي شكل من الأشكال قائمة تحقق كاملة لجميع التطبيقات التي يتم تحميلها إلى Google Play.

  • يجب أن يكون لجميع حِزم APK اسم الحزمة نفسه.
  • يجب توقيع جميع حِزم APK باستخدام الشهادة نفسها.
  • يتم ضبط جميع أحجام الشاشة التي تريد أن تتوافق معها حزمة APK على "صحيح" في البيان. كل حجم شاشة تريد تجنبه، قم بتعيينه على false
  • تحقق مرة أخرى من فلاتر البيان بحثًا عن معلومات متضاربة (لن يتمكن أي شخص من رؤية ملف APK لا يتوافق إلا مع cupake على شاشات XLARGE).
  • يجب أن يكون ملف البيان الخاص بكل حزمة APK فريدًا على شاشة واحدة على الأقل من الشاشات المتوافقة أو زخرفة openGL أو إصدار النظام الأساسي.
  • جرِّب اختبار كل حزمة APK على جهاز واحد على الأقل. باستثناء ذلك، لديك أحد أكثر محاكيات الأجهزة قابلية للتخصيص في نشاطك التجاري على جهاز التطوير الذي تستخدمه. يا إلهي!

كذلك، من المفيد فحص حزمة APK المُجمّعة قبل نشرها في السوق، للتأكد من عدم وجود أي مفاجآت قد تخفي تطبيقك على Google Play. يعد ذلك أمرًا بسيطًا للغاية باستخدام أداة "aapt". تُعد Aapt (أداة Android Asset Packaging Tool) جزءًا من عملية الإنشاء لإنشاء تطبيقات Android وتجميعها، وهي أيضًا أداة سهلة للغاية لفحصها.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

عند فحص مخرجات Aapt، تأكد من أنه ليس لديك قيم متعارضة لشاشات الدعم والشاشات المتوافقة، ومن أنه ليس لديك قيم "uses-feature" غير مقصودة تمت إضافتها كنتيجة للأذونات التي حددتها في البيان. في المثال أعلاه، ستكون حزمة APK غير مرئية لمعظم الأجهزة، إن لم يكن كلّها.

ما السبب؟ بإضافة الإذن المطلوب SEND_SMS، تمت إضافة متطلبات ميزة android.hardware.telephony بشكلٍ ضمني. وبما أنّ معظم (إن لم يكن كلّها) الأجهزة اللوحية الكبيرة هي أجهزة لوحية لا تتوفّر بها أجهزة هاتفية، سيعمل Google Play على فلترة ملف APK هذا في هذه الحالات إلى أن يتم طرح أجهزة في المستقبل وتكون كبيرة بما يكفي لتسجيل حجم الشاشة الكبير عليها وتمتلك أجهزة هاتفية.

لحسن الحظ، يمكن إصلاح هذا بسهولة عن طريق إضافة ما يلي إلى بيانك:

<uses-feature android:name="android.hardware.telephony" android:required="false" />

تمت أيضًا إضافة شرط android.hardware.touchscreen ضمنيًا. إذا أردت أن يكون ملف APK مرئيًا على أجهزة التلفزيون التي لا تعمل على شاشات تعمل باللمس، يجب إضافة ما يلي إلى البيان:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

بعد إكمال قائمة تحقق الإطلاق التجريبي، يمكنك تحميل ملفات APK إلى Google Play. قد يستغرق ظهور التطبيق بعض الشيء عند تصفح Google Play، ولكن عند ظهوره، يمكنك إجراء فحص أخير. يمكنك تنزيل التطبيق على أي أجهزة اختبارية قد تحتاج إليها للتأكد من أنّ حِزم APK تستهدف الأجهزة المقصودة.

لمزيد من المعلومات حول نشر ملفات APK متعددة على Google Play، يُرجى الاطّلاع على إتاحة حِزم APK متعددة.