פלאגין Android Gradle‏ ‎9.0.1 (ינואר 2026)

‫פלאגין של Android Gradle 9.0 הוא גרסה מרכזית שכוללת שינויים ב-API ובהתנהגות.

כדי לעדכן לגרסה 9.0.1 של הפלאגין של Android Gradle, משתמשים בעוזר השדרוג של הפלאגין של Android Gradle. כלי השדרוג של AGP עוזר לשמור על ההתנהגויות הקיימות כשמשדרגים את הפרויקט, כך שתוכלו לשדרג את הפרויקט ל-AGP 9.0 גם אם אתם לא מוכנים לאמץ את כל ברירות המחדל החדשות ב-AGP 9.0.

יש גם שתי מיומנויות של סוכנים שיכולות לעזור בתהליך השדרוג. באפליקציה שהיא לא KMP, נסו את מיומנות השדרוג של AGP 9 ממאגר המיומנויות של Android. באפליקציית KMP, נסו את מיומנות השדרוג של AGP 9 מ-JetBrains. מידע נוסף על שימוש במיומנויות ב-Android Studio זמין במאמר הרחבת מצב הסוכן באמצעות מיומנויות.

תאימות

רמת ה-API המקסימלית שנתמכת בפלאגין של Android Gradle 9.0 היא 36.1. מידע נוסף על תאימות:

גרסת המינימום גרסת ברירת המחדל הערות
Gradle 9.1.0 9.1.0 יש מידע נוסף במאמר בנושא עדכון Gradle.
SDK Build Tools 36.0.0 36.0.0 צריך להתקין או להגדיר את SDK Build Tools.
NDK לא רלוונטי 28.2.13676358 צריך להתקין או להגדיר גרסה אחרת של NDK.
JDK 17 17 מידע נוסף זמין במאמר הגדרת גרסת ה-JDK.
פלאגין Kotlin Gradle‏ (KGP) 2.2.10 2.2.10 מידע נוסף זמין במאמר תלות בזמן ריצה בפלאגין Kotlin Gradle.

מחלקות ה-DSL של android מטמיעות עכשיו רק את הממשקים הציבוריים החדשים

בשנים האחרונות השקנו ממשקים חדשים ל-DSL ול-API שלנו, כדי לשלוט טוב יותר בממשקי ה-API שמוגדרים כגלויים לכולם. בגרסאות 7.x ו-8.x של AGP עדיין נעשה שימוש בסוגי ה-DSL הישנים (לדוגמה BaseExtension), שגם הטמיעו את הממשקים הציבוריים החדשים, כדי לשמור על תאימות בזמן שהעבודה על הממשקים התקדמה.

ב-AGP 9.0 נעשה שימוש בלעדי בממשקי ה-DSL החדשים שלנו, וההטמעות השתנו לסוגים חדשים שמוסתרים לחלוטין. הפעולה הזו גם מסירה את הגישה ל-API הישן של הווריאנט שהוצא משימוש.

כדי לעדכן ל-AGP 9.0, יכול להיות שתצטרכו לבצע את הפעולות הבאות:

  • מוודאים שהפרויקט תואם ל-Kotlin המובנה: הפלאגין org.jetbrains.kotlin.android לא תואם ל-DSL החדש.
  • מעבירים פרויקטים של KMP אל הפלאגין של ספריית Android Gradle ל-KMP: השימוש בפלאגין org.jetbrains.kotlin.multiplatform באותו פרויקט משנה של Gradle כמו הפלאגינים com.android.library ו-com.android.application לא תואם ל-DSL החדש.

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

  • עדכון הלוגיקה של ה-build בהתאמה אישית כך שתפנה ל-DSL ול-API החדשים: מחליפים את כל ההפניות ל-DSL הפנימי בממשקי ה-DSL הציבוריים. ברוב המקרים, ההחלפה תהיה אחד לאחד. צריך להחליף כל שימוש ב-applicationVariants ובממשקי API דומים ב-androidComponents API החדש. יכול להיות שזה יהיה מורכב יותר, כי ה-API של androidComponents נועד להיות יציב יותר כדי שהפלאגינים יהיו תואמים לאורך זמן. כאן יש דוגמאות למתכוני Gradle.

  • עדכון פלאגינים של צד שלישי: יכול להיות שחלק מהפלאגינים של צד שלישי עדיין תלויים בממשקים או בממשקי API שכבר לא חשופים. צריך לעבור לגרסאות של הפלאגינים האלה שתואמות ל-AGP 9.0.

המעבר לממשקי ה-DSL החדשים מונע מפלגינים ומסקריפטים של גרסאות build של Gradle להשתמש בממשקי API שונים שהוצאו משימוש, כולל:

API שיצא משימוש בבלוק android פונקציה החלפה
applicationVariants,
libraryVariants,
testVariants וגם
unitTestVariants
נקודות הרחבה לפלאגינים כדי להוסיף פונקציונליות חדשה ל-AGP. צריך להחליף את זה ב-API של androidComponents.onVariants, לדוגמה:
androidComponents {
    onVariants() { variant ->
        variant.signingConfig
            .enableV1Signing.set(false)
    }
}
יכול להיות שלא יהיה תחליף ישיר לכל ממשקי ה-API הקודמים. דווחו על בעיה אם יש תרחיש לדוגמה שלא נכלל בממשקי ה-API החדשים של הווריאנטים.
variantFilter מאפשרת להשבית וריאציות שנבחרו. מחליפים את זה ב-API של androidComponents.beforeVariants, לדוגמה:
androidComponents {
    beforeVariants(
        selector()
            .withBuildType("debug")
            .withFlavor("color", "blue")
    ) { variantBuilder ->
        variantBuilder.enable = false
    }
  }
