הגדרת היצירה של פרופיל הבסיס

הפלאגין Baseline Profile Gradle מאפשר ליצור ולתחזק בקלות פרופילים בסיסיים. זה עוזר לך לבצע את המשימות הבאות:

בדף הזה מוסבר איך להשתמש בפלאגין Gradle של פרופיל הבקרה כדי להתאים אישית את היצירה של פרופילי הבקרה.

דרישות לגבי יישומי פלאגין

שימוש במכשירים מנוהלים של Gradle ליצירת פרופילים בסיסיים

להשתמש במכשיר מנוהל (GMDle) לצורך יוצרים פרופיל Baseline, מוסיפים פרופיל כזה בהגדרה של build.gradle.kts של המודול של מפיק הפרופיל — סביר להניח שמודול הבדיקה :baselineprofile שמוצגת בדוגמה הבאה:

Kotlin

android {
   testOptions.managedDevices.devices {
       create<com.android.build.api.dsl.ManagedVirtualDevice>("pixel6Api31") {
           device = "Pixel 6"
           apiLevel = 31
           systemImageSource = "aosp"
       }
   }
}

מגניב

android {
   testOptions.managedDevices.devices {
       pixel6Api31(ManagedVirtualDevice) {
           device 'Pixel 6'
           apiLevel = 31
           systemImageSource 'aosp'
       }
   }
}

כדי ליצור פרופילים בסיסיים באמצעות GMD, מוסיפים אותו להגדרות הפלאגין של Baseline Profile ב-Gradle באופן הבא, בקטע build.gradle.kts של מודול הבדיקה :baselineprofile:

Kotlin

baselineProfile {
    managedDevices += "pixel6Api31"
}

מגניב

baselineProfile {
    managedDevices = ['pixel6Api31']
}

כשמשתמשים ב-GMD כדי ליצור פרופילים בסיסיים, צריך להגדיר את useConnectedDevices לערך false, במודול הבדיקה :baselineprofile:

Kotlin

baselineProfile {
    ...
    useConnectedDevices = false
}

מגניב

baselineProfile {
    ...
    useConnectedDevices false
}

יצירת פרופילי Baseline לוריאציות שונות

אפשר ליצור פרופילים בסיסיים לכל וריאנט, לפי טעם או כקובץ יחיד לשימוש בכל הווריאציות. אפשר לשלוט בהתנהגות הזו באמצעות הגדרת המיזוג, כפי שמוצג בדוגמה הבאה, בקובץ build.gradle.kts של האפליקציה או מודול הספרייה.

Kotlin

baselineProfile {
    mergeIntoMain = true
}

מגניב

baselineProfile {
    mergeIntoMain true
}

כדי למזג את הפרופילים שנוצרו לכל הווריאציות לפרופיל אחד, צריך להגדיר mergeIntoMain עד true. לא ניתן ליצור ערך בסיס לכל וריאנט פרופילים כאשר ההגדרה הזו היא true, כך שיש משימה אחת של Gradle בשם generateBaselineProfile. הפלט של הפרופיל הוא ב- src/main/generated/baselineProfiles

כדי להשבית את המיזוג ויהיה לך פרופיל אחד לכל וריאנט, צריך להגדיר את mergeIntoMain לערך false. במקרה כזה, יש כמה משימות Gradle ספציפיות לווריאנט. לדוגמה, אם יש שתי גרסאות – למשל, בחינם ובתשלום – וסוג build אחד של גרסה זמינה, המשימות הן:

* `generateFreeReleaseBaselineProfile`
* `generatePaidReleaseBaselineProfile`
* `generateReleaseBaselineProfile`

כדי להגדיר את התנהגות המיזוג של כל וריאנט, משתמשים בקוד הבא:

Kotlin

baselineProfile {
    variants {
        freeRelease {
            mergeIntoMain = true
        }
    }
}

מגניב

baselineProfile {
    variants {
        freeRelease {
            mergeIntoMain true
        }
    }
}

בדוגמה הקודמת, כל הווריאציות שבהן הדגל מוגדר כ-true מוזגו ל-src/main/generated/baselineProfiles, ואילו הפרופילים של הווריאציות שבהן הדגל מוגדר כ-false נשארים בתיקייה src/<variant>/generated/baselineProfiles.

כברירת מחדל, mergeIntoMain מוגדר ל-true עבור ספריות ו-false לאפליקציות.

יצירת פרופילים בסיסיים באופן אוטומטי כשמרכיבים גרסה חדשה

אפשר להגדיר יצירת פרופיל בסיס באופן אוטומטי בכל build של גרסה, במקום להשתמש באופן ידני במשימה generateBaselineProfile. ב- באופן אוטומטי, הפרופיל המעודכן ביותר נכלל ב-build של הגרסה.

כדי להפעיל יצירה אוטומטית לגרסאות build של גרסאות, צריך להשתמש דגל automaticGenerationDuringBuild:

Kotlin

baselineProfile {
    automaticGenerationDuringBuild = true
}

Groovy

baselineProfile {
    automaticGenerationDuringBuild true
}

הגדרת הדגל automaticGenerationDuringBuild לערך true מפעילה את של יצירת פרופיל Baseline חדש לכל הרכבה של גרסה. המשמעות היא הרצת משימת build של גרסת הרכבה, כמו ./gradlew:app:assembleRelease, מפעיל גם את :app:generateReleaseBaselineProfile, מפעיל את פרופיל Baseline בדיקות אינסטרומנטציה, ויוצרים את הגרסה הבסיסית של פרופיל הבסיס שעליה הם מריצים. היצירה האוטומטית עוזרת למשתמשים להפיק את המקסימום מהביצועים, אבל גם מאריך את זמן ה-build בגלל ה-build והאינסטרומנטציה הכפולים בדיקות.

