نصائح لمطوري Android لتقليل حجم ملف APK
نشرت: 2015-10-281) ProGuard
ستعمل أداة لتقليص الكود ، مثل ProGuard ، على تقليل حجم ملف APK بشكل كبير. الأداة متاحة في سورس فورج. لاحظ أنه من المهم جدًا إعادة اختبار التطبيق بالكامل بعد تطبيق ProGuard لأنه قد يغير سلوك التطبيق في بعض الأحيان. نظرًا لاستبدال ProGuard برموز التطبيق ، لجعل قراءة التعليمات البرمجية صعبة ، من المهم أن تحتفظ بتعيين الرمز ، بحيث يمكنك ترجمة تتبع المكدس إلى الرموز الأصلية إذا كان عليك التحقيق في تعطل التطبيق الخاص بك.
2) إزالة معلومات التصحيح
أوصي بإزالة جميع الوظائف المتعلقة بالتصحيح من التطبيق. لا يرى التطبيق عمومًا هذه البيانات أو يستخدمها ، ولا يتطلبها نظام التشغيل Android لتشغيل التطبيق. ومن ثم ، فإن معلومات التصحيح تهدر المساحة فقط ، ويجب إزالتها.
لإنجاز ذلك ، يجب وضع جميع الوظائف المتعلقة بالتصحيح في كتل شرطية ، كما هو موضح أدناه:
التصحيح النهائي الثابت = خطأ ؛ إذا (تصحيح) { v (TAG ، "تصحيح ...") }
من المهم أن يتم تعيين علامة التصحيح في وقت الترجمة (أي إعلانها كنهائي ثابت) حتى يتمكن المترجم من إزالة جميع وظائف التصحيح تمامًا. إن إنشاء أسلوب تصحيح الأخطاء الخاص بك مثل الطريقة الموضحة أدناه ليس فكرة جيدة لأن استدعاء myDebugPrint () غير محاط بكتلة شرطية ، مما يعني أن المترجم يجب أن يحتفظ بمعلومات حول myDebugPrint () في فئة الاستدعاء.
myDebugPrint عام باطل () إذا (تصحيح) v (TAG ، "تصحيح ...") ؛ } } ... myDebugPrint ()
3) إزالة رموز التصحيح من المكتبات الأصلية يعد استخدام رموز التصحيح أمرًا منطقيًا إذا كان التطبيق الخاص بك لا يزال قيد التطوير ، ولا يزال يتطلب تصحيح الأخطاء. ولكن إذا استمرت رموز تصحيح الأخطاء في الظهور عند تجميع إصدار ، وإذا كنت تريد إزالتها ، فإننا نوصي بإزالة رموز التصحيح من المكتبات الأصلية (ملفات .so). يتم ذلك باستخدام الأمر arm-eabi-strip من Android NDK.
4) تنسيقات الوسائط الموصى بها إذا كان تطبيقك يعتمد بشكل كبير على الصور أو الصوت أو الفيديو ، فهناك طريقة أخرى لتقليل حجم ملف APK وهي استخدام تنسيقات وسائط معينة. نوصي باستخدام تنسيقات الوسائط التالية للصور والصوت والفيديو:
- الفيديو: استخدم H264 AVC. قم بتشفير الفيديو إلى دقة لا تزيد عن دقة شاشة الجهاز المستهدف (إذا كان معروفًا).
- الصوت : يوصى باستخدام AAC Audio لجميع موارد الصوت. يحقق AAC ضغطًا أفضل بجودة معينة ، مقارنةً بـ mp3 أو Ogg Vorbis. لا ينبغي أبدًا استخدام التنسيقات الأولية مثل WAV. السبب المنطقي الشائع لاستخدام تنسيق WAV هو أن فك ترميز تدفقات الصوت المضغوط يعني عادةً زمن انتقال عالٍ عند التشغيل. ومع ذلك ، يوفر Android واجهة برمجة تطبيقات Sound Pool التي تمكن التطبيقات من استخدام تدفقات الصوت المضغوطة دون عقوبة الكمون العالي.
- الصور : PNG أو JPEG. استخدام PNGs ؛ نظرًا لأنه تنسيق غير ضياع ، فهو مناسب جدًا للأنسجة والأعمال الفنية حيث لن يكون هناك أي آثار مرئية من الضغط. إذا كانت هناك قيود على المساحة ، فاستخدم JPEGs أو مجموعة من PNGs و JPEG. قد تعمل صورة JPEG عالية الجودة بشكل جيد مع الصور الواقعية الكبيرة ، والتي تم تحسين نظام ضغط JPEG من أجلها.
- قم بتحسين أحجام PNG دون فقدان الجودة
إذا كنت تستخدم تنسيق PNG ، فيمكن تقليل حجم صور PNG في حجم الملف دون فقدان الجودة. للقيام بذلك ، استخدم أداة مثل OptiPNG أو PNGCrush. كلاهما رائع لتقليل حجم ملف PNG مع ضمان جودة الصورة. PNGcrush هو برنامج مفتوح المصدر يتكرر عبر مرشحات PNG ومعلمات zlib (Deflate) ، ويضغط الصورة بشكل متكرر باستخدام تكوين كل معلمة ، ويختار التكوين الذي ينتج أصغر إخراج مضغوط (IDAT). من ناحية أخرى ، يقوم OptiPNG بإجراء التجارب بالكامل في الذاكرة ، ويكتب فقط ملف الإخراج النهائي على القرص. علاوة على ذلك ، فإنه يوفر إعدادات مسبقة متعددة للتحسين للمستخدم.
5) إزالة الموارد غير المستخدمة هناك مجموعة أخرى محتملة من ضياع المساحات التي يجب مراعاتها لإزالتها من ملف APK الخاص بك وهي الموارد غير المستخدمة في دليل res الخاص بك ، مثل التخطيطات غير المستخدمة والعناصر القابلة للرسم والألوان. لاكتشاف الموارد غير المستخدمة في ملف APK الخاص بك والتي يمكن إزالتها ، استخدم أداة موارد android-unused-resources. Android Unused Resources هو تطبيق Java يقوم بمسح مشروعك بحثًا عن الموارد غير المستخدمة.
6) تجنب الازدواجية يعد التأكد من أن تطبيقك لا يحتوي على وظائف مكررة أو أصول مكررة طريقة واضحة لتجنب وجود ملفات غير ضرورية في ملف APK الخاص بك. من المهم فهم واجهات برمجة تطبيقات Android التي تستخدمها والوظائف الكاملة التي يوفرها كل منها. قد تكون واجهة برمجة تطبيقات Android تقوم بالفعل بعمل واجهة برمجة تطبيقات أخرى. تعد الأصول المكررة (السلاسل والصور النقطية وما إلى ذلك) مضيعة للمساحة ويمكن تجنبها بسهولة. إلى حد أقل ، ستؤدي التعليمات البرمجية المكررة أيضًا إلى زيادة حجم الملف الثنائي الذي تم تسليمه دون داعٍ.
7) قلل من عدد طريقتك ، لطالما واجه مطورو Avid Android مشكلة تسبب الصداع في تطبيقاتهم. عدد الطرق التي يمكن أن يستخدمها التطبيق محدود. حسنًا ، لقد كانت محدودة. أخيرًا ، قدم الأشخاص الجيدون في Google حلاً في أكتوبر الماضي ، لكنه لم يكن مثاليًا. على الرغم من سهولة تنفيذه ، إلا أن حل multidex معقد وطول وقت التجميع بشكل كبير. لا يقف ساكنًا ، بدءًا من Lollipop (Android 5.0) ، تم تطوير جهاز Android الظاهري بالكامل لتقديم حل أكثر قابلية للتحمل ، من النوع الذي يتحسن حتى في وقت التجميع المعتاد. ومع ذلك ، في الوقت الحالي ، لا يعد حل Lollipop مثاليًا أيضًا. يتطلب من المطورين التطوير مقابل Lollipop فقط ، مما قد يكون مشكلة لأن معظم التطبيقات تريد أن تكون متوافقة مع نطاقات أوسع من الجماهير وقد تخشى استخدام ميزات غير متوفرة في إصدارات Android السابقة. لذا في الوقت الحالي ، يعد حل Lollipop حلاً جيدًا لنظام Android في المستقبل ، ولكن قد لا يكون له تأثير كبير في الحاضر المنظور. إذن ما الذي يمكن عمله في هذه الأثناء؟ نتفق جميعًا على أنه لا يجب عليك التخلي عن الميزات والإمكانيات ، فقط لتجنب الوصول إلى حد 65 ألفًا. ولكن ليس هناك شك في أن أفضل الممارسات ستظل هي تقليل عدد طرق التطبيق الخاصة بك. فكيف لا يزال بإمكانك محاولة تقليل عدد طريقتك دون فقدان تلك الشرارة الصغيرة التي تجعل تطبيقك مميزًا؟
نظرة عامة موجزة: "من أين تأتي كل هذه الأساليب؟"
يقف حد عدد الطرق تقريبًا عند 65 ألف طريقة (65.536 على وجه الدقة). هذا يبدو وكأنه عدد ضخم. إذا كنت مطور برامج Android مبتدئًا ، فقد تفكر في "كيف يمكن للعديد من التطبيقات الوصول إلى هذا الرقم بهذه السرعة؟" ربما تكون على صواب إلى حد ما. ليس من السهل كتابة العديد من الطرق بنفسك. لكن مطوري التطبيقات لا يكتبون تطبيقهم بالكامل من تلقاء أنفسهم. يستخدم مطورو التطبيقات المزيد والمزيد من مكتبات الجهات الخارجية (SDKs - Software Development Kits) ، والتي تساعدهم على تحقيق أهداف وميزات معينة ، وإلا سيتعين عليهم تطويرها بالكامل بأنفسهم. من الإعلانات من خلال تحسينات واجهة المستخدم الرسومية إلى الشبكات الاجتماعية ، وتقارير الأعطال وغيرها الكثير ، توفر SDK مجموعة واسعة من الإمكانات وواجهات برمجة التطبيقات التي توفر وقت التطوير الثمين وتساعد في نشر تطبيقك بشكل أسرع. لكن كل حزمة SDK تضيف إلى عدد طريقتك ، بل إن بعض حزم SDK تفعل أكثر من مجرد ما كنت تتمناه. ليس بالضرورة أمرًا سيئًا بالطبع. ومع ذلك ، فإن انقلاب الرحمة جاء من شركة جوجل نفسها. مجموعة خدمات Google Play الخاصة بهم عبارة عن حزمة SDK كبيرة تحتوي على أكثر من 28000 طريقة. نظرًا لأن الحد الأقصى هو 65 ألفًا ، فإن هذا الرقم ليس منخفضًا تمامًا. ويود العديد من مطوري التطبيقات استخدام SDK هذا لأنه يفتح الباب أمام مملكة Google السحرية ، وهي القدرة المرغوبة كثيرًا والتي تضيف الكثير من القيمة إلى تطبيق الفرد. في هذا المنشور ، لن أشرح فقط كيفية استخدام حزم خدمات Google Play بشكل انتقائي ، بل سأقدم لك أيضًا معلومات حول عدد الطرق التي تضيفها كل واحدة من هذه الحزم إلى تطبيقك. لذا تمسك بمقاعدك ، ستكون رحلة وعرة.
ملعب خدمات Google Play
إذن كم عدد الطرق التي تضيفها خدمات Google Play بالفعل؟ حسنًا ، كما هو الحال مع كل شيء في الحياة ، فهو أكثر تعقيدًا بكثير من مجرد رقم نهائي. لكن دعونا نأخذها خطوة واحدة في كل مرة. يحتوي Google Play Services SDK في الواقع على 19 مجموعة SDK مختلفة. باستخدام Gradle ، يمكنك اختيار التطبيقات التي تريد استخدامها بشكل انتقائي. كل ما عليك فعله هو إضافة التبعية التالية إلى ملف build.gradle الخاص بوحدة التطبيق:
التبعيات { ترجمة "com.google.android.gms: play-services: 7.5.0" }
مع 7.5.0 هو أحدث إصدار GPS تم إصداره في هذا الوقت. تم تصنيفها على أنها المراجعة 25 داخل Android SDK Manager. من أجل اختيار حزم معينة ، استبدل السطر التالي بأكبر عدد تريده من سطور التبعية ، مع تحديد حزم معينة. لنفترض على سبيل المثال أنك تريد Google Plus و Google Games و Google Ads وخرائط Google:
التبعيات { ترجمة "com.google.android.gms: play-services-plus: 7.5.0" ترجمة "com.google.android.gms: play-services-games: 7.5.0" ترجمة "com.google.android.gms: play-services-ads: 7.5.0" تجميع "com.google.android.gms: play-services-maps: 7.5.0" }
ليس صعبًا جدًا ، ولكن هذا هو أول شيء. واحدة من 19 SDKs المجيدة تسمى play-services-base. إذا قمت بتضمين أي حزمة خدمة Google Play ، فسيتم إضافتها تلقائيًا أيضًا. كم عدد الطرق التي تحتوي عليها الحزمة الأساسية؟ ما يقرب من 8000 (الرقم الدقيق أدناه).
وهنا تكمن المشكلة الثانية. لم أقم بتضمين 3 حزم فقط في المثال أعلاه. لم أقم بتضمين 4 فقط ، إذا قمت بحساب الحزمة الأساسية أيضًا. في الواقع ، لقد قمت بتضمين 5 حزم. لماذا ا؟ نظرًا لأن حزمة ألعاب Google تستخدم حزمة Google Drive ، وبالتالي تم استيرادها أيضًا (في الواقع ، يتضمن إعلانات Google أيضًا حزمة تسمى مدير العلامات ، لكنني أحسب فقط الحزم "القابلة للتحديد" هنا).
لذلك بدأنا الآن في فهم سبب صعوبة حساب عدد الطرق التي تضيفها كل حزمة من خدمات Google Play إلى تطبيقنا. تضمين حزمة واحدة لا يعني بالضرورة استبعاد البقية.
إذن ، ها هي الحزم التي يمكنك إضافتها ، وعدد الطرق التي تضيفها وما هي الحزم الأخرى التي تجلبها لتعطل الحفلة. تشير البيانات إلى أحدث إصدار من خدمات Google Play (7.5.0 / المراجعة 25):
إجمالي عدد الطرق: 28175 ، بعض هذه الأرقام ، عليك أن تعترف ، فظيعة حقًا. إذا كان كل ما تريده هو حزمة البانوراما ، فلا يمكنك الحصول على تسع طرق فقط ، بل يجب أن تحصل على ما يقرب من 8000. لا عجب أن تقترب العديد من التطبيقات أو تتجاوز حد 65 ألفًا.
قد تبدو بعض هذه الأرقام غير متسقة بعض الشيء إذا حاولت إضافتها. هذا لأنه ، مرة أخرى ، المنطق وراء خدمات Google Play أصعب قليلاً مما تراه العين. على سبيل المثال ، يتضمن Google Analytics طريقة واحدة من إعلانات Google للحصول على معرّف الإعلان للحساب.
لاحظ أنه عند حساب المقدار الذي تضيفه كل حزمة إلى تطبيقك ، تأكد من استبعاد المضاعفات (على سبيل المثال ، لا تحسب الحزمة الأساسية أكثر من مرة).
لا يمكنك إضافة كل شيء بشكل انتقائي
وهذه هي اللدغة الأخيرة. هناك حزمتان صغيرتان داخل خدمات Google Play لا يمكن إضافتهما بشكل انتقائي. تتضمن حزمة البحث (التي تمنحك الوصول إلى Google Now API) 22 طريقة فقط. إذا كنت ترغب في استخدامه ، فلن يكون لديك خيار سوى إضافة أكثر من 28000 طريقة بالكامل ، خدمات Google Play بالكامل. نأمل أن يتم إصلاح هذا في الإصدارات الأحدث.
(حزمة أخرى "غير قابلة للوصول" هي حزمة appstate التي تتضمن 111 طريقة ، ومع ذلك فقد تم إهمالها الآن لصالح SavedGames ، المضمنة في حزمة ألعاب google-play).