deviceProvider וגם
testServer
רישום של סביבות בדיקה בהתאמה אישית להרצת בדיקות במכשירי Android ובאמולטורים. עוברים למכשירים בניהול Gradle.
sdkDirectory,
ndkDirectory,
bootClasspath,
adbExecutable וגם
adbExe
שימוש ברכיבים שונים של Android SDK למשימות בהתאמה אישית. עוברים אל androidComponents.sdkComponents.
registerArtifactType,
registerBuildTypeSourceProvider,
registerProductFlavorSourceProvider,
registerJavaArtifact,
registerMultiFlavorSourceProvider וגם
wrapJavaSourceSet
פונקציונליות מיושנת שקשורה בעיקר לטיפול במקורות שנוצרו ב-Android Studio, שהפסיקה לפעול ב-AGP 7.2.0. אין תחליף ישיר לממשקי ה-API האלה.
dexOptions הגדרות מיושנות שקשורות לכלי dx, שהוחלף על ידי d8. אף אחת מההגדרות לא משפיעה מאז גרסה 7.0 של הפלאגין של Android Gradle. אין תחליף ישיר.
generatePureSplits יצירת קובצי APK של הגדרות אישיות לאפליקציות ללא התקנה. היכולת לשלוח קובצי APK מפוצלים של הגדרות מובנית עכשיו בקובצי Android App Bundle.
aidlPackagedList קובצי AIDL לאריזה ב-AAR כדי לחשוף אותו כ-API לספריות ולאפליקציות שתלויות בספרייה הזו. האפשרות הזו עדיין חשופה ב- LibraryExtension אבל לא בסוגי התוספים האחרים.

אם אתם מעדכנים ל-AGP 9.0 ומופיעה הודעת השגיאה הבאה, זה אומר שהפרויקט עדיין מפנה לחלק מהסוגים הישנים:

java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension

אם אתם נתקלים בבעיות בגלל פלאגינים לא תואמים של צד שלישי, אתם יכולים לבטל את ההסכמה ולחזור להטמעות הישנות של ה-DSL, וגם ל-variant API הישן. במקביל, הממשקים החדשים זמינים גם כן, ואתם עדיין יכולים לעדכן את לוגיקת ה-build שלכם ל-API החדש. כדי לבטל את ההסכמה, צריך להוסיף את השורה הזו לקובץ gradle.properties:

android.newDsl=false

לחלופין, כדי לבצע העברה הדרגתית יותר, גרסה 9.4 של AGP מאפשרת לבטל את ההסכמה למודולים ספציפיים. איך מבטלים את ההסכמה לשימוש במודול Variant API

המחלקות הקודמות מסומנות כ"הוצאו משימוש" ב-AGP 9.0. כלומר, בפרויקטים שבהם לא משתמשים בדגל newDsl יוצגו אזהרות על הוצאה משימוש, כולל בבלוק android עצמו.

אתם יכולים גם להתחיל לשדרג לממשקי ה-API החדשים לפני השדרוג ל-AGP 9.0. הממשקים החדשים קיימים בהרבה גרסאות של AGP, כך שאפשר לשלב בין החדשים לישנים. במאמרי העזרה של ה-API של AGP מוצג ממשק ה-API של כל גרסת AGP, ומתי נוספו כל מחלקה, שיטה ושדה.

אנחנו פונים למפתחים של פלאגינים נפוצים כדי לעזור להם להתאים את הפלאגינים שלהם ולפרסם גרסאות שתואמות באופן מלא למצבים החדשים. בנוסף, נמשיך לשפר את AGP Upgrade Assistant ב-Android Studio כדי להדריך אתכם בתהליך המעבר.

אם אתם מגלים שחסרות יכולות או תכונות ב-DSL החדש או ב-Variant API, דווחו על בעיה בהקדם האפשרי.

‫Kotlin מובנית

בפלאגין של Android Gradle 9.0 יש תמיכה מובנית ב-Kotlin, והיא מופעלת כברירת מחדל. כלומר, לא צריך יותר להחיל את הפלאגין org.jetbrains.kotlin.android (או kotlin-android) בקובצי ה-build כדי לקמפל קובצי מקור של Kotlin. כך קל יותר לשלב את Kotlin עם AGP, לא צריך להשתמש בממשקי API שהוצאו משימוש, ובמקרים מסוימים הביצועים משתפרים.

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

אפשר גם להשבית באופן סלקטיבי את התמיכה המובנית ב-Kotlin בפרויקטי משנה של Gradle שאין להם מקורות ב-Kotlin.

תלות בזמן ריצה בפלאגין של Kotlin Gradle

כדי לספק תמיכה מובנית ב-Kotlin, לפלאגין של Android Gradle בגרסה 9.0 יש עכשיו תלות בזמן ריצה בפלאגין Kotlin Gradle‏ (KGP) בגרסה 2.2.10. זה אומר שאתם כבר לא צריכים להצהיר על גרסת KGP, ואם אתם משתמשים בגרסת KGP ישנה יותר מ-2.2.10, Gradle ישדרג באופן אוטומטי את גרסת ה-KGP ל-2.2.10. באופן דומה, אם אתם משתמשים בגרסה ישנה יותר של KSP, ‏AGP ישדרג אותה לגרסה 2.2.10-2.0.2 כדי להתאים לגרסת KGP.