ניתן גם לציין התנהגות זו לכל וריאנט, כפי שמתואר בהמשך דוגמה:

Kotlin

baselineProfile {
    variants {
        freeRelease {
            automaticGenerationDuringBuild = true
        }
    }
}

Groovy

baselineProfile {
    variants {
        freeRelease {
            automaticGenerationDuringBuild true
        }
    }
}

בדוגמה הקודמת, המשימה generateFreeReleaseBaselineProfile רצה כשהחל מ-assembleFreeRelease. זה עוזר כשהמשתמש רוצה לקבל, לדוגמה, release עבור build של הפצה שתמיד יוצר את הפרופיל במהלך הפיתוח, ו-build של releaseWithoutProfile לבדיקות פנימיות.

שמירת פרופילים Baseline במקורות

אפשר לשמור פרופילים בסיסיים בספריית המקור באמצעות הדגל saveInSrc בקובץ build.gradle.kts של האפליקציה או מודול הספרייה:

  • true: פרופיל הבסיס מאוחסן ב src/<variant>/generated/baselineProfiles. כך תוכלו לשמור שנוצר באמצעות המקורות שלך.
  • false: פרופיל הבסיס מאוחסן בקובצי הביניים ב-build כך, בזמן התחייבות הקוד, לא שומרים את הפרופיל שנוצר.

Kotlin

baselineProfile {
    saveInSrc = true
}

Groovy

baselineProfile {
    saveInSrc true
}

אפשר גם לציין את ההתנהגות הזו לכל וריאנט:

Kotlin

baselineProfile {
    variants {
        freeRelease {
            saveInSrc = true
        }
    }
}

מגניב

baselineProfile {
    variants {
        freeRelease {
            saveInSrc true
        }
    }
}

סינון הכללים בפרופיל

הפלאגין Baseline Profile Gradle מאפשר לסנן את הכללים של פרופיל הבסיס שנוצר. האפשרות הזו שימושית במיוחד לגבי ספריות, אם אתם רוצים להחריג כללי פרופיל למחלקות ולשיטות שהן חלק מיחסי תלות אחרים לדוגמה, האפליקציה או הספרייה עצמה. המסננים יכולים לכלול ולהחריג חבילות ושיעורים. כשמציינים רק החרגות, המערכת מתאימה רק לערך הבסיס כללי הפרופיל מוחרגים וכל השאר נכלל.

מפרט המסננים יכול להיות כל אחד מהבאים:

  • שם החבילה שמסתיים בתווים כלליים לחיפוש כפול כדי להתאים לחבילה שצוינה וגם כל חבילות המשנה. לדוגמה, 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.**")
    }
}

מגניב

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.**")
            }
        }
    }
}

מגניב

// 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 לסינון, כי הוא מספק דרך פשוטה יותר לסנן חבילות משנה ומקום אחד להגדרת המודול כולו.

התאמה אישית של סוגי ה-build של נקודת ההשוואה ופרופיל הבסיס

הפלאגין Baseline Profile Gradle יוצר סוגים נוספים של גרסאות build כדי ליצור את הפרופילים ולהריץ את מדדי הביצועים. התחילית של סוגי ה-build האלה היא benchmark וגם nonMinified לדוגמה, בסוג ה-build של release, יוצר את סוגי ה-build benchmarkRelease ו-nonMinifiedRelease. סוגי ה-build האלה מוגדרים באופן אוטומטי לתרחיש הספציפי, באופן כללי, ללא צורך בהתאמה אישית. אבל יש מקרים שבהם עדיין יכול להיות שימושי כדי להחיל כמה אפשרויות מותאמות אישית, כמו החלת הגדרות חתימה שונות.

אפשר להתאים אישית את סוגי ה-build שנוצרו באופן אוטומטי באמצעות קבוצת משנה של מאפיינים של סוג ה-build; מאפיינים שאי אפשר להשתמש בהם מתבטלים. הדוגמה הבאה מראה איך להתאים אישית את סוגי ה-build הנוספים אילו מאפיינים בוטלו:

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
        }
    }
}

מגניב

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       
        }
    }
}

הערות נוספות

חשוב לשים לב לנקודות הבאות כשיוצרים פרופילים בסיסיים:

  • פרופילים מחוברים חייבים להיות קטנים מ-1.5MB. מה לא עומד בדרישות? על פורמט הטקסט בקובצי המקור, שבדרך כלל גדול יותר לפני האוסף. אימות הגודל של ערך הבסיס הבינארי הפרופיל באמצעות איתורו בארטיפקט הפלט assets/dexopt/baseline.prof ל-APK או BUNDLE-METADATA/com.android.tools.build.profiles/baseline.prof ל-AAB.

  • כללים רחבים שמרכיבים את האפליקציה יותר מדי עלולים להאט את ההפעלה בגלל גישה מוגברת לדיסק. אם רק התחלתם להשתמש במאפיין Baseline פרופילים, אל תדאגו. עם זאת, בהתאם לאפליקציה, לגודל ולמספר המסלולים, הוספת הרבה מסלולים עשויה להוביל לביצועים לא אופטימליים. מומלץ לבדוק את הביצועים של האפליקציה פרופילים ואימות שהביצועים אינם חוזרים לאחור לאחר ותוספות.

שיעורי Lab

מידע נוסף על בדיקות ביצועים ברמת המאקרו
אפשר ליצור פרופיל Baseline מותאם אישית שמותאם לאפליקציה ל-Android ולבדוק את היעילות שלה.