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

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

כדי לעדכן לפלאגין Android Gradle‏ ‎9.0.0, צריך להשתמש בכלי העזר לשדרוג פלאגין Android Gradle.

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

תאימות

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

גרסת המינימום גרסת ברירת המחדל הערות
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.

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

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

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

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

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

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

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

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

המעבר לממשקי ה-DSL החדשים מונע שימוש בפלאגינים ובסקריפטים של Gradle build במגוון ממשקי 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 יצירת פיצולים של הגדרות לאפליקציות ללא התקנה. האפשרות לשלוח פיצולים של הגדרות מובנית עכשיו בחבילות של אפליקציות ל-Android.
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, וגם ל-API הישן של הווריאנטים. במהלך התקופה הזו, הממשקים החדשים יהיו זמינים, ותוכלו לעדכן את לוגיקת ה-build שלכם ל-API החדש. כדי לבטל את ההגדרה של הקובץ, מוסיפים לתג את השורה הבאה:gradle.properties

android.newDsl=false

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

במהלך שלב האלפא של גרסה 9.0, אנחנו פונים ליוצרי פלאגינים כדי לעזור להם להתאים ולפרסם פלאגינים שתואמים באופן מלא למצבים החדשים, ונשפר את כלי העזרה לשדרוג AGP ב-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 נמוכה מ-2.2.10-2.0.2, ‏ 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.devtoolsksp: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.devtoolsksp:symbol-processing-gradle-plugin") {
            version { strictly("KSP_VERSION") }
        }
    }
}

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

תמיכה ב-IDE עבור test fixtures

‫AGP 9.0 כולל תמיכה מלאה ב-IDE של Android Studio בtest fixtures.

תוסף Fused Library

התוסף Fused Library Plugin (גרסת Preview) מאפשר לכם לפרסם כמה ספריות כספריית Android אחת מסוג AAR. כך יהיה קל יותר למשתמשים להסתמך על הארטיפקטים שפרסמתם.

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

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

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

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

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

נכס פעולה שינוי מ-AGP 8.13 ל-AGP 9.0 המלצה
android.newDsl שימוש בממשקי ה-DSL החדשים, בלי לחשוף את ההטמעות הקודמות של בלוק android.
המשמעות היא גם שאי אפשר יותר לגשת לגרסה הקודמת של Variant API, כמו android.applicationVariants.
false‏ ← true אפשר לבטל את ההצטרפות על ידי הגדרת android.newDsl=false.
אחרי שמוודאים שכל הפלאגינים והלוגיקה של הבנייה שבהם נעשה שימוש בפרויקט תואמים, מסירים את ההסכמה.
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 ‫Adopt AndroidJUnitRunner, או מציינים במפורש את testInstrumentationRunner המותאם אישית.
android.dependency.useConstraints ההגדרה הזו קובעת את השימוש באילוצי תלות בין תצורות.
ברירת המחדל ב-AGP 9.0 היא false, שמשתמשת רק באילוצים בבדיקות של מכשירי אפליקציה (AndroidTest). הגדרת הערך true תחזיר את ההתנהגות של גרסה 8.13.
true‏ ← false אל תשתמשו באילוצי תלות בכל מקום אלא אם אתם צריכים אותם. אם מאשרים את ברירת המחדל החדשה של הדגל הזה, מופעלות גם אופטימיזציות בתהליך ייבוא הפרויקט, וכך זמן הייבוא של גרסאות build עם הרבה פרויקטים משניים של ספריות Android מתקצר.
android.enableAppCompileTimeRClass הידור קוד באפליקציות מול מחלקת R לא סופית, כדי שהידור האפליקציה יהיה זהה להידור הספרייה.
השינוי הזה משפר את המדד 'המרות מצטברות' וסולל את הדרך לשיפורים עתידיים בביצועים של תהליך עיבוד המשאבים.
false‏ ← true בפרויקטים רבים אפשר פשוט לאמץ את ההתנהגות החדשה בלי לבצע שינויים בקוד המקור. אם משתמשים בשדות של מחלקת R במקומות שבהם נדרש קבוע, כמו במקרים של switch, צריך לבצע refactoring כדי להשתמש בהצהרות 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>(); } בכללים לשמירה של הפרויקט, בכל המקרים שבהם צריך לשמור את בנאי ברירת המחדל.
android.defaults.buildfeatures.resvalues הפעלת resValues בכל פרויקטי המשנה true‏ ← false מפעילים את resValues רק בפרויקטים המשניים שזקוקים לו, על ידי הגדרת הפקודה הבאה בקובצי ה-build של Gradle של הפרויקטים האלה:
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders הפעלת קומפילציה של Shader בכל פרויקטי המשנה true‏ ← false כדי להפעיל קומפילציה של Shader רק בפרויקטים משניים שמכילים Shader שצריך לקמפל, מגדירים את האפשרות הבאה בקובצי ה-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 מגרסה AGP 9.0 ואילך, פרסום של ספריות Android ומודולים של תכונות ייכשל אם קובצי השמירה על נתונים של צרכנים מכילים הגדרות בעייתיות של Proguard. קובצי צרכן שכוללים אפשרויות גלובליות כמו ­dontoptimize או ­dontobfuscate צריכים לשמש רק במודולים של אפליקציות, והם עלולים להפחית את היתרונות של האופטימיזציה למשתמשי הספריות. אם אפשרויות גלובליות כאלה מוטמעות בתלות שעברה קומפילציה מראש (JAR או AAR), המערכת תתעלם מהן בשקט במהלך הקומפילציה של מודול אפליקציית Android. כדי לראות מתי זה קורה, אפשר לבדוק את הקובץ 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 compilation, צריך להגדיר באופן מפורש את הנתיב של מהדר shader ב-local.properties. false‏ ← true מוסיפים את glslc.dir=/path/to/shader-tools ל-local.properties של הפרויקט.

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

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

  • התמיכה בהטמעת אפליקציות ל-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 ואילך, צריך להשתמש בחבילות App Bundle.

