إنشاء حِزم APK متعددة بأبعاد متعدّدة

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

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

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

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

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

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

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

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

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

3 4 5 6 7 8 9 10 11 12 +
صغير
عادي
كبير
كبير جدًا

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

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

وسواء كنت تعدّل تطبيق 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-purple
foo-red

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

ضبط البيانات

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

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

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

3 4 5 6 7 8 9 10 11 12 +
صغير
عادي
كبير
كبير جدًا

ونظرًا لأنه من المقبول تداخل التغطية، يمكننا وصف المنطقة التي تغطيها كل حزمة APK على النحو التالي:

  • يشمل اللون الأزرق جميع الشاشات، الإصدار minSDK 3.
  • يشير اللون الأخضر إلى الشاشات الكبيرة والأعلى، minSDK 3.
  • يغطي اللون الأحمر الشاشات الكبيرة جدًا (الأجهزة اللوحية بشكل عام)، أمّا قيمة minSDK في الإصدار 9 مرّات.
  • يغطي اللون الأرجواني جميع الشاشات، حزمة minSDK رقم 11.

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

أرجواني ≥ أحمر ≥ أخضر ≥ أزرق

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

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

حتى يظل كل ملفات APK في "مسارات" منفصلة، فمن المهم أن يكون لديك نظام جيد لبرمجة الإصدار. ويمكن العثور على النموذج المقترَح في قسم رموز الإصدار ضمن دليل المطوِّر. من المفيد قراءة القسم بأكمله، لكن المغزى الأساسي من هذه المجموعة من حِزم APK، سنستخدم رقمين لتمثيل minSDK، ورقمين لتمثيل الحد الأدنى/الحد الأقصى لحجم الشاشة، و3 لتمثيل رقم الإصدار. بهذه الطريقة، عند ترقية الجهاز إلى إصدار جديد من Android، (على سبيل المثال، من 10 إلى 11)، فإنّ أي حِزم APK أصبحت مؤهَّلة الآن ومفضَّلة على تلك المثبَّتة حاليًا ستظهر للجهاز على أنّها "ترقية". عند تطبيق مخطط رقم الإصدار على نموذج مجموعة حزم APK، قد يبدو كالتالي:

أزرق: 0304001، 0304002، 0304003...
الأخضر: 0334001، 0334002، 0334003
الأحمر: 0344001، 0344002، 0344003...
الأرجواني: 1104001، 1104002، 1104003...

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

أزرق:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="0304001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <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="0334001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <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="0344001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

الأرجواني:

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

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

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

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

  • يجب أن يكون لجميع حِزم APK اسم الحزمة نفسه.
  • يجب توقيع جميع حِزم APK باستخدام الشهادة نفسها.
  • إذا تداخلت حِزم APK مع إصدار النظام الأساسي، يجب أن يتضمّن الإصدار الذي يحتوي على إصدار أعلى من minSdkVersion رمز إصدار أعلى.
  • يتم ضبط جميع أحجام الشاشة التي تريد أن تتوافق معها حزمة 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 تستهدف الأجهزة المقصودة. تهانينا، لقد انتهيت!