إنشاء حِزم APK متعددة لزخارف GL المختلفة

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

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

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

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

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

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

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

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

يوفّر دليل مطوِّر برامج Android مرجعًا مفيدًا لبعض الزخارف الشائعة والمتوافقة على صفحة supports-gl-texture. تعرض هذه الصفحة أيضًا بعض التلميحات حول الهواتف (أو مجموعات الهواتف) التي تتيح استخدام تنسيقات زخارف معيّنة. يُرجى العِلم أنّه من الأفضل بشكل عام أن تتوافق إحدى حِزم APK مع ETC1، لأنّ تنسيق الزخرفة هذا متوافق مع جميع الأجهزة التي تعمل بنظام التشغيل Android والمتوافقة مع مواصفات OpenGL ES 2.0.

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

ETC1 تعلُّم الآلة PowerVR

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

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

وسواء كنت تعدّل تطبيق 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، يعتبر هذا الجهاز مؤهلاً

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

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

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

هاتف FooPhone Nexus S إيفو
ETC1 ETC1 ETC1
PowerVR سجل ATI TC

بافتراض أن تنسيقَي PowerVR وATI هما يُفضّلان على ETC1 عند توفُّرهما، مقارنةً بقاعدة "أعلى رقم إصدار يفوز"، إذا ضبطنا سمة رمز الإصدار في كل حزمة 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-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
    ...

أخضر:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_AMD_compressed_ATC_texture" />
    ...

أحمر:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_IMG_texture_compression_pvrtc" />
    ...

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

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

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