שינוי ב-DSL

בפלאגין Android Gradle בגרסה 9.0 בוצעו שינויים הבאים ב-DSL שעלולים לגרום לכשלים:

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

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

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

    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 ומטה. כדי ליצור בנייה יעילה יותר, מומלץ להפעיל את התכונות האלה רק בפרויקטים המשניים שמשתמשים בהן.

נכס פעולה החלפה
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 שנאכפים

‫AGP 9.0 מחזיר שגיאה אם מגדירים את מאפייני Gradle הבאים.

הכלי Android Gradle plugin Upgrade Assistant לא ישדרג פרויקטים ל-AGP 9.0 שמשתמשים במאפיינים האלה.

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

שינויים ב-R8

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

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

הוספנו את האפשרות החדשה R8 -processkotlinnullchecks להגדרת R8 לעיבוד בדיקות של ערכי null ב-Kotlin. האפשרות מקבלת ארגומנט חובה שצריך להיות אחד משלושת הערכים הבאים: keep, ‏ remove_message ו-remove. האפשרות הזו מעבדת את בדיקות ה-null הבאות שנוספו על ידי מהדר 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 כותב מחדש כל קריאה של שיטת בדיקה לקריאה אל ‫getClass() בארגומנט הראשון של הקריאה (למעשה, הבדיקה של הערך null נשמרת, אבל בלי הודעה).
  • remove מסיר את הבדיקות לחלוטין.

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

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

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

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

העברת הביטים disallow optimization ו-disallow shrinking לשיטות הנלוות אפשרה בעבר את תרחיש השימוש הבא:

  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. קומפילציה של האפליקציה עם הספרייה בנתיב המחלקה.
  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 ורוצות לכלול את מזהה קובץ המיפוי ב-stack traces שלהן צריכות להסיר את -keepattributes SourceFile (או לעבור למצב מלא של R8).

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

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

השם של מחלקות סינתטיות שנוצרות על ידי 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-rc03

בעיות שתוקנו
Android Gradle Plugin
‫AGP 9.0.0-rc01 לא פותר ספריות של Kotlin באמצעות הפונקציה kotlin()‎

פלאגין Android Gradle‏ ‎9.0.0-rc02

בעיות שתוקנו
לא סומנו בעיות ציבוריות כבעיות שתוקנו ב-AGP 9.0.0-rc02

פלאגין Android Gradle‏ ‎9.0.0-rc01

בעיות שתוקנו
לא סומנו בעיות ציבוריות כבעיות שתוקנו ב-AGP 9.0.0-rc01

פלאגין Android Gradle‏ ‎9.0.0-beta05

בעיות שתוקנו
Android Gradle Plugin
התמיכה המובנית ב-Kotlin ב-AGP לא אמורה להסתנכרן עם ערכות המקור של Kotlin

פלאגין Android Gradle‏ ‎9.0.0-beta04

בעיות שתוקנו
Android Gradle Plugin
התמיכה המובנית ב-Kotlin ב-AGP לא אמורה להסתנכרן עם ערכות המקור של Kotlin
האסטרטגיה missingDimensionStrategy מעדיפה טעם שתואם לשם שלה, גם אם מדובר במאפיין לא קשור