שדרוג לגרסה מתקדמת יותר של KGP

כדי להשתמש בגרסה חדשה יותר של KGP או KSP, מוסיפים את מה שמופיע כאן למטה לקובץ ה-build ברמה העליונה:

buildscript {
    dependencies {
        // For KGP
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")

        // For KSP
        classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
    }
}

שדרוג לאחור לגרסה ישנה יותר של KGP

אפשר לשדרג לאחור את גרסת ה-KGP רק אם ביטלתם את ההסכמה ל-Kotlin המובנה. הסיבה לכך היא ש-AGP 9.0 מפעיל את Kotlin המובנה כברירת מחדל, ו-Kotlin המובנה דורש KGP 2.2.10 ואילך.

כדי להשתמש בגרסה ישנה יותר של KGP או KSP, צריך להצהיר על הגרסה הזו בקובץ ה-build ברמה העליונה באמצעות הצהרה על גרסה מחמירה:

buildscript {
    dependencies {
        // For KGP
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
            version { strictly("KGP_VERSION") }
        }

        // For KSP
        classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
            version { strictly("KSP_VERSION") }
        }
    }
}

שימו לב: הגרסה המינימלית של KGP שאפשר לשדרג לאחור אליה היא 2.0.0.

תמיכה ב-IDE במתקני בדיקה

ב-AGP 9.0 יש תמיכה מלאה ב-IDE של Android Studio במתקני בדיקה.

Fused Library Plugin

הפלאגין Fused Library (גרסת טרום-השקה) מאפשר לפרסם כמה ספריות כקובץ AAR אחד של ספריית Android. כך למשתמשים יהיה קל יותר להסתמך על פריטי המידע שפרסמתם.

במאמר פרסום כמה ספריות Android כספרייה אחת באמצעות Fused Library מוסבר איך להתחיל להשתמש בכלי.

שינויים בהתנהגות

בפלאגין של Android Gradle 9.0 יש את ההתנהגויות החדשות הבאות:

התנהגות המלצה
פלאגין של Android Gradle 9.0 משתמש ב-NDK בגרסה r28c כברירת מחדל. כדאי לציין במפורש את גרסת ה-NDK שבה רוצים להשתמש.
כברירת מחדל, הפלאגין של Android Gradle בגרסה 9.0 דורש מהמשתמשים בספרייה להשתמש באותה גרסה של SDK לקומפילציה או בגרסה גבוהה יותר. כשמשתמשים בספרייה, צריך להשתמש ב-SDK של קומפילציה זהה או גבוה יותר. אם זה לא אפשרי, או אם אתם רוצים לתת למשתמשים בספרייה שאתם מפרסמים יותר זמן לעבור, הגדירו את AarMetadata.minCompileSdk באופן מפורש.

‫AGP 9.0 כולל עדכונים לברירות המחדל של מאפייני Gradle הבאים. כך תוכלו לבחור אם לשמור על ההתנהגות של AGP 8.13 כשאתם משדרגים:

