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