פלאגין Android Gradle‏ ‎9.0.0-beta03

בעיות שתוקנו
לא סומנו בעיות ציבוריות כבעיות שתוקנו ב-AGP 9.0.0-beta03

פלאגין Android Gradle‏ ‎9.0.0-beta02

בעיות שתוקנו
Android Gradle Plugin
בקשה להוספת תכונה: הוספת גרסה אידיאלית של AGP כמאפיין
ייצוב SingleArtifact.VERSION_CONTROL_INFO_FILE
הפלט של logcat של androidTest connectedCheck לא תקין
Lint
‫AGP 8.11.0: המשימה lintAnalyzeRelease קורסת כשמחילים קובצי ‎ .gradle.kts עם apply(from = "...")‎
שילוב Lint
החמצות במטמון של AndroidLintAnalysisTask בקרב ספקים שונים של JDK או גרסאות משניות שונות בגלל הבדלים ב-systemPropertyInputs.javaVersion

פלאגין Android Gradle‏ ‎9.0.0-beta01

בעיות שתוקנו
לא סומנו בעיות ציבוריות כבעיות שתוקנו ב-AGP 9.0.0-beta01

פלאגין Android Gradle‏ ‎9.0.0-alpha14

בעיות שתוקנו
Android Gradle Plugin
התמיכה המובנית ב-Kotlin ב-AGP לא אמורה להסתנכרן עם ערכות המקור של Kotlin
הפרסום של ספריית Android נכשל אם קובץ השמירה על נתונים של הצרכן מכיל את המחרוזת ‎-dontobfuscate
אין אפשרויות להדפסת מיפוי למשאבים שעברו אופטימיזציה
הגדרת שגיאה אם מנסים להפעיל את finalizeDsl אחרי שהשלב הזה הסתיים
‫AGP מאתחל את ההגדרה של jetifier גם כש-jetifier מושבת
אם הערך של `kotlin.stdlib.default.dependency` הוא true בקובצי מודול ו-pom,‏ kotlinStdlib לא מתווסף כתלות בזמן קומפילציה כשיוצרים ב-kotlin
שילוב Lint
‫Lint משתמש אוטומטית ב-SDK המותקן האחרון למרות compileSdk, לא נרשם כקלט של משימה וגורם לשגיאות במטמון
Shrinker (R8)
אם משתמשים במזהי משאבים סופיים, צמצום המשאבים שעבר אופטימיזציה באמצעות R8 נכשל בשקט

פלאגין Android Gradle‏ ‎9.0.0-alpha13

בעיות שתוקנו
Android Gradle Plugin
‫AGP9: ‏`variant.sources.kotlin!!.addGeneratedSourceDirectory()` לא פועל
בדיקות מטא-נתונים של Aar בהידור SDK משתמשות ב-DSL הישן
הסרה של המאפיין `com.android.build.api.dsl.ManagedDevices.devices` שיצא משימוש

פלאגין Android Gradle‏ ‎9.0.0-alpha12

בעיות שתוקנו
Android Gradle Plugin
לפרויקט 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

פלאגין Android Gradle‏ ‎9.9.0-alpha11

בעיות שתוקנו
Android Gradle Plugin
‫Built-in-kotlin לא מפרסם אילוצים של תלות ב-kotlin-stdlib ב-maven pom
הוספת מקרה בדיקה של פער בין compileSdk לבין targetSdk
ערך ריק של resConfigs מוביל לשגיאת aapt לא ברורה

פלאגין Android Gradle‏ ‎9.0.0-alpha10

בעיות שתוקנו
Android Gradle Plugin
המאפיינים extractNativeLibs ו-useEmbeddedDex לא אמורים להגיע מהמניפסט
אזהרות מ-R8 ב-AGP 9.0.0-alpha09
Lint
‫Kotlin מובנה לא מוסיף ‎ .kotlin_module ל-META-INF
נתיב המחלקה של Lint מכיל כפילויות של מחלקות בגרסאות שונות
הפתרון לעקיפת משאבים פרטיים לא עובד (tools:override = "true")

פלאגין Android Gradle‏ ‎9.0.0-alpha09

בעיות שתוקנו
Android Gradle Plugin
הפלאגין `legacy-kapt` מדלג על עיבוד ההערות, בניגוד לפלאגין `kotlin-kapt`
הפונקציה compileSdkSpec.minorApiLevel לא פועלת עם SettingsExtension
‫[fused lib - public] ספרייה מאוחדת שנוצרה לא כוללת מקורות