מאפיין (property) פונקציה שינוי מ-AGP 8.13 ל-AGP 9.0 המלצה
android.newDsl משתמשים בממשקי ה-DSL החדשים, בלי לחשוף את ההטמעות הקודמות של הבלוק android.
זה גם אומר שאי אפשר יותר לגשת לגרסה הקודמת של ה-API, כמו android.applicationVariants.
false ← true כדי לבטל את ההסכמה, צריך להגדיר את android.newDsl=false.
אחרי שכל הפלאגינים והלוגיקה של ה-build שהפרויקט משתמש בהם יהיו תואמים, צריך להסיר את ההחרגה.
android.builtInKotlin הפעלת Kotlin מובנה false ← true עוברים ל-Kotlin מובנה אם אפשר, או מבטלים את ההסכמה.
android.uniquePackageNames אוכף שלכל ספרייה יהיה שם חבילה ייחודי. false ← true צריך לציין שמות חבילות ייחודיים לכל הספריות בפרויקט. אם זה לא אפשרי, אתם יכולים להשבית את הדגל הזה בזמן ההעברה.
android.useAndroidx שימוש ביחסי תלות של androidx כברירת מחדל. false ← true להשתמש ביחסי התלות של androidx.
android.default.androidx.test.runner הרצת בדיקות במכשיר באמצעות המחלקה androidx.test.runner.AndroidJUnitRunner כברירת מחדל, במקום ברירת המחדל של המחלקה שהוצאה משימוש InstrumentationTestRunner עבור
android {
  defaultConfig {
    testInstrumentationRunner = "..."
  }
}
false ← true צריך להשתמש ב-AndroidJUnitRunner או לציין את ה-testInstrumentationRunner המותאם אישית באופן מפורש.
android.dependency.useConstraints המדיניות קובעת את השימוש באילוצי תלות בין הגדרות אישיות.
ברירת המחדל ב-AGP 9.0 היא false, שמשתמשת באילוצים רק בבדיקות של מכשירי אפליקציה (AndroidTest). אם מגדירים את המדיניות הזו לערך true, ההתנהגות חוזרת לזו של גרסה 8.13.
true ← false אל תשתמשו באילוצי תלות בכל מקום, אלא רק אם אתם צריכים אותם. אם מאשרים את ברירת המחדל החדשה של הדגל הזה, מופעלות גם אופטימיזציות בתהליך הייבוא של הפרויקט, שאמורות לקצר את זמן הייבוא של גרסאות build עם הרבה פרויקטי משנה של ספריית Android.
android.enableAppCompileTimeRClass הידור קוד באפליקציות מול מחלקת R לא סופית, כך שהידור האפליקציה תואם להידור הספרייה.
כך אפשר לשפר את המצטברות ולהכין את הקרקע לאופטימיזציות עתידיות של הביצועים בתהליך עיבוד המשאבים.
false ← true בפרויקטים רבים אפשר פשוט לאמץ את ההתנהגות החדשה בלי לשנות את המקור. אם משתמשים בשדות של מחלקת R במקום שנדרש בו קבוע, כמו מקרים של switch, צריך לארגן את הקוד מחדש כך שישתמש בהצהרות if משורשרות.
android.sdk.defaultTargetSdkToCompileSdkIfUnset שימוש בגרסת ה-SDK של הקומפיילר כערך ברירת המחדל של גרסת ה-SDK המטורגטת באפליקציות ובבדיקות.
לפני השינוי הזה, גרסת ה-SDK המטורגטת הייתה מוגדרת כברירת מחדל לגרסת ה-SDK המינימלית.
false ← true ציינו במפורש את גרסת ה-SDK המטורגטת לאפליקציות ולבדיקות.
android.onlyEnableUnitTestForTheTestedBuildType יוצר רק רכיבים של בדיקות יחידה לסוג ה-build שנבדק.
בפרויקט ברירת המחדל, התוצאה היא בדיקת יחידה אחת לניפוי באגים, כשההתנהגות הקודמת הייתה להריץ בדיקות יחידה לניפוי באגים או לגרסה.
false ← true אם בפרויקט שלכם לא צריך להריץ בדיקות גם לניפוי באגים וגם להפצה, לא צריך לשנות שום דבר.
android.proguard.failOnMissingFiles ה-build נכשל עם שגיאה אם אחד מקובצי השמירה שצוינו ב-AGP DSL לא קיים בדיסק. לפני השינוי הזה, שגיאות הקלדה בשמות הקבצים גרמו לכך שהמערכת התעלמה מהקבצים בלי להציג הודעה. false ← true מסירים הצהרות לא חוקיות של קובצי ProGuard
android.r8.optimizedResourceShrinking ‫R8 יכול לשמור פחות משאבי Android על ידי התחשבות במחלקות ובמשאבי Android ביחד. false ← true אם כללי השמירה של הפרויקט כבר מלאים, לא צריך לבצע שינויים.
android.r8.strictFullModeForKeepRules מאפשר ל-R8 לשמור פחות על ידי אי שמירה משתמעת של constructor ברירת המחדל כשכיתה נשמרת. כלומר, -keep class A לא מרמז יותר על -keep class A { <init>(); }
false ← true אם כללי השמירה של הפרויקט כבר מלאים, לא צריך לבצע שינויים.

מחליפים את -keep class A ב- -keep class A { <init>(); } בכללי השמירה של הפרויקט בכל המקרים שבהם צריך לשמור את ה-constructor שמוגדר כברירת מחדל.
android.defaults.buildfeatures.resvalues הפעלת resValues בכל פרויקטי המשנה true ← false מפעילים את resValues רק בתת-הפרויקטים שבהם צריך אותו, על ידי הגדרת הפרטים הבאים בקובצי ה-build של Gradle בפרויקטים האלה:
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders הפעלת הידור של תוכנת הצללה בכל פרויקטי המשנה true ← false כדי להפעיל הידור של שיידרים רק בפרויקטי המשנה שמכילים שיידרים שצריך להדר, מגדירים את מה שמופיע כאן למטה בקובצי ה-build של Gradle בפרויקטים האלה:
android {
  buildFeatures {
    shaders = true
  }
}
android.r8.proguardAndroidTxt.disallowed ב-AGP 9.0, getDefaultProguardFile() יתמוך רק ב-proguard-android-optimize.txt ולא ב-proguard-android.txt. כדי למנוע שימוש מקרי בדגל ­dontoptimize, שכלול ב-proguard-android.txt. false ← true אם אתם רוצים להימנע מאופטימיזציה, אתם יכולים לציין במפורש את ­dontoptimize ב-proguardFile בהתאמה אישית, לצד השימוש ב-proguard-android-optimize.txt. אם אפשר, חשוב להסיר את הדגל ­dontoptimize מהקובץ הזה, כי הוא מפחית את היתרונות של האופטימיזציה של R8. אם לא, צריך לבטל את ההסכמה על ידי הגדרת android.r8.globalOptionsInConsumerRules.disallowed=false.
android.r8.globalOptionsInConsumerRules.disallowed החל מגרסה 9.0 של AGP, פרסום של ספריית Android ושל מודול של תכונות ייכשל אם קובצי השמירה של הצרכן מכילים הגדרות Proguard בעייתיות. קבצי Consumer keep שכוללים אפשרויות גלובליות כמו ­dontoptimize או ­dontobfuscate צריכים לשמש רק במודולים של אפליקציות, והם יכולים להפחית את יתרונות האופטימיזציה למשתמשי הספרייה. הידור של מודול אפליקציה ל-Android יתעלם באופן אוטומטי מהגדרות גלובליות כאלה אם הן מוטמעות ביחסי תלות שעברו הידור מראש (JAR או AAR). כדי לראות מתי זה קורה, אפשר לבדוק את configuration.txt (בדרך כלל בנתיב כמו <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) ולחפש הערות כמו: # REMOVED CONSUMER RULE: ­dontoptimize false ← true בספריות שפורסמו, צריך להסיר את כל הכללים שלא תואמים. בספריות פנימיות, צריך להעביר את כל הכללים הנדרשים שלא תואמים ל-proguardFile במודול של האפליקציה. כדי לבטל את ההסכמה, צריך להגדיר את android.r8.globalOptionsInConsumerRules.disallowed=false. אחרי שכל הקבצים שלכם בגרסה הפרטית של Keep יהיו תואמים, הסירו את ההחרגה.
android.sourceset.disallowProvider לא לאפשר העברת ספקים למקורות שנוצרו באמצעות AndroidSourceSet DSL. false ← true משתמשים ב-API‏ Sources ב-androidComponents כדי לרשום מקורות שנוצרו.
android.custom.shader.path.required אם הפעלתם את הידור ה-shader, אתם צריכים להגדיר במפורש את הנתיב של מהדר ה-shader ב-local.properties. false ← true מוסיפים את glslc.dir=/path/to/shader-tools ל-local.properties של הפרויקט.

