تقليل حجم تطبيقك

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

تحميل تطبيقك باستخدام مجموعات حزمات تطبيق Android

يجب تحميل تطبيقك بتنسيق مجموعة حزمات تطبيق Android إلى التطبيق على الفور. حفظ حجم التطبيق عند نشره على Google Play "مجموعة حزمات تطبيق Android" هي تنسيق تحميل يتضمّن جميع الرموز والموارد التي تم تجميعها لتطبيقك ولكنها تؤخر إنشاء ملفات APK وتسجيل الدخول إليها في Google Play.

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

يفرض Google Play تنزيلًا مضغوطًا قيد الحجم بمقدار 200 ميغابايت للتطبيقات التي يتم نشرها باستخدام حِزم التطبيقات. أحجام أكبر باستخدام ميزتَي "عرض الميزات في Play" و"عرض المواد في Play"، ولكن يمكن أن تؤدي زيادة حجم التطبيق أن تؤثر سلبًا في نجاح عمليات التثبيت وتزيد عمليات إلغاء التثبيت، لذا ننصحك بتطبيق الإرشادات الموضّحة في هذه الصفحة لخفض حجم تنزيل التطبيق قدر الإمكان.

التعرّف على بنية APK

قبل تقليل حجم تطبيقك، من المفيد فهم بنية ملف APK للتطبيق. يتألّف ملف APK من أرشيف ZIP يحتوي على جميع الملفات التي تتضمّن تطبيقك. هذه ملفات فئة Java وملفات الموارد وملفًا يحتوي على موارد مجمعة.

تحتوي حزمة APK على الأدلة التالية:

  • META-INF/: يحتوي على التوقيعين CERT.SF وCERT.RSA بالإضافة إلى ملف البيان MANIFEST.MF.
  • assets/: يحتوي على أصول التطبيق، والتي يمكن للتطبيق استردادها باستخدام AssetManager الخاص بك.
  • res/: يحتوي على موارد لم يتم تجميعها في resources.arsc
  • lib/: يحتوي على الرمز البرمجي الخاص بطبقة البرنامج معالج البيانات. يحتوي هذا الدليل على دليل فرعي لكل نوع من أنواع المنصات، مثل "armeabi" و"armeabi-v7a" و"arm64-v8a" و"x86" x86_64، وmips.

تحتوي حزمة APK أيضًا على الملفات التالية. فقط AndroidManifest.xml إلزامية:

  • resources.arsc: يحتوي على موارد مجمّعة. يحتوي هذا الملف على محتوى XML. من جميع إعدادات المجلد res/values/. تستخرج أداة التغليف هذا تنسيق XML، وتحويله إلى نموذج ثنائي، وأرشفة المحتوى. يشمل هذا المحتوى اللغة. والسلاسل والأنماط، بالإضافة إلى المسارات إلى المحتوى التي لا يتم تضمينها مباشرةً في resources.arsc، مثل ملفات التنسيق والصور.
  • classes.dex: يحتوي على الفئات التي تم تجميعها بتنسيق ملف DEX الذي يفهمه الجهاز الافتراضي Dalvik أو ART.
  • AndroidManifest.xml: يحتوي على ملف بيان Android الأساسي. يسرد هذا الملف الاسم وإصداره وحقوق الوصول إليه وملفات المكتبة المرجعية للتطبيق. يستخدم الملف واجهة برمجة تطبيقات تنسيق XML الثنائي.

تقليل عدد الموارد وحجمها

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

إزالة الموارد غير المستخدَمة

أداة lint: أداة لتحليل الرموز البرمجية الثابتة مضمّنة في "استوديو Android": ترصد الموارد في مجلد res/ التي لا يشير إليه. عندما تكتشف أداة lint موردًا يُحتمل أن يكون غير مستخدم في فإنها تطبع رسالة مثل المثال التالي:

