إذا كنت تنشر تطبيقك على 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 جديدة
يجب أن يكون هناك مشروع 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 متعددة من خلال Google Play، يتم اختيار حزمة APK الصحيحة للاستخدام باستخدام قاعدتَين بسيطتَين:
- يجب أن يوضّح البيان أنّ حزمة APK هذه مؤهّلة.
- من بين ملفات APK المؤهَّلة، يتم اختيار الملف الذي يحمل أعلى رقم إصدار.
على سبيل المثال، لنأخذ مجموعة ملفات APK المتعددة الموضّحة سابقًا ونفترض أنّه تم ضبط كل ملف APK لتتوافق مع جميع أحجام الشاشات الأكبر من حجم الشاشة "المستهدف". عند النظر إلى كل حزمة APK على حدة، سيظهر النطاق المحتمل لكل حزمة APK على النحو التالي:
صغير | عادي | كبير | كبير جدًا |
صغير | عادي | كبير | كبير جدًا |
صغير | عادي | كبير | كبير جدًا |
ومع ذلك، باستخدام قاعدة "يفوز أعلى رقم إصدار"، إذا ضبطنا سمة versionCode في كل حزمة APK بحيث يكون الأحمر ≥ الأخضر ≥ الأزرق، يتم تصغير الرسم البياني بشكل فعال إلى ما يلي:
صغير | عادي | كبير | كبير جدًا |
لنفترض الآن أنّ حزمة APK الحمراء لها بعض المتطلبات التي لا تفرضها الحزمتَان الآخرتَان. تتضمّن صفحة الفلاتر على Google Play في دليل المطوّرين لنظام التشغيل Android قائمة كاملة بالعوامل المحتمَلة. على سبيل المثال، لنفترض أنّه يجب أن يكون الجهاز مزوّدًا بكاميرا أمامية لاستخدام الميزة "أحمر". في الواقع، الهدف من حزمة APK الحمراء هو استخدام المساحة الزائدة المتوفّرة على الشاشة لتنفيذ إجراءات ممتعة باستخدام الكاميرا الأمامية. ولكن تبيّن أنّه لا تتوفّر كاميرات أمامية في بعض الأجهزة الكبيرة جدًا. يا للهول!
لحسن الحظ، إذا كان أحد المستخدمين يتصفّح Google Play من أحد هذه الأجهزة، سيراجع Google Playملف البيان، وسيلاحظ أنّ تطبيق Red يُدرج الكاميرا الأمامية كشرط أساسي، وسيتجاهله بهدوء، بعد أن تأكد من أنّ تطبيق Red غير متوافق مع هذا الجهاز. سيتبيّن للتطبيق بعد ذلك أنّه لا يتوفّر اللون الأخضر إلا على الأجهزة الكبيرة جدًا، ولا يهتم أيضًا بما إذا كانت هناك كاميرا أمامية أم لا. لا يزال بإمكان المستخدم تنزيل التطبيق من Google Play، لأنّه على الرغم من المشكلة المتعلّقة بالكاميرا الأمامية، لا يزال هناك حزمة APK متوافقة مع حجم الشاشة هذا.
للحفاظ على جميع حِزم APK في "قنوات إصدار" منفصلة، من المهم أن يكون لديك رمز إصدار مخطّط جيد. يمكن العثور على الرمز المقترَح في قسم رموز الإصدار في دليل المطوّر. بما أنّ مجموعة حِزم APK النموذجية تتعامل فقط مع أحد السمات الثلاث المحتملة، يكفي فصل كل حزمة APK بمقدار 1, 000 وزيادة هذا العدد من هناك. قد يشبه ذلك يلي:
الأزرق: 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 المتعدّدة مع علامة supports-screens أو علامة compatible-screens. يُفضَّل استخدام علامة Supports-screens بشكل عام، وإنّ استخدام كلتا العلامتَين في البيان نفسه فكرة سيئة بشكل عام. ويؤدي ذلك إلى زيادة التعقيد بدون داعٍ، وزيادة احتمالية حدوث أخطاء. يُرجى العلم أيضًا أنّه بدلاً من الاستفادة من القيم التلقائية (تكون القيم "صغير" و"عادي" صحيحة دائمًا تلقائيًا)، تضبط ملفات البيان القيمة صراحةً لكل حجم شاشة. يمكن أن يجنبك ذلك الكثير من المتاعب في المستقبل. على سبيل المثال، إذا كان بيان التطبيق يحتوي على مستوى مستهدَف لحزمة SDK أقل من 9، سيتم ضبط xlarge تلقائيًا على false، لأنّ هذا الحجم لم يكن متوفّرًا بعد. لذا، يجب أن تكون واضحًا.
مراجعة قائمة التحقّق للإطلاق التجريبي
قبل التحميل إلى Google Play، يُرجى التحقّق جيدًا من العناصر التالية. يُرجى العِلم أنّ هذه القائمة تتعلّق تحديدًا بحِزم APK المتعدّدة، ولا تمثّل بأي شكل من الأشكال قائمة تحقّق كاملة لجميع التطبيقات التي يتم تحميلها إلى Google Play.
- يجب أن تتضمّن جميع حِزم APK اسم الحزمة نفسه.
- يجب توقيع جميع حِزم APK باستخدام الشهادة نفسها.
- كل حجم شاشة تريد أن تتوافق معه حزمة APK، اضبطه على true في البيان. كل حجم شاشة تريد تجنُّبه، اضبطه على false
- تحقّق جيدًا من فلاتر البيان بحثًا عن معلومات متضاربة (لن يظهر ملف APK الذي يتيح استخدام cupcake على الشاشات الكبيرة جدًا إلا لشخص واحد).
- يجب أن يكون ملف بيان كل حزمة APK فريدًا في ما يتعلق بشاشة أو نسيج OpenGL أو إصدار نظام أساسي واحد على الأقل.
- حاوِل اختبار كل حزمة APK على جهاز واحد على الأقل. بخلاف ذلك، لديك أحد أكثر محاكيات الأجهزة قابلية للتخصيص في المجال على جهاز التطوير. حظًا سعيدًا.
من المهم أيضًا فحص حزمة APK المجمّعة قبل طرحها في السوق للتأكّد من عدم وجود أي مفاجآت قد تؤدي إلى إخفاء تطبيقك على Google Play. وهذا الأمر بسيط جدًا باستخدام أداة "aapt". أداة Aapt (أداة تجميع مواد العرض في Android) هي جزء من عملية الإنشاء لإنشاء تطبيقات 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، تأكَّد من عدم توفّر قيم متضاربة لسمتي supports-screens وcompatible-screens، ومن عدم توفّر قيم "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 متعددة.