תכונות שהוסרו

בגרסה 9.0 של הפלאגין של Android Gradle הוסרו הפונקציות הבאות:

  • תמיכה באפליקציות מוטמעות ל-Wear OS
    ב-AGP 9.0 הוסרה התמיכה בהטמעת אפליקציות ל-Wear OS, שכבר לא נתמכת ב-Play. זה כולל הסרה של ההגדרות של wearApp ושל ה-DSL של AndroidSourceSet.wearAppConfigurationName. במאמר הפצה ל-Wear OS מוסבר איך לפרסם את האפליקציה ב-Wear OS.
  • androidDependencies ו-sourceSets מדווחים על משימה
  • תמיכה ב-APK מפוצל לפי צפיפות
    ב-AGP 9.0 הוסרה התמיכה ביצירת קובצי APK מפוצלים לפי צפיפות המסך. הפונקציונליות וממשקי ה-API הקשורים הוסרו. כדי לפצל קובצי APK מפוצלים על סמך דחיסות המסך באמצעות AGP בגרסה 9.0 ואילך, צריך להשתמש בקובצי AAB.

DSL שהשתנה

בפלאגין של Android Gradle 9.0 יש את השינויים הבאים ב-DSL:

  • הפרמטריזציה של CommonExtension הוסרה.

    כשלעצמו, זהו רק שינוי תוכנה שעלול לגרום לכשל ברמת המקור כדי לעזור להימנע משינויי תוכנה שעלולים לגרום לכשל ברמת המקור בעתיד, אבל זה גם אומר שצריך להעביר את השיטות של הבלוקים מ-CommonExtension אל ApplicationExtension, ‏ LibraryExtension,‏ DynamicFeatureExtension ו-TestExtension.

    כשמשדרגים את הפרויקט ל-AGP 9.0, צריך לארגן את הקוד מחדש של הפלאגין של Gradle שמשתמש בפרמטרים האלה או בשיטות הבלוק. לדוגמה, הפלאגין הבא מעודכן כך שהוא מסיר את הפרמטר type ולא מסתמך על השיטות של הבלוק שהוסר:

    AGP 8.13

    val commonExtension: CommonExtension<*, *, *, *, *, *> =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig {
            minSdk {
                version = release(28)
            }
        }
    }
    

    ‫AGP 9.0

    val commonExtension: CommonExtension =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig.apply {
            minSdk {
                version = release(28)
            }
        }
    }
    

    בפלאגינים שמטרגטים מגוון גרסאות של AGP, שימוש ישיר ב-getter תואם בינארית לגרסאות AGP ישנות יותר מ-9.0.

הסרת DSL

בפלאגין של Android Gradle 9.0 הוסרו:

ממשקי API שהוסרו

בפלאגין של Android Gradle 9.0 הוסרו:

מאפייני Gradle שהוסרו

המאפיינים הבאים של Gradle נוספו בהתחלה כדרכים להשבית באופן גלובלי תכונות שהופעלו כברירת מחדל.

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

מאפיין (property) פונקציה החלפה
android.defaults.buildfeatures.aidl הפעלת הידור AIDL בכל פרויקטי המשנה מפעילים את הידור ה-AIDL רק בפרויקטי המשנה שבהם יש מקורות AIDL, על ידי הגדרת המאפיין הבא בקובצי ה-build של Gradle בפרויקטים האלה:
android {
  buildFeatures {
    aidl = true
  }
}
בקובץ ה-build של Gradle בכל פרויקט משנה שמכיל מקורות AIDL
android.defaults.buildfeatures.renderscript הפעלת הידור RenderScript בכל פרויקטי המשנה מפעילים את הידור ה-renderscript רק בפרויקטי המשנה שבהם יש מקורות renderscript, על ידי הגדרת המאפיין הבא בקובצי ה-build של Gradle בפרויקטים האלה:
android {
  buildFeatures {
    renderScript = true
  }
}

מאפייני Gradle שנאכפים

