פלאגין Android Gradle 9.0 הוא גרסה מרכזית שכוללת שינויים בממשקי API ובהתנהגות.
כדי לעדכן לגרסה 9.0.1 של Android Gradle Plugin, צריך להשתמש בכלי העזר לשדרוג Android Gradle Plugin.
הכלי לשדרוג AGP עוזר לשמר התנהגויות קיימות כשמשדרגים את הפרויקט, כשזה מתאים. כך אפשר לשדרג את הפרויקט לשימוש ב-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: המטרה של שינוי הממשקים היא לשמור על דמיון מרבי בין שפות התחום, אבל יכול להיות שיהיו שינויים קטנים.
מעדכנים את הלוגיקה של הגרסה המותאמת אישית כדי להפנות ל-DSL ול-API החדשים: מחליפים את כל ההפניות ל-DSL הפנימי בממשקי ה-DSL הציבוריים. ברוב המקרים, מדובר בהחלפה של אחד באחד. מחליפים את כל השימושים ב-
applicationVariantsובממשקי API דומים ב-androidComponentsAPI החדש. יכול להיות שהתהליך יהיה מורכב יותר, כיandroidComponentsAPI נועד להיות יציב יותר כדי שהתוספים יהיו תואמים למשך זמן ארוך יותר. כדאי לעיין בדוגמאות ל-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) } } |
variantFilter
|
מאפשרת להשבית וריאציות נבחרות. |
מחליפים את זה ב-API של androidComponents.beforeVariants, לדוגמה:
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider andtestServer
|
רישום של סביבות בדיקה בהתאמה אישית להרצת בדיקות במכשירי 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
המחלקות הקודמות מסומנות כפריטים שהוצאו משימוש ב-AGP 9.0. המשמעות היא שבפרויקטים שבהם לא נעשה שימוש בדגל newDsl יוצגו אזהרות על הוצאה משימוש, כולל בבלוק android עצמו.
אפשר גם להתחיל לשדרג ל-API החדשים לפני שמשדרגים ל-AGP 9.0. הממשקים החדשים קיימים בהרבה גרסאות של AGP, ולכן יכול להיות שיהיה לכם שילוב של ממשקים חדשים וישנים. במסמכי העזרה של AGP API מוצג ממשק ה-API לכל גרסה של AGP, ומתי נוספו כל מחלקה, שיטה ושדה.
אנחנו פונים למפתחים של פלאגינים נפוצים כדי לעזור להם להתאים ולפרסם פלאגינים שתואמים באופן מלא למצבים החדשים, ונמשיך לשפר את כלי העזרה לשדרוג 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 עבור מבני בדיקה
AGP 9.0 כולל תמיכה מלאה ב-IDE של Android Studio בtest fixtures.
Fuzed Library Plugin
התוסף Fused Library (גרסת 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. |
שימוש בממשקי DSL החדשים, בלי לחשוף את ההטמעות הקודמות של בלוק android.המשמעות היא גם שאי אפשר יותר לגשת ל-Variant API מדור קודם, כמו android.applicationVariants.
|
false ← true |
אפשר לבטל את ההצטרפות על ידי הגדרת
android.newDsl=false.אחרי שמוודאים שכל הפלאגינים והלוגיקה של הבנייה שבהם נעשה שימוש בפרויקט תואמים, מסירים את ההסכמה לשימוש בגרסה הקודמת. |
android. |
ההגדרה הזו מפעילה את Kotlin המובנה | false ← true |
מעבר ל-Kotlin מובנה אם אפשר או ביטול ההסכמה. |
android. |
האפשרות הזו מוודאת שלכל ספרייה יש שם חבילה ייחודי. | false ← true |
מציינים שמות חבילות ייחודיים לכל הספריות בפרויקט. אם זה לא אפשרי, אפשר להשבית את הדגל הזה בזמן ההעברה. |
android. |
שימוש בהתנהגויות ברירת המחדל של התלות ב-androidx.
|
false ← true |
אימוץ יחסי תלות של androidx.
|
android. |
כברירת מחדל, הבדיקות במכשיר מופעלות באמצעות המחלקה
androidx.test.runner.AndroidJUnitRunner, במקום המחלקה InstrumentationTestRunner שהוצאה משימוש.
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false ← true |
Adopt
AndroidJUnitRunner,
או מציינים במפורש את testInstrumentationRunner המותאם אישית.
|
android. |
ההגדרה הזו קובעת את השימוש באילוצי תלות בין תצורות. ברירת המחדל ב-AGP 9.0 היא false, שמשתמשת רק באילוצים בבדיקות של מכשירי אפליקציה (AndroidTest).
הגדרת הערך true תחזיר את ההתנהגות של גרסה 8.13.
|
true ← false |
אל תשתמשו באילוצים של תלות בכל מקום אלא אם אתם צריכים אותם. קבלת ברירת המחדל החדשה של הדגל הזה מאפשרת גם לבצע אופטימיזציות בתהליך ייבוא הפרויקט, וכך לקצר את זמן הייבוא של גרסאות build עם הרבה פרויקטים משניים של ספריות Android. |
android. |
הידור קוד באפליקציות מול מחלקת R לא סופית, כדי שהידור האפליקציה יהיה זהה להידור הספרייה. השינוי הזה משפר את המדד 'המרות מצטברות' וסולל את הדרך לשיפורים עתידיים בביצועים של תהליך עיבוד המשאבים. |
false ← true |
בפרויקטים רבים אפשר פשוט לאמץ את ההתנהגות החדשה בלי לבצע שינויים בקוד המקור. אם משתמשים בשדות של מחלקת R במקומות שבהם נדרש קבוע, כמו במקרים של switch, צריך לבצע refactoring כדי להשתמש בהצהרות if בשרשרת. |
android. |
משתמש בגרסת ה-SDK של הקומפילציה כערך ברירת המחדל של גרסת ה-SDK של היעד באפליקציות ובבדיקות. לפני השינוי הזה, גרסת ה-SDK לטירגוט הייתה מוגדרת כברירת מחדל לגרסת ה-SDK המינימלית. |
false ← true |
צריך לציין במפורש את גרסת ה-SDK של היעד לאפליקציות ולבדיקות. |
android. |
יוצר רק רכיבי בדיקת יחידות לסוג ה-build שנבדק. בפרויקט ברירת המחדל, התוצאה היא בדיקת יחידה אחת לניפוי באגים, בעוד שההתנהגות הקודמת הייתה הפעלת בדיקות יחידה לניפוי באגים או לגרסה. |
false ← true |
אם הפרויקט לא דורש הפעלת בדיקות גם עבור ניפוי באגים וגם עבור גרסת הפצה, לא צריך לבצע שינוי. |
android. |
ה-build נכשל עם שגיאה אם אחד מקובצי השמירה שצוינו ב-AGP DSL לא קיים בדיסק. לפני השינוי הזה, שגיאות כתיב בשמות של קבצים היו גורמות למערכת להתעלם מהקבצים בלי להציג הודעה. | false ← true |
הסרת הצהרות לא תקינות של קובצי ProGuard |
android. |
מאפשר ל-R8 לשמור פחות משאבי Android על ידי התייחסות משותפת למחלקות ולמשאבי Android. | false ← true |
אם כללי השימור של הפרויקט כבר הושלמו, לא צריך לבצע שינוי. |
android. |
מאפשר ל-R8 לשמור פחות על ידי אי שמירה מרומזת של constructor ברירת המחדל
כששומרים מחלקה.
כלומר, -keep class A כבר לא מרמז על -keep class A { <init>(); } |
false ← true |
אם כללי השימור של הפרויקט כבר הושלמו, לא צריך לבצע שינוי.
מחליפים את -keep class A
ב--keep class A { <init>(); }
בכללים לשמירה של הפרויקט, בכל המקרים שבהם צריך לשמור את בנאי ברירת המחדל.
|
android. |
הפעלת
resValues
בכל פרויקטי המשנה
|
true ← false |
מפעילים את resValues רק בפרויקטים המשניים שזקוקים לו, על ידי הגדרת הפקודה הבאה בקובצי ה-build של Gradle של הפרויקטים האלה:
android {
buildFeatures {
resValues = true
}
} |
android. |
הפעלת קומפילציה של Shader בכל פרויקטי המשנה | true ← false |
כדי להפעיל קומפילציה של Shader רק בפרויקטים משניים שמכילים Shader שצריך לקמפל, מגדירים את האפשרות הבאה בקובצי ה-build של Gradle של הפרויקטים האלה:
android {
buildFeatures {
shaders = true
}
} |
android. |
ב-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. |
מגרסה 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. |
אפשר למנוע העברה של ספקים למקורות שנוצרו באמצעות
AndroidSourceSet
DSL.
|
false ← true |
משתמשים ב-API Sources ב-androidComponents כדי לרשום מקורות שנוצרו.
|
android. |
אם הידור השיידרים מופעל, צריך להגדיר באופן מפורש את הנתיב של מהדר השיידרים ב-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ושלAndroidSourceSet.wearAppConfigurationNameDSL. במאמר הפצה ב-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 הוסרו:
AndroidSourceSet.jni, כי הוא לא היה תקין.
AndroidSourceSet.wearAppConfigurationName, כי הוא קשור להסרת התמיכה באפליקציית Wear OS המוטמעת.BuildType.isRenderscriptDebuggable, כי הוא לא היה תקין.
DependencyVariantSelection. הוא הוחלף ב-DependencySelection, שמוצג כ-kotlin.android.localDependencySelection
Installation.installOptions(String). הוא מוחלף במאפיין הניתן לשינוי שלInstallation.installOptions.הבלוק
PostProcessingהניסיוני, שלא עבר ייצוב.
ProductFlavor.setDimension, שמוחלף במאפייןdimension
LanguageSplitOptions, שהיה שימושי רק ל-Google Play ללא התקנה, שהוצא משימוש.DensitySplit, כי התכונה הזו כבר לא נתמכת. הפתרון הוא שימוש בקובצי App Bundle.
ממשקי API שהוסרו
בפלאגין Android Gradle 9.0 הוסרו:
AndroidComponentsExtension.finalizeDSl. הוא הוחלף ב-finalizeDsl
Component.transformClassesWith. הוא הוחלף ב-Instrumentation.transformClassesWith
Component.setAsmFramesComputationMode. הוא הוחלף ב-Instrumentation.setAsmFramesComputationMode
ComponentBuilder.enabled. הוא הוחלף ב-ComponentBuilder.enable.
DependenciesInfoBuilder.includedInApk. הוא הוחלף ב-includeInApk
DependenciesInfoBuilder.includedInBundle. הוא הוחלף ב-includeInBundle
GeneratesApk.targetSdkVersion. הוא הוחלף ב-targetSdk
Variant.minSdkVersion. הוא הוחלף ב-minSdk
Variant.maxSdkVersion. הוא הוחלף ב-maxSdk
Variant.targetSdkVersion. הוא הוחלף ב-targetSdk
Variant.unitTest, כי הוא לא רלוונטי לפלאגיןcom.android.test. המאפייןunitTestזמין בסוגי המשנהVariantBuilderשלHasUnitTest.
VariantBuilder.targetSdkו-targetSdkPreview, כי הן לא היו רלוונטיות בספריות. במקום זאת, אתם צריכים להשתמש ב-GeneratesApkBuilder.targetSdkאו ב-GeneratesApkBuilder.targetSdkPreview.
VariantBuilder.enableUnitTest, כי הוא לא רלוונטי לפלאגיןcom.android.test. המאפייןenableUnitTestזמין בסוגי המשנהVariantBuilderשלHasUnitTestBuilder.הסרנו את
VariantBuilder.unitTestEnabledלטובתenableUnitTest, ששמו עקבי יותר, בסוגי המשנהVariantBuilderשמרחיבים אתHasUnitTestBuilder.
VariantOutput.enable. הוא הוחלף ב-enabledהתכונות
FeaturePluginו-FeatureExtensionשהוצאו משימוש והושבתו.ממשקי ה-API שהוצאו משימוש והושבתו,
BaseExtension.registerTransformשנותרו רק כדי לאפשר קומפילציה מול הגרסה העדכנית ביותר של AGP תוך טירגוט הפעלה ב-AGP 4.2 או בגרסאות קודמות.
הוסרו מאפייני Gradle
המאפיינים הבאים של Gradle נוספו בהתחלה כדרכים להשבית באופן גלובלי תכונות שהופעלו כברירת מחדל.
התכונות האלה מושבתות כברירת מחדל מגרסה AGP 8.0 ומטה. כדי ליצור בנייה יעילה יותר, מומלץ להפעיל את התכונות האלה רק בפרויקטים המשניים שמשתמשים בהן.
| נכס | פעולה | החלפה |
|---|---|---|
android. |
הפעלת הידור של AIDL בכל פרויקטי המשנה |
כדי להפעיל קומפילציה של AIDL רק בפרויקטים משניים שכוללים מקורות AIDL, צריך להגדיר את המאפיין הבא בקובצי ה-build של Gradle של הפרויקטים האלה:
android {
buildFeatures {
aidl = true
}
} |
android. |
הגדרה שמאפשרת הידור של RenderScript בכל פרויקטי המשנה |
כדי להפעיל קומפילציה של renderscript רק בפרויקטים משניים שבהם יש מקורות של renderscript, צריך להגדיר את המאפיין הבא בקובצי ה-build של Gradle של הפרויקטים האלה:
android {
buildFeatures {
renderScript = true
}
} |
מאפייני Gradle שנאכפים
AGP 9.0 מחזיר שגיאה אם מגדירים את מאפייני Gradle הבאים.
הכלי Android Gradle plugin Upgrade Assistant לא ישדרג פרויקטים ל-AGP 9.0 שמשתמשים במאפיינים האלה.
| נכס | פעולה |
|---|---|
android. |
הפחתת משאבים מופעלת עכשיו תמיד כחלק מ-R8, וההטמעה הקודמת הוסרה. |
android. |
הכיווץ של מקורות המידע מתבצע עכשיו תמיד באמצעות כיווץ מדויק של מקורות המידע, שמאפשר להסיר יותר נתונים. |
שינויים בגרסה 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 לשיטות הנלוות אפשרה בעבר את תרחיש השימוש הבא:
- קומפילציה של ספרייה עם שיטות ממשק
default/static/privateל-DEX עםminSdk< 24 וכללים ששומרים את שיטות הממשק. - קומפילציה של אפליקציה עם הספרייה ב-classpath וב-
-applymapping. - מיזוג האפליקציה והספרייה.
הערה: הפעולה הזו פועלת רק עם -applymapping כי הביט disallow
obfuscation לא מועבר לשיטות הנלוות – כלומר, לשמות השיטות של המחלקות הנלוות שנוצרו בשלב 1.
מעכשיו, תרחיש השימוש הזה לא נתמך יותר בגרסה minSdk <
24. כדי לעקוף את הבעיה, אפשר לבצע את הפעולות הבאות:
- הסרת הסוכר מהספרייה באמצעות שיטות של ממשק
default/static/privateלקבצים מסוג class עםminSdk< 24. - קומפילציה של הארטיפקט אחרי הסרת הסוכר באמצעות R8 וכללים ששומרים את שיטות הממשק במחלקות הנלוות.
- קומפילציה של האפליקציה עם הספרייה בנתיב המחלקה.
- מיזוג האפליקציה ופריט המידע אחרי הסרת הסוכר.
תופעת לוואי נוספת היא שאי אפשר יותר לשמור את המאפיינים של המחלקה הפנימית והשיטה המקיפה למחלקות אנונימיות ומקומיות בתוך שיטות נלוות לממשק.
שינוי קובץ המקור שמוגדר כברירת מחדל ל-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
השם של מחלקות סינתטיות שנוצרות על ידי D8 בדרך כלל מכיל את מחרוזת המשנה
$$ExternalSynthetic שמציינת שמדובר במחלקה סינתטית שנוצרה על ידי D8.
בנוסף, השם של ה-synthetic מקודד גם את הסוג של ה-synthetic (לדוגמה, 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 Plugin |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| שילוב Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Shrinker (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||