مهارات Android
عرض على GitHubأداة تحليل R8
android skills add --skill r8-analyzerللحصول على أفضل تجربة للمستخدم، عليك تحسين تطبيقك ليكون بأصغر حجم ممكن وأسرع ما يمكن. تعمل أداة تحسين التطبيقات، التي تُعرف باسم R8، على تبسيط تطبيقك من خلال إزالة الرموز والموارد غير المستخدَمة، وإعادة كتابة الرموز لتحسين أداء وقت التشغيل، وغير ذلك. بالنسبة إلى المستخدمين، يعني ذلك ما يلي:
- بدء تشغيل أسرع
- تقليل استخدام الذاكرة
- تحسين أداء العرض ووقت التشغيل
- عدد أقل من أخطاء ANR
نظرة عامة على تحسين R8
تستخدِم أداة R8 عملية متعدّدة المراحل لتحسين حجم تطبيقك وسرعته. تشمل العمليات الرئيسية ما يلي:
تقليص حجم الرموز (يُعرف أيضًا باسم إزالة البيانات غير الضرورية): تحدّد أداة R8 الرموز غير القابلة للوصول وتزيلها من تطبيقك ومن تبعيات المكتبة. من خلال تحليل نقاط دخول تطبيقك (مثل
ActivitiesأوServicesالمحدّدة في ملف البيان)، تنشئ أداة R8 رسمًا بيانيًا للرموز التي تتم الإشارة إليها وتزيل أي رموز لا تتم الإشارة إليها.التحسينات المنطقية: تعيد أداة R8 كتابة الرموز لتحسين كفاءة التنفيذ وتقليل النفقات العامة. تشمل التقنيات الرئيسية ما يلي:
تضمين الأساليب: تستبدل أداة R8 موقع طلب إجراء بالرمز الفعلي للطريقة التي تم استدعاؤها. يزيل ذلك النفقات العامة لاستدعاء دالة ويسمح لأداة R8 بإجراء المزيد من التحسينات.
دمج الفئات: تدمج أداة R8 مجموعات من الفئات والواجهات في فئة واحدة. يقلّل ذلك من عدد الفئات في التطبيق، ما يقلّل من الضغط على الذاكرة ويحسّن سرعة بدء التشغيل.
إخفاء مفاتيح فك التشفير (يُعرف أيضًا باسم إزالة البيانات غير الضرورية): لتقليل حجم ملف DEX ، تختصر أداة R8 أسماء الفئات والحقول والأساليب (على سبيل المثال،
com.example.MyActivityيمكن أن يصبحa.b.a).
بدءًا من الإصدار 8.12.0 من "مكوّن إضافي لنظام Gradle المتوافق مع Android" (AGP)، تحسِّن أداة R8 أيضًا الموارد كجزء من مراحل التحسين. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة تقليص الموارد المحسَّنة.
تفعيل التحسين
لتفعيل تحسين التطبيق، استخدِم لغة DSL المناسبة استنادًا إلى إصدار AGP الخاص بمشروعك. ننصحك بتفعيل تحسين التطبيق فقط في الإصدار النهائي من تطبيقك الذي تختبره قبل نشره، وهو عادةً بنية الإصدار، لأنّ التحسينات تزيد من مدّة تصميم مشروعك ويمكن أن تجعل عملية تصحيح الأخطاء أكثر صعوبة بسبب طريقة تعديل الرموز.
إصدارات AGP 9.3 والإصدارات الأحدث
لتفعيل تحسين التطبيق لإصدار AGP 9.3 والإصدارات الأحدث:
- اضبط
enable = trueفي حزمةoptimizationفي نص برمجة الإصدار على مستوى التطبيق لإصدارك العلني. - أضِف قواعد الاحتفاظ إلى ملف باللاحقة
.keepفي مجموعة رموز المصدرsrc/<variant>/keepRules. على سبيل المثال،src/main/keepRules/custom-rules.keep.
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
أنيق
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
لغة DSL القديمة لإصدارات AGP الأقل من 9.3
لتفعيل تحسين التطبيق، اضبط isMinifyEnabled = true (لتحسين الرموز)
و isShrinkResources = true (لتحسين الموارد) في نص برمجة الإصدار على مستوى التطبيق لإصدارك العلني release
build's. ننصحك دائمًا بتفعيل كلا الإعدادَين.
لغة DSL القديمة (Kotlin)
android {
buildTypes {
release {
// Enables code optimizations.
isMinifyEnabled = true
// Enables resource shrinking.
isShrinkResources = true
proguardFiles(
// Default file with automatically generated optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
...
}
}
...
}
لغة DSL القديمة (أنيق)
android {
buildTypes {
release {
// Enables code optimizations.
minifyEnabled = true
// Enables resource shrinking.
shrinkResources = true
// Default file with automatically generated optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
تحسين تحسين R8
تتعلّق مزايا الأداء التي توفّرها أداة R8 بشكل مباشر بمقدار قاعدة الرموز البرمجية التي يمكن لأداة R8 تحسينها. لتحقيق أقصى استفادة من أداة R8، اتّبِع أفضل الممارسات:
- تفعيل أداة R8 في الوضع الكامل
- تفعيل إخفاء مفاتيح فك التشفير والتحسين والتقليص
- تفعيل تقليص الموارد وتقليص الموارد المحسَّنة
- تحسين قواعد الاحتفاظ للسماح بأقصى قدر من التحسين للفئات والحقول و الأساليب.
لمساعدتك في تحسين قواعد الاحتفاظ، استخدِم أداة تحليل إعدادات R8.
تتيح لك أداة تحليل إعدادات R8 إجراء ما يلي:
- تتبُّع جودة إعدادات R8 العامة وتحسينها من خلال مراقبة المقاييس التي يقدّمها تقرير أداة تحليل إعدادات R8.
- العثور على قواعد الاحتفاظ الأوسع نطاقًا، وهي القواعد التي تمنع أكبر قدر من التحسين
- وفهم التحسين الذي تمنعه هذه القواعد لتحسينها.
تتوفّر أداة تحليل إعدادات R8 في الإصدار 9.3.0-alpha05 من "مكوّن Android الإضافي لنظام Gradle" أو من الإصدار 9.3.7-dev من R8. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة تحليل إعدادات R8.
تحسين تقليص الموارد لإنشاء تطبيقات أصغر حجمًا
يقدّم الإصدار 8.12.0 من "مكوّن Android الإضافي لنظام Gradle" ميزة تقليص الموارد المحسَّنة، التي تهدف إلى دمج تحسين الموارد والرموز لإنشاء تطبيقات أصغر حجمًا وأسرع. قبل تقليص الموارد المحسَّنة، كانت أداة Android Asset Packaging Tool (AAPT2) تنشئ قواعد الاحتفاظ التي تعامل تقليص الموارد بشكل منفصل عن الرموز، وغالبًا ما كانت تحتفظ بالرموز أو الموارد التي لا يمكن الوصول إليها والتي تشير إلى بعضها البعض.
باستخدام تقليص الموارد المحسَّنة، تُعتبر الموارد جزءًا من رمز البرنامج، ما يشكّل الرسم البياني للمراجع. عندما لا تتم الإشارة إلى مجموعة من الرموز أو الموارد، لا تتم حمايتها بواسطة قاعدة الاحتفاظ، ويمكن إزالتها.
تفعيل تقليص الموارد المحسَّنة
لتفعيل مسار تقليص الموارد المحسَّنة الجديد لإصدار AGP 8.12 أو 8.13، أضِف ما يلي إلى ملف gradle.properties الخاص بمشروعك:
إذا كنت تستخدم الإصدار 9.0.0 من "مكوّن Android الإضافي لنظام Gradle" أو إصدارًا أحدث، ليس عليك ضبط android.r8.optimizedResourceShrinking=true. يتم تطبيق تقليص الموارد المحسَّنة تلقائيًا عند تفعيل isShrinkResources = true في إعدادات الإصدار.
التحقّق من إعدادات تحسين R8 وضبطها
لتفعيل أداة R8 لاستخدام إمكانات التحسين الكاملة، أزِل السطر
التالي من ملف gradle.properties الخاص بمشروعك، إذا كان موجودًا:
bash android.enableR8.fullMode=false # Remove this line from your codebase.
يُرجى العِلم أنّ تفعيل تحسين التطبيق يجعل من الصعب فهم تتبُّع تسلسل استدعاء الدوال، خاصةً إذا أعادت أداة R8 تسمية أسماء الفئات أو الأساليب. للحصول على تتبُّع تسلسل استدعاء الدوال الذي يتطابق بشكل صحيح مع رمز المصدر، يُرجى الاطّلاع على مقالة استرداد تتبُّع تسلسل استدعاء الدوال الأصلي.
إذا كانت أداة R8 مفعّلة، عليك أيضًا إنشاء ملفات شخصية لبدء التشغيل للحصول على أداء أفضل عند بدء التشغيل.
إذا فعّلت تحسين التطبيق وظهرت أخطاء، إليك بعض الاستراتيجيات لإصلاحها:
- أضِف قواعد الاحتفاظ للحفاظ على بعض الرموز بدون تغيير.
- طبِّق التحسينات بشكل تدريجي.
- عدِّل الرموز لاستخدام مكتبات أفضل ملاءمة للتحسين.
إذا كنت مهتمًا بتحسين سرعة الإصدار، يُرجى الاطّلاع على مقالة ضبط طريقة تشغيل أداة R8 للحصول على معلومات عن كيفية ضبط أداة R8 استنادًا إلى بيئتك.
تغييرات في سلوك إصدارات "مكوّن Android الإضافي لنظام Gradle" وأداة R8
يُوضّح الجدول التالي الميزات الرئيسية التي تم تقديمها في إصدارات مختلفة من "مكوّن إضافي لنظام Gradle المتوافق مع Android" (AGP) وبرنامج تجميع R8.
| إصدار "مكوّن Android الإضافي لنظام Gradle" | الميزات التي تم تقديمها |
|---|---|
| 9.3 |
لغة DSL مبسطة: تتيح حزمة `optimization {}` الجديدة إجراء إعدادات أقل، وتكون ميزة تقليص الموارد المحسَّنة مفعّلة دائمًا، وتكون قواعد الاحتفاظ التلقائية لنظام Android غير مفعّلة.
مجموعة رموز المصدر`keepRules`: إذا كنت تستخدم لغة DSL الجديدة، عليك وضع قواعد الاحتفاظ في مجموعة رموز المصدر src/<variant>/keepRules، في ملفات باللاحقة .keep. تتوافق مجموعات رموز المصدر أيضًا مع لغة DSL القديمة.
قواعد المستهلك في KMP (Kotlin MultiPlatform): لم يعُد KMP يتطلّب ضبط publish = true، ويتوافق مع مجموعة رموز المصدر src/<variant>/keepRules بالامتداد .keep.
يُرجى العِلم أنّ لغة DSL القديمة لا تزال متوافقة. |
| 9.1 |
إعادة تجميع الفئات تلقائيًا: تعيد أداة R8 تجميع الفئات (نقلها إلى الحزمة بدون اسم، في المستوى الأعلى) لضغط ملف DEX بشكل أكبر، ما يزيل الحاجة إلى تحديد الخيار -repackageclasses. لمعرفة معلومات عن طريقة عمل ذلك وكيفية إيقافه، يُرجى الاطّلاع على الخيارات العامة.
|
| 9.0 |
تقليص الموارد المحسَّنة: مفعّلة تلقائيًا (يمكن التحكّم فيها باستخدام android.r8.optimizedResourceShrinking). تساعد ميزة تقليص الموارد المحسَّنة في دمج تقليص الموارد مع مسار تحسين الرموز، ما يؤدي إلى إنشاء تطبيقات أصغر حجمًا وأسرع. من خلال تحسين مراجع الرموز والموارد في الوقت نفسه، تحدّد هذه الميزة الموارد التي تتم الإشارة إليها حصريًا من الرموز غير المستخدَمة وتزيلها. يمثّل ذلك تحسينًا كبيرًا مقارنةً بعمليات التحسين المنفصلة السابقة.ويُعدّ ذلك مفيدًا بشكل خاص للتطبيقات التي تشارك موارد ورموزًا كبيرة عبر أشكال مختلفة، مع تحسينات تم قياسها تزيد عن% 50 في حجم التطبيق. يؤدي تقليل الحجم الناتج إلى عمليات تنزيل أصغر وتثبيتات أسرع وتجربة أفضل للمستخدم مع بدء تشغيل أسرع وعرض محسَّن وعدد أقل من أخطاء ANR. فلترة قواعد المكتبة: تم إيقاف دعم الخيارات العامة (على سبيل المثال، -dontobfuscate) في قواعد المستهلك في المكتبة، وستفلترها التطبيقات. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة إضافة خيارات عامة.عمليات التحقّق من القيم الخالية في Kotlin: يتم تحسينها تلقائيًا (يمكن التحكّم فيها باستخدام -processkotlinnullchecks). قدّم هذا الإصدار أيضًا تحسينات كبيرة في سرعة الإصدار. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة الخيارات العامة للتحسين الإضافي.تحسين حِزم معيّنة: يمكنك استخدام packageScope لتحسين حِزم معيّنة. هذه الميزة تجريبية. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة تحسين حِزم معيّنة باستخدام packageScope.التحسين تلقائيًا: تم إيقاف دعم getDefaultProguardFile("proguard-android.txt")، لأنّه يتضمّن -dontoptimize، الذي يجب تجنُّبه. بدلاً من ذلك، استخدِم "proguard-android-optimize.txt". إذا كنت بحاجة إلى إيقاف التحسين على مستوى التطبيق، أضِف العلامة يدويًا إلى ملف Proguard.
|
| 8.12 |
تقليص الموارد المحسَّنة: تمت إضافة الدعم الأوّلي (يمكن التحكّم فيه باستخدام android.r8.optimizedResourceShrinking). تساعد ميزة تقليص الموارد المحسَّنة في دمج تقليص الموارد مع مسار تحسين الرموز. عليك تفعيلها يدويًا في هذا الإصدار من "مكوّن Android الإضافي لنظام Gradle".إعادة تتبُّع Logcat: تمت إضافة دعم إعادة التتبُّع التلقائي في نافذة Logcat في "استوديو Android". |
| 8.6 |
إعادة تتبُّع محسَّنة: تتضمّن إعادة تتبُّع اسم الملف ورقم السطر تلقائيًا لجميع مستويات minSdk (كانت تتطلّب سابقًا minSdk 26 أو أعلى في الإصدار 8.2).يساعد تحديث أداة R8 في ضمان إمكانية قراءة تتبُّع تسلسل استدعاء الدوال من عمليات الإصدار التي تم إخفاء مفاتيح فك تشفيرها بسهولة ووضوح. يحسّن هذا الإصدار طريقة ربط أرقام الأسطر وملفات المصدر، ما يسهّل على أدوات مثل Logcat في "استوديو Android" إعادة تتبُّع الأعطال تلقائيًا إلى رمز المصدر الأصلي. |
| من نظام التشغيل Android |
الوضع الكامل تلقائيًا: يوفّر الوضع الكامل في أداة R8 تحسينًا أقوى بكثير. ويكون مفعّلاً تلقائيًا. يمكنك إيقافه باستخدام android.enableR8.fullMode=false.
|
| 7 |
الوضع الكامل متاح: تم تقديمه كميزة اختيارية باستخدام android.enableR8.fullMode=true. يطبّق الوضع الكامل تحسينات أقوى من خلال وضع افتراضات أكثر صرامة حول كيفية استخدام الرمز للانعكاس والميزات الديناميكية الأخرى. على الرغم من أنّه يقلّل من حجم التطبيق ويحسّن الأداء، قد يتطلّب قواعد احتفاظ إضافية لمنع إزالة الرموز الضرورية.
|