res/layout/preferences.xml: Warning: The resource R.layout.preferences appears
    to be unused [UnusedResources]

قد تتضمن المكتبات التي تضيفها إلى التعليمة البرمجية موارد غير مستخدمة. يمكن لنظام Gradle التلقائي إزالة الموارد نيابةً عنك في حال تفعيل الميزة shrinkResources في ملف build.gradle.kts للتطبيق.

Kotlin

android {
    // Other settings.

    buildTypes {
        getByName("release") {
            minifyEnabled = true
            shrinkResources = true
            proguardFiles(getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro")
        }
    }
}

Groovy

android {
    // Other settings.

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

لاستخدام shrinkResources، عليك تفعيل تقليص الرموز. أثناء عملية التصميم، يكون R8 أولاً لإزالة الرمز البرمجي غير المستخدَم بعد ذلك، يزيل المكوّن الإضافي لنظام Gradle المتوافق مع Android الموارد غير المستخدَمة.

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

في الإصدار 7.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android والإصدارات الأحدث، يمكنك توضيح الإعدادات التي ضبطها تطبيقك. والدعم. يقوم Gradle بتمرير هذه المعلومات إلى نظام التصميم باستخدام resourceConfigurations النكهة وخيار defaultConfig. ثم يمنع نظام التصميم الموارد من ظهور إعدادات أخرى غير متوافقة في حزمة APK، ما يقلّل من حجم حِزمة APK. لمزيد من المعلومات، المعلومات حول هذه الميزة، راجع إزالة البديل غير المستخدَم الموارد

تقليل استخدام الموارد من المكتبات

عند تطوير تطبيق Android، يتم عادةً استخدام مكتبات خارجية لتحسين مستوى سهولة الاستخدام والتنوع. على سبيل المثال، يمكنك الرجوع إلى AndroidX لتحسين تجربة المستخدم على الأجهزة السابقة، أو يمكنك استخدام لاسترداد خدمات Google Play الترجمات التلقائية للنصوص داخل تطبيقك

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

فك ترميز الصور المتحركة الأصلية

وفي Android 12 (المستوى 31)، يحدد NDK تم توسيع واجهة برمجة التطبيقات ImageDecoder لفك ترميزها. جميع الإطارات وبيانات التوقيت من الصور التي تستخدم صور GIF المتحركة وتنسيقات ملفات WebP المتحركة.

يمكنك استخدام ImageDecoder بدلاً من مكتبات الجهات الخارجية لإجراء المزيد من المهام تقليل حجم APK والاستفادة من الميزات المستقبلية التحديثات المتعلقة بالأمان والأداء.

لمزيد من التفاصيل حول واجهة برمجة تطبيقات ImageDecoder، يمكنك الاطّلاع على API reference و عيّنة على GitHub.

إتاحة استخدام كثافات معيّنة فقط

يتوافق Android مع كثافات الشاشة المختلفة، على سبيل المثال ما يلي:

  • ldpi
  • mdpi
  • tvdpi
  • hdpi
  • xhdpi
  • xxhdpi
  • xxxhdpi

على الرغم من دعم Android الكثافات السابقة، لا تحتاج إلى تصدير البيانات النقطية الأصول لكل كثافة.

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

إذا كان تطبيقك يحتاج فقط إلى صور بأحجام مختلفة، يمكنك توفير مساحة أكبر من خلال توفُّر خيار واحد من صورة في drawable-nodpi/. ننصحك بتضمين xxhdpi على الأقل. نسخة الصورة في تطبيقك

لمزيد من المعلومات عن كثافة الشاشة، يُرجى الاطّلاع على أحجام الشاشة وكثافاتها:

استخدام عناصر قابلة للرسم

لا تتطلب بعض الصور مورد صور ثابتة. يمكن أن يرسم إطار العمل الصورة بشكل ديناميكي في وقت التشغيل بدلاً من ذلك Drawable عنصرًا - أو <shape> بوصة XML: يمكن أن يشغل مساحة صغيرة في حزمة APK. بالإضافة إلى ذلك، يمكن استخدام XML Drawable. تنتج صورًا أحادية اللون متوافقة مع إرشادات التصميم المتعدد الأبعاد.

إعادة استخدام المراجع

يمكنك تضمين مورد منفصل لأشكال الصورة، مثلاً درجة اللون أو المظللة أو نُسخ يتم تدويرها من الصورة نفسها. ومع ذلك، ننصحك بإعادة استخدام مجموعة الموارد نفسها. وتخصيصها حسب الحاجة في وقت التشغيل

يوفر Android العديد من الأدوات المساعدة لتغيير لون أحد الأصول، سواء باستخدام السمتان android:tint وtintMode

ويمكنك أيضًا حذف الموارد التي لا تمثل سوى مكافئ تم تدويره لمورد آخر. ما يلي: مقتطف الرمز مثالاً على "التحسين" إلى الهدوء من خلال التركيز على منتصف الصورة وتدويرها 180 درجة:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_thumb_up"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fromDegrees="180" />

العرض من الرمز

يمكنك أيضًا تقليل حجم APK من خلال عرض الصور تدريجيًا. العرض الإجرائي إخلاء بعض المساحة لأنّك لم تعُد تخزّن ملف صورة في حِزمة APK.

معالجة ملفات PNG

يمكن لأداة aapt تحسين موارد الصور الموضوعة في res/drawable/. مع الضغط بدون فقدان البيانات أثناء عملية التصميم. على سبيل المثال، يمكن للأداة aapt تحويل ملف PNG باللون الحقيقي الذي لا يتطلب أكثر من 256 لونًا إلى صورة PNG 8 بت مع لون اللوحة. ينتج عن ذلك الحصول على صورة بجودة متساوية لكن مع مساحة أصغر للذاكرة.

تخضع "aapt" للقيود التالية:

  • لا تقلّص أداة aapt ملفات PNG المضمّنة في asset/. المجلد.
  • يجب أن تستخدم ملفات الصور 256 لونًا أو أقل في أداة aapt لإجراء التحسين. معهم.
  • قد تعمل أداة aapt على تضخيم ملفات PNG المضغوطة مسبقًا. لمنع التالي، يمكنك استخدام العلامة isCrunchPngs لإيقاف هذه العملية لملفات PNG:
  • Kotlin

        buildTypes.all { isCrunchPngs = false }
        

    Groovy

        buildTypes.all { isCrunchPngs = false }
        

ضغط ملفات PNG وJPEG

يمكنك تقليل أحجام ملفات PNG بدون فقدان جودة الصورة باستخدام أدوات مثل pngcrush pngquant أو zopflipng. كل هذه الأدوات إلى تقليل حجم ملف PNG مع الحفاظ على جودة الصورة الإدراكية.

أداة pngcrush فعالة بشكل خاص. تتكرر هذه الأداة على فلاتر PNG zlib (Deflate)، باستخدام كل مجموعة من الفلاتر والمعلمات لضغط الصورة. ثم تختار التكوين الذي ينتج عنه أصغر إخراج مضغوط.

لضغط ملفات JPEG، يمكنك استخدام أدوات مثل packJPG وguetzli.

استخدام تنسيق ملف WebP

بدلاً من استخدام ملفات PNG أو JPEG، يمكنك أيضًا استخدام تنسيق ملف WebP لصورك. تنسيق WebP يوفر الضغط مع فقدان البيانات والشفافية، مثل JPG وPNG، ويمكن أن يوفر ضغطًا من تنسيق JPEG أو PNG.

يمكنك تحويل صور BMP أو JPG أو PNG أو GIF ثابتة إلى تنسيق WebP باستخدام "استوديو Android". لمعرفة مزيد من المعلومات، يُرجى الاطّلاع على إنشاء صور WebP.

استخدام الرسومات المتجهة

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

ومع ذلك، يستغرق النظام وقتًا أطول بكثير لعرض كل عنصر VectorDrawable، وستستغرق الصور الأكبر حجمًا وقتًا أطول للظهور على الشاشة. لذلك، ضع في اعتبارك استخدام هذه الرسومات المتجهة فقط عند عرض الصور الصغيرة.

لمزيد من المعلومات حول التعامل مع عناصر VectorDrawable، يُرجى الاطّلاع على المستندات القابلة للرسم:

استخدام الرسومات المتّجهة للصور المتحركة

عدم الاستخدام AnimationDrawable إنشاء رسوم متحركة على أساس كل إطار، لأن ذلك يتطلب تضمين صورة نقطية منفصلة لكل إطار من الصور المتحركة، مما يؤدي إلى زيادة حجم APK بشكلٍ كبير.

بدلاً من ذلك، استخدم AnimatedVectorDrawableCompat لإنشاء متّجه متحرك القابلة للرسم.

تقليل الرموز البرمجية الأصلية ولغة Java

يمكنك استخدام الطرق التالية لتقليل حجم جافا وقاعدة التعليمات البرمجية الأصلية في التطبيق.

إزالة الرمز الذي تم إنشاؤه غير الضروري

يمكنك التعرّف على تأثير أي رمز يتم إنشاؤه تلقائيًا. على سبيل المثال: العديد من أدوات التخزين المؤقت للبروتوكولات تنشئ عددًا كبيرًا من الأساليب والفئات، مما قد يؤدي إلى مضاعفة زيادة حجم تطبيقك بمقدار ثلاثة أضعاف

تجنُّب التعداد

يمكن أن يضيف تعداد واحد حوالي 1.0 إلى 1.4 كيلوبايت إلى ملف classes.dex لتطبيقك. هذه يمكن أن تتراكم الإضافات بسرعة للأنظمة المعقدة أو المكتبات المشتركة. إذا أمكن، ضع في اعتبارك باستخدام تعليق @IntDef التوضيحي وتقليص الرموز لإزالة التعدادات وتحويلها إلى أعداد صحيحة. يحافظ هذا النوع من الإحالات الناجحة على كل الكتابة وفوائد السلامة للتعدادات.

تقليل حجم البرامج الثنائية الأصلية

إذا كان تطبيقك يستخدم رمزًا برمجيًا أصليًا والإصدار Android NDK، يمكنك أيضًا تقليل حجم الإصدار من تطبيقك من خلال تحسين الرمز. هناك أسلوبان مفيدان هما إزالة رموز تصحيح الأخطاء عدم استخراج المكتبات الأصلية.

إزالة رموز تصحيح الأخطاء

من المنطقي استخدام رموز تصحيح الأخطاء إذا كان تطبيقك قيد التطوير ولا يزال يتطلّب تصحيح الأخطاء. استخدام أداة arm-eabi-strip المتوفّرة في Android NDK لإزالة تصحيح الأخطاء غير الضروري والرموز من المكتبات الأصلية. بعد ذلك، يمكنك تجميع بنية الإصدار.

تجنُّب استخراج المكتبات المجمّعة من رموز برمجية أصلية

عند إنشاء إصدار الإصدار من تطبيقك، يمكنك تجميع ملفات .so غير مضغوطة في حزمة APK حسب الإعداد useLegacyPackaging إلى false في ملف build.gradle.kts بتطبيقك. يؤدي إيقاف هذه العلامة إلى منع PackageManager من نسخ .so ملف من حزمة APK إلى نظام الملفات أثناء التثبيت. هذه الطريقة تجعل حجم تحديثات التطبيق.

الاحتفاظ بحِزم APK متعددة

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

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

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

لمزيد من المعلومات، راجع إنشاء عناصر متعددة حِزم APK وإتاحة حِزم APK متعددة.