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

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

בדף הזה מוסבר איך להשתמש בפלאגין Baseline Profile 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 הגדרת הפלאגין של Gradle באופן הבא:

Kotlin

baselineProfile {
    managedDevices += "pixel6Api31"
}

מגניב

baselineProfile {
    managedDevices = ['pixel6Api31']
}

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

Kotlin

baselineProfile {
    ...
    useConnectedDevices = false
}

מגניב

baselineProfile {
    ...
    useConnectedDevices false
}

יצירת פרופילים בסיסיים של וריאציות שונות

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

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
}

מגניב

baselineProfile {
    automaticGenerationDuringBuild true
}

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

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

Kotlin

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

מגניב

baselineProfile {
    variants {
        freeRelease {
            automaticGenerationDuringBuild true
        }
    }
}

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

יצירת פרופילים של ערכי בסיס מהמקורות

אפשר לאחסן פרופילים בסיסיים (Baseline) בספריית המקור באמצעות saveInSrc דגל:

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

Kotlin

baselineProfile {
    saveInSrc = true
}

מגניב

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 {
            ...
        }
        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")
        }
        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 ולבדוק את היעילות שלה.