אם מגדירים את מאפייני Gradle הבאים, AGP 9.0 מקפיץ שגיאה.

מסייע השדרוג של הפלאגין של Android Gradle לא ישדרג ל-AGP 9.0 פרויקטים שמשתמשים במאפיינים האלה.

מאפיין (property) פונקציה
android.r8.integratedResourceShrinking כיווץ מקורות המידע פועל עכשיו תמיד כחלק מ-R8, וההטמעה הקודמת הוסרה.
android.enableNewResourceShrinker.preciseShrinking כיווץ מקורות המידע מתבצע עכשיו תמיד באופן מדויק, מה שמאפשר להסיר יותר מקורות מידע.

שינויים ב-R8

השינויים הבאים ב-R8 כלולים ב-AGP 9.0.0.

אפשרות הגדרה חדשה -processkotlinnullchecks

הוספנו את האפשרות החדשה -processkotlinnullchecks ב-R8 כדי להגדיר את R8 לעיבוד בדיקות null ב-Kotlin. האפשרות מקבלת ארגומנט חובה שחייב להיות אחד משלושת הערכים הבאים: keep, ‏ remove_message ו-remove. האפשרות הזו מעבדת את בדיקות הערכים הריקים הבאות שנוספו על ידי המהדר של Kotlin:

class kotlin.jvm.internal.Intrinsics {
  void checkNotNull(java.lang.Object);
  void checkNotNull(java.lang.Object, java.lang.String);
  void checkExpressionValueIsNotNull(
      java.lang.Object, java.lang.String);
  void checkNotNullExpressionValue(
      java.lang.Object, java.lang.String);
  void checkReturnedValueIsNotNull(
      java.lang.Object, java.lang.String);
  void checkReturnedValueIsNotNull(
      java.lang.Object, java.lang.String, java.lang.String);
  void checkFieldIsNotNull(java.lang.Object, java.lang.String);
  void checkFieldIsNotNull(
      java.lang.Object, java.lang.String, java.lang.String);
  void checkParameterIsNotNull(java.lang.Object, java.lang.String);
  void checkNotNullParameter(java.lang.Object, java.lang.String);
}

הערכים של האפשרויות, מהחלש ביותר לחזק ביותר, משפיעים באופן הבא:

  • הבדיקות לא משתנות ב-keep.
  • ‫remove_message משכתב כל הפעלת method של בדיקה לקריאה ל-getClass() בארגומנט הראשון של הקריאה (למעשה, שומר על בדיקת ה-null, אבל בלי הודעה).
  • האפשרות remove מסירה את הבדיקות לגמרי.

כברירת מחדל, R8 משתמש ב-remove_message. כל מפרט של -processkotlinnullchecks יבטל את זה. אם מציינים את המדיניות כמה פעמים, המערכת משתמשת בערך החזק ביותר.

הפסקת ההפצה של פרטי השמירה לשיטות נלוות

כשכללי השמירה תואמים לשיטות ממשק שכפופות לתהליך הסרה של סוכר תחבירי, R8 העביר בעבר באופן פנימי את הביטים disallow optimization ו-disallow shrinking לשיטות הנלוות המסונתזות.

החל מ-AGP 9.0, כללי השמירה לא חלים יותר על שיטות נלוות. זה עקבי עם העובדה שכללי השמירה לא רלוונטיים לשדות, שיטות או כיתות אחרים שנוצרו על ידי הקומפיילר.

העברת הביטים disallow optimization ו-disallow shrinking ל-methods הנלוות, תמכה בעבר בתרחיש לדוגמה הבא:

  1. הידור של ספרייה עם שיטות ממשק של default/static/private ל-DEX עם minSdk < 24 וכללים ששומרים על שיטות הממשק.
  2. הידור של אפליקציה עם הספרייה ב-classpath וב--applymapping.
  3. ממזגים את האפליקציה והספרייה.

שימו לב שהפעולה הזו פועלת רק עם -applymapping כי הביט disallow obfuscation לא מועבר לשיטות הנלוות – כלומר, למחלקות הנלוות שנוצרו בשלב 1 יהיו שמות שיטות מעורפלים.

מעכשיו, התרחיש הזה לא נתמך יותר בגרסאות minSdk < 24. כדי לעקוף את הבעיה:

  1. הסרת סוכר תחביר מהספרייה עם שיטות ממשק default/static/private לקובצי כיתה עם minSdk < 24.
  2. מבצעים קומפילציה של פריט המידע שנוצר בתהליך ההסרה של סוכר תחבירי באמצעות R8 וכללים ששומרים את השיטות של הממשק במחלקות הנלוות.
  3. הידור האפליקציה עם הספרייה ב-classpath.
  4. ממזגים את האפליקציה ואת פריט המידע שהוסר ממנו הסוכר התחבירי.

תופעת לוואי נוספת היא שכבר אי אפשר לשמור את המאפיינים של המחלקה הפנימית והשיטה המקיפה של מחלקות אנונימיות ומקומיות בתוך שיטות נלוות של ממשק.

שינוי קובץ המקור שמופק כברירת מחדל ל-r8-map-id-<MAP_ID>

השינוי הזה קיים ב-AGP החל מגרסה 8.12.0.

מאפיין קובץ המקור שמופק כברירת מחדל למחלקה משתנה מ-SourceFile ל-r8-map-id-<MAP_ID> כשנדרש מעקב חוזר (כלומר, כשהערפול או האופטימיזציה מופעלים).

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

