אפשר ליצור פרופילים באופן אוטומטי לכל גרסה של האפליקציה באמצעות ספריית Jetpack Macrobenchmark ו-BaselineProfileRule. מומלץ להשתמש בגרסה com.android.tools.build:gradle:8.0.0 ומעלה, שכוללת שיפורים בגרסה כשמשתמשים בפרופילים של Baseline.
אלה השלבים הכלליים ליצירת פרופיל בסיסי חדש:
- מגדירים את המודול Baseline Profile.
- מגדירים את בדיקת JUnit שעוזרת ליצור פרופילים של Baseline.
- מוסיפים את חוויית המשתמש ההכרחית (CUJ) שרוצים לבצע לה אופטימיזציה.
- יוצרים את פרופיל ה-Baseline.
אחרי שיוצרים את פרופיל ה-Baseline, משווים אותו לביצועים של מכשיר פיזי כדי למדוד את שיפורי המהירות.
יצירת פרופיל Baseline חדש באמצעות AGP בגרסה 8.2 ואילך
הדרך הקלה ביותר ליצור פרופיל Baseline חדש היא להשתמש בתבנית המודול Baseline Profile, שזמינה החל מ-Android Studio Iguana ומ-Android Gradle Plugin (AGP) 8.2.
תבנית המודול Baseline Profile Generator של Android Studio מאפשרת ליצור באופן אוטומטי מודול חדש כדי ליצור פרופילים של Baseline ולבצע להם בדיקות השוואה. הפעלת התבנית יוצרת את רוב ההגדרות האופייניות של ה-build, את פרופיל ה-Baseline ואת קוד האימות. התבנית יוצרת קוד ליצירה של פרופילים של Baseline ולביצוע השוואה ביניהם כדי למדוד את זמן ההפעלה של האפליקציה.
הגדרת המודול Baseline Profile
כדי להריץ את תבנית המודול Baseline Profile (פרופיל בסיסי):
- בוחרים באפשרות קובץ > חדש > מודול חדש.
- בוחרים את התבנית Baseline Profile Generator בחלונית Templates ומגדירים אותה:
איור 1. תבנית של מודול ליצירת פרופיל Baseline. השדות בתבנית הם:
- אפליקציית היעד: מגדירה עבור איזו אפליקציה נוצר פרופיל הבסיס. אם יש לכם רק מודול אפליקציה אחד בפרויקט, יהיה רק פריט אחד ברשימה הזו.
- שם המודול: השם שרוצים לתת למודול Baseline Profile שנוצר.
- Package name: שם החבילה שרוצים עבור מודול Baseline Profile.
- שפה: האם רוצים שהקוד שייווצר יהיה ב-Kotlin או ב-Java.
- שפת הגדרות ה-Build: בוחרים אם רוצים להשתמש ב-Kotlin Script (KTS) או ב-Groovy בשביל סקריפטים של הגדרות ה-Build.
- שימוש במכשיר בניהול Gradle: האם אתם משתמשים במכשירים בניהול Gradle כדי לבדוק את האפליקציה.
- לוחצים על סיום והמודול החדש נוצר. אם אתם משתמשים בבקרת גרסאות, יכול להיות שתתבקשו להוסיף את קובצי המודול החדשים לבקרת הגרסאות.
הגדרת מחולל פרופילים של Baseline
המודול החדש שנוצר מכיל בדיקות ליצירה ולבדיקה של פרופיל Baseline, ובדיקות רק של הפעלה בסיסית של האפליקציה. מומלץ להוסיף להם תרחישי שימוש נפוצים (CUJ) ותהליכי עבודה מתקדמים להפעלת סטארטאפים. חשוב לוודא שכל הבדיקות שקשורות להפעלת האפליקציה נמצאות בבלוק rule עם includeInStartupProfile שמוגדר ל-true. לעומת זאת, כדי להשיג ביצועים אופטימליים, חשוב לוודא שכל הבדיקות שלא קשורות להפעלת האפליקציה לא נכללות בפרופיל ההפעלה. אופטימיזציות של הפעלת האפליקציה משמשות להגדרת חלק מיוחד בפרופיל Baseline שנקרא פרופיל להפעלה.
כדי לשמור על יכולת התחזוקה, מומלץ להפריד את תרחישי השימוש האלה מקוד הבדיקה ומפרופיל הבסיס שנוצר, כדי שאפשר יהיה להשתמש בהם גם לבדיקה וגם להשוואה. המשמעות היא שהשינויים ב-CUJ שלכם ישמשו באופן עקבי.
יצירה והתקנה של פרופיל Baseline
תבנית המודול Baseline Profile מוסיפה הגדרת הרצה חדשה כדי ליצור את פרופיל ה-Baseline. אם אתם משתמשים בגרסאות מוצר, Android Studio יוצר כמה הגדרות הפעלה כדי שתוכלו ליצור פרופילים נפרדים של ביצועים בסיסיים לכל גרסה.
כשמסיימים את ההגדרה של Generate Baseline Profile (יצירת פרופיל Baseline), הפרופיל שנוצר מועתק לקובץ src/variant/generated/baselineProfiles/baseline-prof.txt במודול שיוצרים לו פרופיל. אפשרויות הווריאנט הן סוג גרסת ה-release או וריאנט של גרסת ה-release.
פרופיל ה-Baseline שנוצר נוצר במקור ב-build/outputs. הנתיב המלא נקבע לפי הווריאציה או הגרסה של האפליקציה שיוצרים לה פרופיל, ולפי סוג המכשיר שמשמש ליצירת הפרופיל – מכשיר שמנוהל על ידי Gradle או מכשיר מחובר. אם משתמשים בשמות שבהם נעשה שימוש בקוד ובהגדרות הבנייה שנוצרו על ידי התבנית, פרופיל ה-Baseline נוצר בקובץ build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt. סביר להניח שלא תצטרכו ליצור אינטראקציה ישירות עם הגרסה הזו של פרופיל ה-Baseline שנוצר, אלא אם אתם מעתיקים אותה באופן ידני למודולים של היעד (לא מומלץ).
יצירת פרופיל בסיסי חדש באמצעות AGP 8.1
אם אין לכם אפשרות להשתמש בתבנית המודול Baseline Profile, אתם יכולים להשתמש בתבנית המודול 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כדי לשפר תהליכים קריטיים שעוברים המשתמשים. מוסיפים את הפלאגין Baseline Profile Gradle (
libs.plugins.androidx.baselineprofile). הפלאגין מקל על יצירת פרופילים של Baseline ועל התחזוקה שלהם בעתיד.כדי ליצור את פרופיל ה-Baseline, מריצים את משימות Gradle
:app:generateBaselineProfileאו:app:generateVariantBaselineProfileבטרמינל.מריצים את הגנרטור כבדיקה עם מכשור במכשיר פיזי עם הרשאות בסיס, באמולטור או במכשיר בניהול Gradle. אם משתמשים במכשיר מנוהל של Gradle, צריך להגדיר את
aospכ-systemImageSource, כי נדרשת גישת root כדי ליצור פרופיל Baseline.בסיום משימת היצירה, פרופיל ה-Baseline מועתק אל
app/src/variant/generated/baselineProfiles.
יצירת פרופיל בסיסי חדש ללא תבניות
מומלץ ליצור פרופיל Baseline באמצעות תבנית המודול Baseline Profile (המועדפת) או תבנית 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כדי ליצור את הפרופיל.בסיום משימת היצירה, פרופיל ה-Baseline מועתק אל
app/src/variant/generated/baselineProfiles.
יצירת פרופיל Baseline חדש באמצעות AGP 7.3-7.4
אפשר ליצור פרופילים של Baseline באמצעות AGP בגרסאות 7.3 עד 7.4, אבל מומלץ מאוד לשדרג לגרסה 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. - אתם צריכים להחיל ידנית את הכללים של פרופיל הבסיס שנוצר על הקוד.
החלה ידנית של כללים שנוצרו
מחולל פרופיל הבסיס יוצר קובץ טקסט בפורמט קריא (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") }יוצרים את גרסת הייצור של האפליקציה בזמן שכללי ה-HRF שהוחלו מקומפלים לפורמט בינארי ונכללים ב-APK או ב-AAB. לאחר מכן, מפיצים את האפליקציה כרגיל.
השוואה לפרופיל 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 מדווח אחרי שקוראים לשיטה reportFullyDrawn() של ComponentActivity. אם אף פעם לא מתבצעת קריאה ל-reportFullyDrawn(), במקום זאת מדווח על TTID. יכול להיות שתצטרכו לדחות את הקריאה ל-reportFullyDrawn() עד אחרי שהטעינה האסינכרונית תסתיים. לדוגמה, אם ממשק המשתמש מכיל רשימה דינמית כמו RecyclerView או lazy
list, יכול להיות שהרשימה תאוכלס על ידי משימת רקע שתושלם אחרי שהרשימה תוצג בפעם הראשונה, ולכן אחרי שממשק המשתמש יסומן כרשימה שהוצגה במלואה. במקרים כאלה, קוד שמופעל אחרי שהממשק מגיע למצב של רישום מלא לא נכלל בפרופיל הבסיסי.
כדי לכלול את אכלוס הרשימה כחלק מפרופיל הבסיס, צריך לקבל את
FullyDrawnReporter באמצעות
getFullyDrawnReporter()
ולהוסיף לו כלי דיווח בקוד האפליקציה. משחררים את הכלי לדיווח אחרי שמשימת הרקע מסיימת לאכלס את הרשימה. הפונקציה FullyDrawnReporter לא קוראת לשיטה reportFullyDrawn() עד שכל הדוחות משוחררים. כך, פרופיל ה-Baseline כולל את נתיבי הקוד שנדרשים כדי לאכלס את הרשימה.
הפעולה הזו לא משנה את התנהגות האפליקציה עבור המשתמש, אבל היא מאפשרת ל-Baseline Profile לכלול את כל נתיבי הקוד הנדרשים.
אם האפליקציה שלכם משתמשת ב-Jetpack Compose, אתם יכולים להשתמש בממשקי ה-API הבאים כדי לציין את המצב של ציור מלא:
-
ReportDrawnמציין שהרכיב המורכב מוכן מיידית לאינטראקציה. -
ReportDrawnWhenמקבל פונקציית חיזוי, כמוlist.count > 0, כדי לציין מתי רכיב ה-Composable מוכן לאינטראקציה. -
ReportDrawnAfterמקבלת שיטת השהיה, וכשהיא מסתיימת, היא מציינת שהרכיב הניתן להרכבה מוכן לאינטראקציה.
מומלץ בשבילכם
- הערה: טקסט הקישור מוצג כש-JavaScript מושבת
- איסוף מדדים של השוואה
- כתיבת Macrobenchmark
- ספריית JankStats