יצירת פרופילים באופן אוטומטי לכל גרסה של האפליקציה באמצעות ספריית Jetpack Macrobenchmark ו-BaselineProfileRule. מומלץ להשתמש בגרסה com.android.tools.build:gradle:8.0.0 ומעלה, שכוללת שיפורי build כשמשתמשים בפרופילי Baseline.
אלה השלבים הכלליים ליצירת פרופיל Baseline חדש:
- מגדירים את המודול "פרופיל Baseline".
- מגדירים את בדיקת JUnit שעוזרת ליצור פרופילים של Baseline.
- מוסיפים את חוויית המשתמש ההכרחית (CUJ) שרוצים לבצע לה אופטימיזציה.
- יוצרים את פרופיל ה-Baseline.
אחרי שיוצרים את פרופיל ה-Baseline, משווים אותו לביצועים של מכשיר פיזי כדי למדוד את שיפורי המהירות.
יצירת פרופיל Baseline חדש באמצעות AGP בגרסה 8.2 ואילך
הדרך הקלה ביותר ליצור פרופילי Baseline חדשים היא להשתמש בתבנית של המודול "פרופיל Baseline", שזמינה החל מהגרסה Android Studio Iguana ומהפלאגין של Android Gradle (AGP) 8.2.
תבנית המודול Android Studio Baseline Profile Generator מאפשרת ליצור באופן אוטומטי מודול חדש כדי ליצור פרופילי Baseline ולהשוות אותם. הפעלת התבנית יוצרת את רוב תצורות ה-build האופייניות, את פרופילי ה-Baseline ואת קוד האימות. התבנית יוצרת קוד ליצירה של פרופילי Baseline ולביצוע השוואה ביניהם, כדי למדוד את זמן ההפעלה של האפליקציה.
הגדרת המודול "פרופיל Baseline"
כדי להפעיל את תבנית המודול הזאת:
- לוחצים על קובץ > חדש > מודול חדש.
- בוחרים את התבנית Baseline Profile Generator בחלונית Templates ומגדירים אותה:
איור 1. תבנית של המודול Baseline Profile Generator. השדות בתבנית הם:
- אפליקציית היעד: מגדירה בשביל איזו אפליקציה נוצר פרופיל ה-Baseline. אם יש לכם רק מודול אחד של אפליקציה בפרויקט, יהיה רק פריט אחד ברשימה הזו.
- שם המודול: השם שרוצים לתת למודול של פרופיל ה-Baseline שנוצר.
- שם החבילה: שם החבילה שרוצים בשביל המודול "פרופיל Baseline".
- שפה: בוחרים את השפה שהקוד ייווצר בה – Kotlin או Java.
- שפת תצורת ה-build: בוחרים אם רוצים להשתמש ב-Kotlin Script (KTS) או ב-Groovy בשביל סקריפטים של תצורת build.
- שימוש במכשיר בניהול Gradle: בוחרים אם רוצים להשתמש במכשירים בניהול Gradle כדי לבדוק את האפליקציה.
- לוחצים על סיום והמודול החדש נוצר. אם אתם משתמשים בניהול מקורות, יכול להיות שתתבקשו להוסיף את קובצי המודול החדשים.
הגדרת הרכיב היוצר של פרופיל ה-Baseline
המודול החדש שנוצר מכיל בדיקות גם ליצירה של פרופיל ה-Baseline וגם להשוואה שלו, והבדיקות האלה כוללות רק את ההפעלה הבסיסית של האפליקציה. מומלץ להוסיף להם חוויות משתמש הכרחיות (CUJ) ותהליכי עבודה מתקדמים להפעלה. חשוב לוודא שכל הבדיקות שקשורות להפעלת האפליקציה נמצאות בבלוק rule עם includeInStartupProfile שמוגדר ל-true. לעומת זאת, כדי להשיג ביצועים אופטימליים, חשוב לוודא שכל הבדיקות שלא קשורות להפעלת האפליקציה לא נכללות בפרופיל ההפעלה. אופטימיזציות של הפעלת אפליקציות משמשות להגדרת חלק מיוחד בפרופיל ה-Baseline שנקרא פרופיל הפעלה.
כדי לשמור על יכולת התחזוקה, מומלץ להפריד את ה-CUJ האלה מהקוד של פרופיל ה-Baseline ומהקוד של ההשוואה לשוק שנוצרו, כדי שאפשר יהיה להשתמש ב-CUJ האלה בשביל שניהם. המשמעות היא שהשינויים ב-CUJ שלכם מיושמים בעקביות.
יצירה והתקנה של פרופיל Baseline
תבנית המודול "פרופיל Baseline" מוסיפה הגדרת הרצה חדשה כדי ליצור את פרופיל ה-Baseline. אם אתם משתמשים בגרסאות מוצר, Android Studio יוצר כמה הגדרות הפעלה כדי שתוכלו ליצור פרופילי Baseline נפרדים לכל גרסה.
כשמסיימים להריץ את ההגדרה Generate Baseline Profile, פרופיל ה-Baseline שנוצר מועתק לקובץ src/variant/generated/baselineProfiles/baseline-prof.txt במודול שיוצרים לו פרופיל. אפשרויות הווריאנט יכולות להיות סוג של גרסת build להפצה או וריאנט build שכוללות את סוג גרסת ה-build להפצה.
פרופיל ה-Baseline נוצר במקור ב-build/outputs. הנתיב המלא נקבע לפי הווריאנט או הגרסה של האפליקציה שיוצרים לה פרופיל, ולפי סוג המכשיר שמשמש ליצירת הפרופיל: מכשיר בניהול Gradle או מכשיר מחובר. אם משתמשים בשמות שבהם נעשה שימוש בקוד ובתצורות build שנוצרו על ידי התבנית, פרופיל ה-Baseline נוצר בקובץ build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt. סביר להניח שלא תצטרכו לבצע אינטראקציה ישירה עם הגרסה הזו של פרופיל ה-Baseline שנוצר, אלא אם אתם מעתיקים אותה באופן ידני למודולים של היעד (לא מומלץ).
יצירת פרופיל Baseline חדש באמצעות AGP 8.1
אם אין לכם אפשרות להשתמש בתבנית המודול של פרופיל ה-Baseline, אתם יכולים להשתמש בתבנית של מודול Macrobenchmark ובפלאגין Baseline Profile Gradle כדי ליצור פרופיל Baseline חדש. מומלץ להשתמש בכלים האלה החל מ-Android Studio Giraffe ומ-AGP 8.1.
כך יוצרים פרופיל Baseline חדש באמצעות תבנית המודול Macrobenchmark והפלאגין Baseline Profile Gradle:
- מגדירים מודול Macrobenchmark בפרויקט Gradle.
- מגדירים מחלקה חדשה בשם
BaselineProfileGenerator:class BaselineProfileGenerator { @get:Rule val baselineProfileRule = BaselineProfileRule() @Test fun startup() = baselineProfileRule.collect( packageName = "com.example.app", profileBlock = { startActivityAndWait() } ) }
הרכיב היוצר יכול לכלול עוד אינטראקציות עם האפליקציה בנוסף להפעלה שלה. כך אפשר לבצע אופטימיזציה של ביצועי זמן הריצה של האפליקציה, למשל גלילה ברשימות, הפעלת אנימציות וניווט בתוך
Activity. דוגמאות נוספות לבדיקות שמשתמשות ב-@BaselineProfileRuleכדי לשפר את חוויות המשתמשים ההכרחיות (CUJ) מוסיפים את פלאגין Baseline Profile Gradle (
libs.plugins.androidx.baselineprofile). הפלאגין מקל על יצירת פרופילים של Baseline ועל התחזוקה שלהם בעתיד.כדי ליצור את פרופיל ה-Baseline, מריצים את משימות Gradle
:app:generateBaselineProfileאו:app:generateVariantBaselineProfileבטרמינל.מריצים את הגנרטור כבדיקת אינסטרומנטציה במכשיר פיזי שעבר תהליך רוט (Root), באמולטור או במכשיר בניהול Gradle. אם אתם משתמשים במכשיר בניהול Gradle, צריך להגדיר את
aospכ-systemImageSource, כי נדרשת גישת root לרכיב היוצר של פרופיל ה-Baseline.בסיום יצירת הפרופיל, הוא מועתק אל
app/src/variant/generated/baselineProfiles.
יצירת פרופיל Baseline חדש בלי תבניות
מומלץ ליצור פרופיל Baseline באמצעות תבנית מודול פרופיל Baseline (המועדפת) או תבנית Macrobenchmark ב-Android Studio, אבל אפשר גם להשתמש בפלאגין Baseline Profile Gradle לבד. מידע נוסף על הפלאגין Baseline Profile Gradle זמין במאמר בנושא איך מגדירים את יצירת פרופיל ה-Baseline.
כך יוצרים פרופיל Baseline באמצעות הפלאגין Baseline Profile Gradle:
- יוצרים מודול
com.android.testחדש – לדוגמה,:baseline-profile. מגדירים את הקובץ
build.gradle.ktsבשביל:baseline-profile:- מחילים את הפלאגין
androidx.baselineprofile. - מוודאים שהנתיב
targetProjectPathמצביע על המודול:app. - אופציונלי: מוסיפים מכשיר בניהול Gradle (GMD).
בדוגמה הבאה, זה
pixel6Api31. אם לא מציינים מכשיר, הפלאגין משתמש במכשיר מחובר, אמולטור או מכשיר פיזי. - מחילים את ההגדרה הרצויה, כמו בדוגמה הבאה.
Kotlin
plugins { id("com.android.test") id("androidx.baselineprofile") } android { defaultConfig { ... } // Point to the app module, the module that you're generating the Baseline Profile for. targetProjectPath = ":app" // Configure a GMD (optional). testOptions.managedDevices.devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } } dependencies { ... } // Baseline Profile Gradle plugin configuration. Everything is optional. This // example uses the GMD added earlier and disables connected devices. baselineProfile { // Specifies the GMDs to run the tests on. The default is none. managedDevices += "pixel6Api31" // Enables using connected devices to generate profiles. The default is // `true`. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices = false }
Groovy
plugins { id 'com.android.test' id 'androidx.baselineprofile' } android { defaultConfig { ... } // Point to the app module, the module that you're generating the Baseline Profile for. targetProjectPath ':app' // Configure a GMD (optional). testOptions.managedDevices.devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device 'Pixel 6' apiLevel 31 systemImageSource 'aosp' } } } dependencies { ... } // Baseline Profile Gradle plugin configuration. Everything is optional. This // example uses the GMD added earlier and disables connected devices. baselineProfile { // Specifies the GMDs to run the tests on. The default is none. managedDevices ['pixel6Api31'] // Enables using connected devices to generate profiles. The default is // `true`. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices false }
- מחילים את הפלאגין
יוצרים בדיקה של פרופיל Baseline במודול הבדיקה
:baseline-profile. בדוגמה הבאה מוצגת בדיקה שמפעילה את האפליקציה ואז ממתינה שהמכשיר יהיה לא פעיל.Kotlin
class BaselineProfileGenerator { @get:Rule val baselineRule = BaselineProfileRule() @Test fun startupBaselineProfile() { baselineRule.collect("com.myapp") { startActivityAndWait() } } }
Java
public class BaselineProfileGenerator { @Rule Public BaselineProfileRule baselineRule = new BaselineProfileRule(); @Test Public void startupBaselineProfile() { baselineRule.collect( "com.myapp", (scope -> { scope.startActivityAndWait(); Return Unit.INSTANCE; }) ) } }
מעדכנים את הקובץ
build.gradle.ktsבמודול האפליקציה, לדוגמה:app.- מחילים את הפלאגין
androidx.baselineprofile. - מוסיפים תלות ב-
baselineProfileלמודול:baseline-profile.
Kotlin
plugins { id("com.android.application") id("androidx.baselineprofile") } android { // There are no changes to the `android` block. ... } dependencies { ... // Add a `baselineProfile` dependency on the `:baseline-profile` module. baselineProfile(project(":baseline-profile")) }
Groovy
plugins { id 'com.android.application' id 'androidx.baselineprofile' } android { // No changes to the `android` block. ... } dependencies { ... // Add a `baselineProfile` dependency on the `:baseline-profile` module. baselineProfile ':baseline-profile' }
- מחילים את הפלאגין
מריצים את משימות Gradle
:app:generateBaselineProfileאו:app:generateVariantBaselineProfileכדי ליצור את הפרופיל.בסיום יצירת הפרופיל, הוא מועתק אל
app/src/variant/generated/baselineProfiles.
יצירת פרופיל Baseline חדש באמצעות AGP 7.3-7.4
אפשר ליצור פרופילים של Baseline עם AGP 7.3 עד AGP 7.4, אבל מומלץ מאוד לשדרג לפחות ל-AGP 8.1 כדי שתוכלו להשתמש בפלאגין Baseline Profile Gradle ובתכונות העדכניות שלו.
אם אתם צריכים ליצור פרופילים של Baseline עם AGP 7.3-7.4, השלבים זהים לשלבים של AGP 8.1, למעט השינויים הבאים:
- אל תוסיפו את פלאגין Baseline Profile Gradle.
- כדי ליצור את פרופילי ה-Baseline, מריצים את משימת Gradle
./gradlew [emulator name][flavor][build type]AndroidTest. לדוגמה,./gradlew :benchmark:pixel6Api31BenchmarkAndroidTest. - צריך להחיל ידנית על הקוד את הכללים של פרופיל ה-Baseline שנוצר.
החלה ידנית של כללים שנוצרו
מחולל פרופיל ה-Baseline יוצר קובץ טקסט בפורמט קריא לאנשים (HRF) במכשיר ומעתיק אותו למחשב המארח. כדי להחיל את הפרופיל שנוצר על הקוד, פועלים לפי השלבים הבאים:
מאתרים את קובץ ה-HRF בתיקיית ה-build של המודול שבו יוצרים את הפרופיל:
[module]/build/outputs/managed_device_android_test_additional_output/[device].הפרופילים פועלים לפי תבנית השמות
[class name]-[test method name]-baseline-prof.txtשמופיעה כך:BaselineProfileGenerator-startup-baseline-prof.txt.מעתיקים את הפרופיל שנוצר אל
src/main/ומשנים את שם הקובץ ל-baseline-prof.txt.כדי לקמפל פרופיל Baseline באופן מקומי במקומות שבהם פרופילים ב-Cloud לא זמינים, מוסיפים תלות בספריית ProfileInstaller בקובץ
build.gradle.ktsשל האפליקציה. זו הדרך היחידה להתקין פרופיל Baseline ממקור לא ידוע במכשיר באופן מקומי.dependencies { implementation("androidx.profileinstaller:profileinstaller:1.4.1") }מבצעים build של גרסת הייצור של האפליקציה בזמן שכללי ה-HRF שהוחלו עוברים קומפילציה לפורמט בינארי ונכללים ב-APK או ב-AAB. לאחר מכן, מפיצים את האפליקציה כרגיל.
השוואה לפרופיל Baseline
כדי להשוות את פרופיל ה-Baseline, יוצרים הגדרה חדשה של הרצת בדיקה שמבוססת על מכשור ב-Android מהפעולה שמופיעה בשולי עורך הקוד שמבצע את ההשוואות שהוגדרו בקובץ StartupBenchmarks.kt או StartupBencharks.java. מידע נוסף על בדיקות השוואה לשוק זמין במאמרים בנושא יצירת מחלקה של Macrobenchmark ואוטומציה של מדידה באמצעות ספריית Macrobenchmark.
כשמריצים את הפקודה הזו ב-Android Studio, פלט ה-build מכיל פרטים על שיפורי המהירות שפרופיל ה-Baseline מספק:
StartupBenchmarks_startupCompilationBaselineProfiles timeToInitialDisplayMs min 161.8, median 178.9, max 194.6 StartupBenchmarks_startupCompilationNone timeToInitialDisplayMs min 184.7, median 196.9, max 202.9
תיעוד של כל נתיבי הקוד הנדרשים
שני מדדי המפתח למדידת זמני ההפעלה של האפליקציה הם:
- הזמן להצגה ראשונית (TTID)
- הזמן שנדרש להצגת הפריים הראשון של ממשק המשתמש של האפליקציה.
- הזמן עד להצגה מלאה (TTFD)
- הזמן עד להצגת התוכן שנטען באופן אסינכרוני אחרי שהפריים הראשוני מוצג.
המדד TTFD מדווח אחרי ששולחים קריאה ל-method
reportFullyDrawn() של
ComponentActivity. אם אף פעם לא נשלחת קריאה ל-reportFullyDrawn(), המדד TTID מדווח במקום זאת. יכול להיות שתצטרכו לדחות את הקריאה ל-reportFullyDrawn() עד אחרי שהטעינה האסינכרונית תסתיים. לדוגמה, אם ממשק המשתמש כולל רשימה דינמית כמו RecyclerView או רשימה עצלה (Lazy List), יכול להיות שהרשימה תתמלא רק אחרי שהמסך כבר נטען במלואו – אחרי שממשק המשתמש יסומן במצב טעימה מלא. במקרים כאלה, קוד שמופעל אחרי שהממשק מגיע למצב טעינה מלא לא נכלל בפרופיל ה-Baseline.
כדי לכלול את אכלוס הרשימה כחלק מפרופיל ה-Baseline, צריך לקבל את
FullyDrawnReporter באמצעות
getFullyDrawnReporter()
ולהוסיף לו כלי דיווח בקוד האפליקציה. מפסיקים את השימוש ברכיב הדיווח אחרי שמשימת הרקע מסיימת לאכלס את הרשימה. הפונקציה FullyDrawnReporter לא קוראת ל-method reportFullyDrawn() עד שמפסיקים את השימוש בכל רכיבי הדיווח. כך, פרופיל ה-Baseline כולל את נתיבי הקוד שנדרשים כדי לאכלס את הרשימה.
הפעולה הזו לא משנה את התנהגות האפליקציה בשביל המשתמש, אבל היא מאפשרת לפרופיל ה-Baseline לכלול את כל נתיבי הקוד הנדרשים.
אם האפליקציה משתמשת ב-Jetpack פיתוח נייטיב, צריך להשתמש בממשקי ה-API הבאים כדי לציין מצב טעינה מלא:
-
ReportDrawnמציין שהרכיב הקומפוזבילי מוכן מיידית לאינטראקציה. -
ReportDrawnWhenמקבל פונקציית פרדיקט, כמוlist.count > 0, כדי לציין מתי הרכיב הקומפוזבילי מוכן לאינטראקציה. -
ReportDrawnAfterמקבל method השהיה, וכשהוא מסתיים, הוא מציין שהרכיב הקומפוזבילי מוכן לאינטראקציה.
מומלץ בשבילכם
- הערה: טקסט הקישור מוצג כש-JavaScript מושבת
- איסוף מדדים של ספריית Macrobenchmark
- כתיבת Macrobenchmark
- ספריית JankStats