يسهّل Baseline Profile Gradle Plugin إنشاء ملفات Baseline Profile والحفاظ عليها. تساعدك هذه الميزة في تنفيذ المهام التالية:
- إنشاء ملفات Baseline جديدة لتطبيقك
- إنشاء ملفات Baseline جديدة لمكتبتك
- تخصيص عملية إنشاء Baseline Profile
توضّح هذه الصفحة كيفية استخدام مكوّن Baseline Profile الإضافي في Gradle لتخصيص عملية إنشاء ملفات Baseline Profile.
متطلبات المكوّن الإضافي
- الإصدار 8.0 من "مكوّن Android الإضافي لبرنامج Gradle" أو إصدار أحدث
- الاعتماد على أحدث إصدار من المكوّن الإضافي لنظام Gradle
استخدام "الأجهزة المُدارة من Gradle" لإنشاء "ملفات تعريف Baseline"
لاستخدام جهاز افتراضي مُدار من Gradle (GMD) من أجل إنشاء "الملف الأساسي"، أضِف جهازًا في إعداد build.gradle.kts
لوحدة إنشاء الملفات الشخصية، والتي من المحتمل أن تكون وحدة اختبار :baselineprofile
، كما هو موضّح في المثال التالي:
Kotlin
android { testOptions.managedDevices.devices { create<com.android.build.api.dsl.ManagedVirtualDevice>("pixel6Api31") { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } }
Groovy
android { testOptions.managedDevices.devices { pixel6Api31(ManagedVirtualDevice) { device 'Pixel 6' apiLevel = 31 systemImageSource 'aosp' } } }
استخدِم أداة GMD لإنشاء "ملفات تعريف الأداء الأساسية" من خلال إضافتها إلى إعدادات إضافة Gradle الخاصة بـ "ملف تعريف الأداء الأساسي" على النحو التالي، في build.gradle.kts
من وحدة اختبار :baselineprofile
:
Kotlin
baselineProfile { managedDevices += "pixel6Api31" }
Groovy
baselineProfile { managedDevices = ['pixel6Api31'] }
عند استخدام GMD لإنشاء ملفات Baseline Profiles، اضبط useConnectedDevices
على
false
في وحدة اختبار :baselineprofile
:
Kotlin
baselineProfile { ... useConnectedDevices = false }
Groovy
baselineProfile { ... useConnectedDevices false }
إنشاء ملفات Baseline Profile لصيغ مختلفة
يمكنك إنشاء ملفات Baseline Profiles لكل صيغة أو لكل إصدار أو كملف واحد
لاستخدامه مع جميع الصيغ. يمكنك التحكّم في هذا السلوك من خلال إعداد الدمج، كما هو موضّح في المثال التالي، في build.gradle.kts
من تطبيق أو وحدة مكتبة.
Kotlin
baselineProfile { mergeIntoMain = true }
Groovy
baselineProfile { mergeIntoMain true }
لدمج الملفات الشخصية التي تم إنشاؤها لجميع صيغ المنتج في ملف شخصي واحد، اضبط
mergeIntoMain
على true
. لا يمكن إنشاء ملفات Baseline
Profiles لكل صيغة عند ضبط هذا الإعداد على true
، لذا يتوفّر مهمة Gradle واحدة باسم
generateBaselineProfile
. يتم إخراج الملف الشخصي في
src/main/generated/baselineProfiles
.
لإيقاف الدمج والحصول على ملف واحد لكل صيغة، اضبط قيمة mergeIntoMain
على false
. في هذه الحالة، تتوفّر مهام Gradle متعددة خاصة بمتغيرات الإصدار. على سبيل المثال، عندما يكون هناك إصداران، مثل الإصدار المجاني والإصدار المدفوع، ونوع واحد من إصدارات البناء، تكون المهام على النحو التالي:
* `generateFreeReleaseBaselineProfile`
* `generatePaidReleaseBaselineProfile`
* `generateReleaseBaselineProfile`
لتحديد سلوك الدمج لكل صيغة، استخدِم الرمز التالي:
Kotlin
baselineProfile { variants { freeRelease { mergeIntoMain = true } } }
Groovy
baselineProfile { variants { freeRelease { mergeIntoMain true } } }
في المثال السابق، يتم دمج جميع المتغيرات التي تم ضبط العلامة فيها على true
في src/main/generated/baselineProfiles
، بينما يتم الاحتفاظ بملفات المتغيرات التي تم ضبط العلامة فيها على false
في المجلد src/<variant>/generated/baselineProfiles
.
يتم ضبط mergeIntoMain
تلقائيًا على true
للمكتبات وfalse
للتطبيقات.
إنشاء "ملفات تعريف الخط الأساس" تلقائيًا عند تجميع إصدار جديد
يمكنك ضبط "ملفات تعريف خط الأساس" ليتم إنشاؤها تلقائيًا مع كل إصدار
من الإصدارات، بدلاً من استخدام مهمة generateBaselineProfile
يدويًا. باستخدام ميزة الإنشاء التلقائي، يتم تضمين أحدث ملف شخصي في إصدار التطبيق.
لتفعيل الإنشاء التلقائي لإصدارات التطبيق، استخدِم العلامة
automaticGenerationDuringBuild
:
Kotlin
baselineProfile { automaticGenerationDuringBuild = true }
Groovy
baselineProfile { automaticGenerationDuringBuild true }
يؤدي ضبط العلامة automaticGenerationDuringBuild
على true
إلى بدء إنشاء ملف تعريف أساسي جديد لكل حزمة إصدار. وهذا يعني أنّ تنفيذ مهمة إنشاء إصدار تجميعي، مثل ./gradlew:app:assembleRelease
، يؤدي أيضًا إلى تشغيل :app:generateReleaseBaselineProfile
وبدء اختبارات الأجهزة لملف Baseline Profile وإنشاء إصدار ملف Baseline Profile الذي يتم تشغيل الاختبارات عليه.
على الرغم من أنّ ميزة الإنشاء التلقائي تساعد المستخدمين في تحقيق أفضل أداء، إلا أنّها تزيد أيضًا من وقت الإنشاء بسبب الإنشاء المزدوج واختبارات الأدوات.
يمكنك أيضًا تحديد هذا السلوك لكل خيار منتج، كما هو موضّح في المثال التالي:
Kotlin
baselineProfile { variants { freeRelease { automaticGenerationDuringBuild = true } } }
Groovy
baselineProfile { variants { freeRelease { automaticGenerationDuringBuild true } } }
في المثال السابق، يتم تنفيذ المهمة generateFreeReleaseBaselineProfile
عند بدء assembleFreeRelease
. ويكون ذلك مفيدًا عندما يريد المستخدم، على سبيل المثال، إنشاء release
لإصدار التوزيع الذي ينشئ الملف الشخصي دائمًا عند الإنشاء، وإنشاء releaseWithoutProfile
للاختبار الداخلي.
بدلاً من إضافة صيغة جديدة بدون ملف Baseline Profile، يمكنك أيضًا إيقاف إنشاء الملف من سطر الأوامر على النحو التالي:
./gradlew assembleRelease -Pandroid.baselineProfile.automaticGenerationDuringBuild=false
تخزين ملفات تعريف المرجع في المصادر
يمكنك تخزين ملفات Baseline Profiles في دليل المصدر من خلال العلامة saveInSrc
في build.gradle.kts
لوحدة التطبيق أو المكتبة:
true
: يتم تخزين "ملف المرجع" فيsrc/<variant>/generated/baselineProfiles
. يتيح لك ذلك إرسال أحدث ملف شخصي تم إنشاؤه مع المستندات المصدر.-
false
: يتم تخزين Baseline Profile في الملفات الوسيطة في دليل الإنشاء. بهذه الطريقة، عند إرسال الرمز البرمجي، لن يتم حفظ أحدث ملف شخصي تم إنشاؤه.
Kotlin
baselineProfile { saveInSrc = true }
Groovy
baselineProfile { saveInSrc true }
يمكنك أيضًا تحديد هذا السلوك لكل خيار منتج:
Kotlin
baselineProfile { variants { freeRelease { saveInSrc = true } } }
Groovy
baselineProfile { variants { freeRelease { saveInSrc true } } }
إيقاف التحذيرات
تلقائيًا، يحذّرك Baseline Profile Gradle Plugin من الحالات التي قد تتسبّب في حدوث مشاكل. لإيقاف التحذيرات، يمكنك ضبط الخيار ذي الصلة على
false
في ملف build.gradle.kts
. في ما يلي خيارات التحذير:
baselineProfile {
warnings {
/**
* Warn when the Android Gradle Plugin version is higher than the max
* tested one.
*/
maxAgpVersion = true
/**
* Warn when a benchmark or baseline profile variant has been disabled.
*/
disabledVariants = true
/**
* Warn that running `generateBaselineProfile` with AGP 8.0 doesn't
* support running instrumentation tests for multiple build types at
* once.
*/
multipleBuildTypesWithAgp80 = true
/**
* Warn when no baseline profiles are generated after running the
* generate baseline profile command.
*/
noBaselineProfileRulesGenerated = true
/**
* Warn when no startup profiles are generated after running the generate
* baseline profile command.
*/
noStartupProfileRulesGenerated = true
}
}
فلترة قواعد الملف الشخصي
تتيح لك إضافة Baseline Profile Gradle فلترة قواعد Baseline Profile التي تم إنشاؤها. ويكون ذلك مفيدًا بشكل خاص للمكتبات إذا أردت استبعاد قواعد الملف الشخصي للفئات والطرق التي تشكّل جزءًا من التبعيات الأخرى لتطبيق العيّنة أو المكتبة نفسها. يمكن أن تتضمّن الفلاتر حِزمًا وفئات معيّنة أو تستبعدها. عند تحديد عمليات الاستبعاد فقط، يتم استبعاد قواعد ملفات تعريف خط الأساس المطابقة فقط، ويتم تضمين كل شيء آخر.
يمكن أن تكون مواصفات الفلاتر أيًّا ممّا يلي:
- اسم الحزمة الذي ينتهي بحرفَي بدل مزدوجَين لمطابقة الحزمة المحدّدة وجميع الحِزم الفرعية على سبيل المثال، تتطابق
com.example.**
معcom.example.method
وcom.example.method.bar
. - اسم الحزمة الذي ينتهي بحرف بدل لمطابقة الحزمة المحدّدة فقط على سبيل المثال، يتطابق
com.example.*
معcom.example.method
ولكن لا يتطابق معcom.example.method.bar
. - أسماء الفئات التي يجب مطابقتها مع فئة معيّنة، مثل
com.example.MyClass
توضّح الأمثلة التالية كيفية تضمين حِزم معيّنة واستبعادها:
Kotlin
baselineProfile { filter { include("com.somelibrary.widget.grid.**") exclude("com.somelibrary.widget.grid.debug.**") include("com.somelibrary.widget.list.**") exclude("com.somelibrary.widget.list.debug.**") include("com.somelibrary.widget.text.**") exclude("com.somelibrary.widget.text.debug.**") } }
Groovy
baselineProfile { filter { include 'com.somelibrary.widget.grid.**' exclude 'com.somelibrary.widget.grid.debug.**' include 'com.somelibrary.widget.list.**' exclude 'com.somelibrary.widget.list.debug.**' include 'com.somelibrary.widget.text.**' exclude 'com.somelibrary.widget.text.debug.**' } }
خصِّص قواعد الفلتر للخيارات المختلفة على النحو التالي:
Kotlin
// Non-specific filters applied to all the variants. baselineProfile { filter { include("com.myapp.**") } } // Flavor-specific filters. baselineProfile { variants { free { filter { include("com.myapp.free.**") } } paid { filter { include("com.myapp.paid.**") } } } } // Build-type-specific filters. baselineProfile { variants { release { filter { include("com.myapp.**") } } } } // Variant-specific filters. baselineProfile { variants { freeRelease { filter { include("com.myapp.**") } } } }
Groovy
// Non-specific filters applied to all the variants. baselineProfile { filter { include 'com.myapp.**' } } // Flavor-specific filters. baselineProfile { variants { free { filter { include 'com.myapp.free.**' } } paid { filter { include 'com.myapp.paid.**' } } } } // Build-type specific filters. baselineProfile { variants { release { filter { include 'com.myapp.**' } } } } // Variant-specific filters. baselineProfile { variants { freeRelease { filter { include 'com.myapp.**' } } } }
يمكنك أيضًا فلترة القواعد باستخدام وسيطة filterPredicate
في BaselineProfileRule.collect()
، ولكن ننصحك باستخدام إضافة Gradle للفلترة لأنّها توفّر طريقة أبسط لفلترة الحِزم الفرعية ومكانًا واحدًا لإعداد الوحدة بأكملها.
تخصيص أنواع الإصدارات في مقياس الأداء وملف Baseline Profile
ينشئ مكوّن Baseline Profile الإضافي في Gradle أنواعًا إضافية من الإصدارات لإنشاء الملفات الشخصية وتشغيل مقاييس الأداء. يتم وضع البادئة benchmark
وnonMinified
لأنواع الإصدارات هذه. على سبيل المثال، بالنسبة إلى release
نوع الإصدار، ينشئ المكوّن الإضافي نوعَي الإصدار benchmarkRelease
وnonMinifiedRelease
.
يتم ضبط أنواع الإصدارات هذه تلقائيًا لحالة الاستخدام المحدّدة، ولا تحتاج عادةً إلى أي تخصيص. ومع ذلك، هناك بعض الحالات التي قد يكون فيها من المفيد تطبيق بعض الخيارات المخصّصة، مثل تطبيق إعدادات توقيع مختلفة.
يمكنك تخصيص أنواع الإصدارات التي يتم إنشاؤها تلقائيًا باستخدام مجموعة فرعية من خصائص أنواع الإصدارات، ويتم إلغاء الخصائص غير القابلة للاستخدام. يوضّح المثال التالي كيفية تخصيص أنواع الإصدارات الإضافية والخصائص التي يتم تجاهلها:
Kotlin
android { buildTypes { release { ... } create("benchmarkRelease") { // Customize properties for the `benchmarkRelease` build type here. // For example, you can change the signing config (by default // it's the same as for the `release` build type). signingConfig = signingConfigs.getByName("benchmarkRelease") } create("nonMinifiedRelease") { // Customize properties for the `nonMinifiedRelease` build type here. signingConfig = signingConfigs.getByName("nonMinifiedRelease") // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't // customize the following properties, which are always overridden to // avoid breaking Baseline Profile generation: // // isJniDebuggable = false // isDebuggable = false // isMinifyEnabled = false // isShrinkResources = false // isProfileable = true // enableAndroidTestCoverage = false // enableUnitTestCoverage = false } } }
Groovy
android { buildTypes { release { ... } benchmarkRelease { // Customize properties for the `benchmarkRelease` build type here. // For example, you can change the signing config (by default it's the // same as for the `release` build type.) signingConfig = signingConfigs.benchmarkRelease } nonMinifiedRelease { // Customize properties for the `nonMinifiedRelease` build type here. signingConfig = signingConfigs.nonMinifiedRelease // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't use // the following properties, which are always overridden to avoid breaking // Baseline Profile generation: // // isJniDebuggable = false // isDebuggable = false // isMinifyEnabled = false // isShrinkResources = false // isProfileable = true // enableAndroidTestCoverage = false // enableUnitTestCoverage = false } } }
ملاحظات إضافية
عند إنشاء "ملفات تعريف أساسية"، إليك بعض الأمور الإضافية التي يجب الانتباه إليها:
يجب أن يكون حجم ملفات تعريف Baseline Profiles المجمَّعة أقل من 1.5 ميغابايت. لا ينطبق ذلك على تنسيق النص في ملفات المصدر، والذي يكون عادةً أكبر بكثير قبل عملية التجميع. تحقَّق من حجم ملف Baseline Profile الثنائي من خلال البحث عنه في العنصر الناتج ضمن
assets/dexopt/baseline.prof
لحزمة APK أوBUNDLE-METADATA/com.android.tools.build.profiles/baseline.prof
لحزمة AAB.يمكن أن تؤدي القواعد الواسعة التي تجمع الكثير من التطبيق إلى إبطاء عملية بدء التشغيل بسبب زيادة الوصول إلى القرص. إذا كنت قد بدأت للتوّ في استخدام Baseline Profiles، لا تقلق بشأن ذلك. ومع ذلك، استنادًا إلى تطبيقك وحجم الرحلات وعددها، يمكن أن تؤدي إضافة الكثير من الرحلات إلى أداء دون المستوى المطلوب. اختبِر أداء تطبيقك من خلال تجربة ملفات شخصية مختلفة والتأكّد من عدم تراجع الأداء بعد إضافة الملفات.