אם משתמשים במאפיין קובץ מקור מותאם אישית (-renamesourcefileattribute), המאפיין הזה ממשיך לקבל קדימות.

במצב תאימות של ProGuard (כאשר gradle.properties מכיל את android.enableR8.fullMode=false), פליטת מאפיין קובץ מקור של r8-map-id-<MAP_ID> נכנסת לתוקף רק אם המאפיין SourceFile לא נשמר. באפליקציות שמשתמשות במצב תאימות של ProGuard ורוצות לכלול את מזהה קובץ המיפוי בדוחות הקריסות, צריך להסיר את -keepattributes SourceFile (או לעבור למצב מלא של R8).

מזהה המפה שמשמש ב-r8-map-id-<MAP_ID> הוא הגיבוב המלא של המפה, ולא תחילית של 7 תווים של גיבוב המפה ששימשה בעבר.

הפעלת השימוש בשמות סינתטיים ממוזערים בתהליך הסרה של סוכר תחבירי ב-L8

השם של מחלקות סינתטיות שנוצרו על ידי D8 מכיל בדרך כלל את מחרוזת המשנה $$ExternalSynthetic, שמציינת שמדובר במחלקה סינתטית שנוצרה על ידי D8. בנוסף, השם של הגורם הסינתטי מקודד גם את סוג הגורם הסינתטי (לדוגמה, Backport, Lambda). זה משפיע לרעה על הגודל של קובץ ה-DEX שנוצר, כי שמות המחלקות תופסים יותר מקום במאגר המחרוזות.

‫AGP 9.0 מגדיר את L8 (תהליך הסרה של סוכר תחבירי בספריית הליבה) כך שקובץ ה-DEX שמכיל את כל המחלקות של j$ משתמש בפורמט חדש ומקוצר של שמות מחלקות בשביל מחלקות סינתטיות. שם הכיתה החדש משתמש במזהה מספרי (לדוגמה, $1).

הסרת התמיכה ב--addconfigurationdebugging

ב-AGP 9.0 אין יותר תמיכה ב--addconfigurationdebugging. עכשיו המהדר מדווח על אזהרה אם משתמשים בדגל.

הסרת התמיכה ביצירת כללי L8 מ-D8/R8

השינוי הזה רלוונטי רק למפתחים שמשתמשים בשורת הפקודה של D8/R8 או בממשקי API באופן ישיר.

בגרסה R8 9.0, אנחנו מסירים את התמיכה ביצירת כללי שמירה ל-L8 מ-D8 ומ-R8. במקום זאת, צריך להשתמש ב-TraceReferences למטרה הזו.

באופן ספציפי יותר, השיטות D8Command.builder.setDesugaredLibraryKeepRuleConsumer ו-R8Command.Builder.setDesugaredLibraryKeepRuleConsumer הוסרו, והתמיכה ב---desugared-lib-pg-conf-output הוסרה מהאפשרויות של שורת הפקודה של D8 ו-R8.

בעיות שתוקנו

פלאגין של Android Gradle‏ 9.0.0

