إنشاء حِزم 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.

نظام تحصيل رسوم العبور إلكترونيًا تقنية ATI منفذ 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 إيفو
نظام تحصيل رسوم العبور إلكترونيًا نظام تحصيل رسوم العبور إلكترونيًا نظام تحصيل رسوم العبور إلكترونيًا
منفذ PowerVR الموافقة والشفافية في ATI

بافتراض أن تنسيقي PowerVR وATI مفضلان على ETC1 عند توفرهما، وفقًا لـ "أعلى رقم إصدار يفوز" إذا حدّدنا سمة versionCode في كل حزمة APK مثل الأحمر ≥ الأخضر ≥ الأزرق، سيتم دائمًا اختيار كل من الأحمر والأخضر بدلاً من الأزرق على الأجهزة المتوافقة معها، وإذا كان هناك جهاز يتوافق مع كل من اللونين الأحمر والأخضر، الأحمر.

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