פלאגין Android Gradle‏ ‎9.0.0-alpha08

בעיות שתוקנו
לא סומנו בעיות ציבוריות כבעיות שתוקנו ב-AGP 9.0.0-alpha08

פלאגין Android Gradle‏ ‎9.0.0-alpha07

בעיות שתוקנו
Android Gradle Plugin
תהליך ה-build נכשל אם יש משימות של יצירת קוד
אם android.builtInKotlin=false,‏ android.newDsl=false ו-android.enableLegacyVariantApi=false, השימוש בתוסף kotlin-android ייכשל עם ההודעה 'ה-API ‏applicationVariants יצא משימוש'
ה-Kotlin המובנה לא מצליח לפתור את הבעיה של kotlin-stdlib ללא גרסה כש-kotlin.stdlib.default.dependency=false
‫DexData פותח קובץ בלי לסגור אותו, ומונע ניקוי
החל מ-AGP 9.0,‏ AndroidSourceDirectorySet לא יורחב יותר על ידי PatternFilterable
שגיאה ב-Test Fixture במודולים לבדיקה בלבד
שגיאה לא נכונה כשמשתמשים במקבלים של הקשר ב-test fixtures
שגיאות שגויות ב-IDE עבור קוד Kotlin ב-testFixtures

פלאגין Android Gradle‏ ‎9.0.0-alpha06

בעיות שתוקנו
Android Gradle Plugin
ה-DSL החדש לאופטימיזציה לא יוצר את הקובץ configuration.txt כברירת מחדל
גרסה AGP 8.13.0 לא מצליחה לאמת את תרשים הניווט במודול
‫AGP משתמש ב-Gradle API שהוצא משימוש: סימון של מחרוזות מרובות
אזהרה למשתמשים שמנסים להשתמש בספריית multidex מדור קודם עם minSdkVersion ‏ >=21
Lint
‫Lint ChecksSdkIntAtLeast Check does not check if the annotated value is correct

פלאגין Android Gradle‏ ‎9.0.0-alpha05

בעיות שתוקנו
Android Gradle Plugin
‫android.proguard.failOnMissingFiles לא פועל עבור consumerProguardFiles
עדכון התלות בפלאגין Kotlin Gradle לגרסה 2.2.10
יצירת KotlinJvmAndroidCompilation באמצעות KGP API
מצב Kotlin explicit API מוחל על מקורות בדיקה
Lint
‫Lint מציג את האזהרה 'Could not clean up K2 caches'

פלאגין Android Gradle‏ ‎9.0.0-alpha04

בעיות שתוקנו
Android Gradle Plugin
החלפת גרסת ברירת המחדל של Java במקור/יעד מ-Java 8 ל-Java 11 ב-AGP 9.0
החלפת ברירת המחדל של android.useAndroidX ל-true
שיפור החריגה כשמחילים את התוסף kapt עם Kotlin מובנה.
Lint
‫Lint מציג את האזהרה 'Could not clean up K2 caches'

פלאגין Android Gradle‏ ‎9.0.0-alpha03

בעיות שתוקנו
Android Gradle Plugin
כשהאפשרות `isIncludeAndroidResources` מופעלת, הפעולה `process{Variant}UnitTestManifest` נכשלת במיזוג של שימושים ב-tools:overrideLibrary ב-AGP 8.12.0
‫AGP גורם להצגת אזהרות לגבי הוצאה משימוש ב-Gradle למשימות בדיקה של JVM
‫DependencyReportTask לא תואם למטמון ההגדרות
Lint
באג: הסרה של משאבים שלא נמצאים בשימוש לא מסירה גם את התרגומים שלהם, ולא מוצגת שאלה לגבי זה

פלאגין Android Gradle‏ ‎9.0.0-alpha02

בעיות שתוקנו
Android Gradle Plugin
ה-build נכשל אם קובץ ה-proguard לא קיים
remove buildconfig defaults gradle.properties flags
שינוי ערך ברירת המחדל של targetSdk באפליקציה כך שיתבסס על compileSdk במקום על minSdk

פלאגין Android Gradle‏ ‎9.0.0-alpha01

בעיות שתוקנו
Android Gradle Plugin
הסרה של 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
הסרה של ברירות המחדל של הדגלים `android.defaults.buildfeatures.aidl` בקובץ gradle.properties

פלאגין Android Gradle‏ ‎9.0.0

בעיות שתוקנו
לא סומנו בעיות ציבוריות כבעיות שתוקנו ב-AGP 9.0.0