בעיות שתוקנו
פלאגין של Android Gradle
הגשת בקשה להוספת תכונה: הוספת גרסת AGP אידיאלית כמאפיין
ייצוב SingleArtifact.VERSION_CONTROL_INFO_FILE
פלט ה-logcat של androidTest connectedCheck לא תקין
תמיכה מובנית ב-Kotlin ב-AGP לא אמורה להסתנכרן עם קבוצות המקורות של Kotlin
‫missingDimensionStrategy מעדיפה גרסה שתואמת לשם שלה, גם אם היא ממאפיין לא קשור
תמיכה מובנית ב-Kotlin ב-AGP לא אמורה להסתנכרן עם קבוצות המקורות של Kotlin
‫AGP 9.0.0-rc01 לא פותר ספריות Kotlin באמצעות הפונקציה kotlin()‎
‫Built-in-kotlin לא מפרסם אילוץ תלות של kotlin-stdlib ב-maven pom
הוספת מקרה בדיקה להבדל בין compileSdk ל-targetSdk
ערך resConfigs ריק מוביל לשגיאת aapt לא ברורה
פרויקט Java טהור תלוי ב-kotlin stdlib.
‫הסרת מאפיינים שיצאו משימוש של KotlinMultiplatformAndroidCompilationBuilder ב-AGP 9.0
ל-`com.android.tools.build:gradle:9.0.0-alpha05` צריכה להיות תלות ב-API ב-KGP וב-gradle-api
שינוי השם של הפלאגין com.android.experimental.built-in-kotlin Gradle
‫AGP9: הפונקציה `variant.sources.kotlin!!.addGeneratedSourceDirectory()` לא פועלת
בדיקות המטא-נתונים של Aar ב-compile Sdk משתמשות ב-DSL הישן
הסרת המאפיין `com.android.build.api.dsl.ManagedDevices.devices` שהוצא משימוש
תמיכה מובנית ב-Kotlin ב-AGP לא אמורה להסתנכרן עם קבוצות המקורות של Kotlin
נכשל פרסום ספריית Android אם קובץ השמירה של הצרכן מכיל את ‎-dontobfuscate
אין אפשרויות להדפסת מיפוי של משאבים שעברו אופטימיזציה
הגדרת שגיאה בקריאה ל-finalizeDsl אחרי שהשלב הזה עבר
‫AGP מאתחל את ההגדרות של Jetifier גם כשהוא מושבת
‫built in kotlin לא מוסיף את kotlinStdlib כתלות בזמן הידור כש-`kotlin.stdlib.default.dependency` מוגדר כ-true לקובצי מודול ו-pom
‫DSL חדש לאופטימיזציה לא יוצר את הקובץ configuration.txt כברירת מחדל
‫AGP 8.13.0 נכשל באימות של תרשים הניווט במודול
‫AGP משתמש ב-Gradle API שהוצא משימוש: סימון של כמה מחרוזות
הצגת אזהרה למשתמשים שמנסים להשתמש בספריית multidex מדור קודם עם minSdkVersion >=21
ה-build נכשל אם יש משימות ליצירת קוד
אם android.builtInKotlin=false,‏ android.newDsl=false ו-android.enableLegacyVariantApi=false, השימוש בפלאגין kotlin-android ייכשל עם ההודעה "API 'applicationVariants' is obsolete"
‫Kotlin המובנה לא מצליח לפתור את kotlin-stdlib ללא גרסה כש-kotlin.stdlib.default.dependency=false
‫DexData פותח קובץ בלי לסגור אותו, ומונע ניקוי
‫AndroidSourceDirectorySet לא אמור להרחיב יותר את PatternFilterable ב-AGP 9.0
שגיאה במתקן הבדיקה במודולים לבדיקה בלבד
שגיאה לא נכונה כשמשתמשים במקלטי הקשר במתקני בדיקה
שגיאות IDE שגויות בקוד Kotlin ב-testFixtures
הפלאגין `legacy-kapt` מדלג על עיבוד אנוטציות, בניגוד ל-`kotlin-kapt`
‫compileSdkSpec.minorApiLevel לא עובד עם SettingsExtension
[fused lib - public] Generated fused library does not include sources
הערכים extractNativeLibs ו-useEmbeddedDex לא צריכים להגיע מהמניפסט
אזהרות מ-R8 ב-AGP 9.0.0-alpha09
הסרת AndroidSourceSet.jni שהוצא משימוש ב-AGP 9.0
הסרת Installation.installOptions()‎ ב-AGP 9.0
הסרת BuildType.isRenderscriptDebuggable ב-AGP 9.0.
הסרת android.defaults.buildfeatures.renderscript
קריסות של `com.android.kotlin.multiplatform.library` במכשירים בניהול Gradle
הסרת דגלי ברירת המחדל של gradle.properties ב-`android.defaults.buildfeatures.aidl`
ה-build נכשל כשקובץ proguard לא קיים
הסרת דגלי ברירת המחדל של buildconfig בקובץ gradle.properties
משנים את ערך ברירת המחדל של targetSdk באפליקציה כך שיתבסס על compileSdk במקום על minSdk
כשהאפשרות `isIncludeAndroidResources` מופעלת, הפונקציה `process{Variant}UnitTestManifest` לא מצליחה למזג את השימושים ב-tools:overrideLibrary ב-AGP 8.12.0
‫AGP גורם לאזהרות על הוצאה משימוש ב-Gradle למשימות בדיקה של JVM
‫DependencyReportTask לא תואם למטמון ההגדרות האישיות
מעבר מגרסת ברירת המחדל של Java 8 לגרסת Java 11 ב-AGP 9.0
שינוי ברירת המחדל של android.useAndroidX ל-true
חריגה טובה יותר כשמחילים פלאגין kapt עם Kotlin מובנה.
ההגדרה android.proguard.failOnMissingFiles לא פועלת ב-consumerProguardFiles
עדכון יחסי התלות של הפלאגין Kotlin Gradle לגרסה 2.2.10
יצירת KotlinJvmAndroidCompilation באמצעות KGP API
מצב API מפורש של Kotlin הוחל על מקורות בדיקה
Lint
‫AGP 8.11.0: המשימה lintAnalyzeRelease קורסת כשמחילים קובצי ‎ .gradle.kts באמצעות apply(from = "...")‎
בדיקת Lint ChecksSdkIntAtLeast לא בודקת אם הערך שנוספה לו הערה נכון
‫Kotlin המובנה לא מוסיף את ‎ .kotlin_module ל-META-INF
ה-classpath של Lint מכיל מחלקות כפולות בגרסאות שונות
הפתרון העקיף לשינוי משאבים פרטיים לא עובד (tools:override = "true")
באג: הסרה של משאבים שלא בשימוש לא מסירה גם את התרגומים שלהם, וגם לא שואלת על כך
‫Lint מקפיץ את האזהרה "Could not clean up K2 caches" (לא ניתן לנקות את המטמונים של K2)
‫Lint מקפיץ את האזהרה "Could not clean up K2 caches" (לא ניתן לנקות את המטמונים של K2)
שילוב Lint
אי מציאה במטמון של AndroidLintAnalysisTask בין ספקים שונים של JDK או גרסאות משניות בגלל הבדלים ב-systemPropertyInputs.javaVersion
‫Lint משתמש באופן אוטומטי ב-SDK העדכני ביותר שמותקן למרות compileSdk, לא נרשם כקלט של משימה ומשבש את השמירה במטמון
כלי לכיווץ (R8)
כיווץ מקורות המידע שעבר אופטימיזציה של R8 נכשל בלי להציג הודעה אם משתמשים במזהי מקורות מידע סופיים