פלאגין של 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 דומים ב-androidComponentsAPI החדש. יכול להיות שזה יהיה מורכב יותר, כי ה-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) } } |
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. |
משתמשים בממשקי ה-DSL החדשים, בלי לחשוף את ההטמעות הקודמות
של הבלוק android.זה גם אומר שאי אפשר יותר לגשת לגרסה הקודמת של ה-API, כמו android.applicationVariants.
|
false ← true |
כדי לבטל את ההסכמה, צריך להגדיר את
android.newDsl=false.אחרי שכל הפלאגינים והלוגיקה של ה-build שהפרויקט משתמש בהם יהיו תואמים, צריך להסיר את ההחרגה. |
android. |
הפעלת Kotlin מובנה | false ← true |
עוברים ל-Kotlin מובנה אם אפשר, או מבטלים את ההסכמה. |
android. |
אוכף שלכל ספרייה יהיה שם חבילה ייחודי. | false ← true |
צריך לציין שמות חבילות ייחודיים לכל הספריות בפרויקט. אם זה לא אפשרי, אתם יכולים להשבית את הדגל הזה בזמן ההעברה. |
android. |
שימוש ביחסי תלות של androidx כברירת מחדל.
|
false ← true |
להשתמש ביחסי התלות של androidx.
|
android. |
הרצת בדיקות במכשיר באמצעות המחלקה androidx.test.runner.AndroidJUnitRunner כברירת מחדל, במקום ברירת המחדל של המחלקה שהוצאה משימוש InstrumentationTestRunner עבור
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false ← true |
צריך להשתמש ב-AndroidJUnitRunner או לציין את ה-testInstrumentationRunner המותאם אישית באופן מפורש.
|
android. |
המדיניות קובעת את השימוש באילוצי תלות בין הגדרות אישיות. ברירת המחדל ב-AGP 9.0 היא false, שמשתמשת באילוצים רק בבדיקות של מכשירי אפליקציה (AndroidTest).
אם מגדירים את המדיניות הזו לערך true, ההתנהגות חוזרת לזו של גרסה 8.13.
|
true ← false |
אל תשתמשו באילוצי תלות בכל מקום, אלא רק אם אתם צריכים אותם. אם מאשרים את ברירת המחדל החדשה של הדגל הזה, מופעלות גם אופטימיזציות בתהליך הייבוא של הפרויקט, שאמורות לקצר את זמן הייבוא של גרסאות build עם הרבה פרויקטי משנה של ספריית Android. |
android. |
הידור קוד באפליקציות מול מחלקת R לא סופית, כך שהידור האפליקציה תואם להידור הספרייה. כך אפשר לשפר את המצטברות ולהכין את הקרקע לאופטימיזציות עתידיות של הביצועים בתהליך עיבוד המשאבים. |
false ← true |
בפרויקטים רבים אפשר פשוט לאמץ את ההתנהגות החדשה בלי לשנות את המקור. אם משתמשים בשדות של מחלקת R במקום שנדרש בו קבוע, כמו מקרים של switch, צריך לארגן את הקוד מחדש כך שישתמש בהצהרות 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>(); }
בכללי השמירה של הפרויקט בכל המקרים שבהם צריך לשמור את ה-constructor שמוגדר כברירת מחדל.
|
android. |
הפעלת resValues בכל פרויקטי המשנה
|
true ← false |
מפעילים את resValues רק בתת-הפרויקטים שבהם צריך אותו, על ידי הגדרת הפרטים הבאים בקובצי ה-build של Gradle בפרויקטים האלה:
android {
buildFeatures {
resValues = true
}
} |
android. |
הפעלת הידור של תוכנת הצללה בכל פרויקטי המשנה | true ← false |
כדי להפעיל הידור של שיידרים רק בפרויקטי המשנה שמכילים שיידרים שצריך להדר, מגדירים את מה שמופיע כאן למטה בקובצי ה-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. |
החל מגרסה 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. |
לא לאפשר העברת ספקים למקורות שנוצרו באמצעות
AndroidSourceSet
DSL.
|
false ← true |
משתמשים ב-API Sources ב-androidComponents כדי לרשום מקורות שנוצרו.
|
android. |
אם הפעלתם את הידור ה-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 הוסרו:
AndroidSourceSet.jni, כי הוא לא פעל.AndroidSourceSet.wearAppConfigurationName, כפי שזה קשור לתמיכה באפליקציות ל-Wear OS שהוסרה.BuildType.isRenderscriptDebuggable, כי הוא לא פעל.DependencyVariantSelection. הוא הוחלף על ידיDependencySelection, שמוצג בתורkotlin.android.localDependencySelection
Installation.installOptions(String). הוא מוחלף במאפיין הניתן לשינוי שלInstallation.installOptions.הבלוק הניסיוני
PostProcessing, שמעולם לא התייצב.
ProductFlavor.setDimension, שמוחלף במאפייןdimensionLanguageSplitOptions, שהיה שימושי רק ל-Google Play ללא התקנה, שהוצא משימוש.DensitySplit, כי התכונה הזו כבר לא נתמכת. החלופה היא להשתמש ב-App Bundle.
ממשקי API שהוסרו
בפלאגין של Android Gradle 9.0 הוסרו:
AndroidComponentsExtension.finalizeDSl. הוא הוחלף ב-finalizeDslComponent.transformClassesWith. הוא הוחלף ב-Instrumentation.transformClassesWithComponent.setAsmFramesComputationMode. הוא הוחלף ב-Instrumentation.setAsmFramesComputationModeComponentBuilder.enabled, שהוחלף על ידיComponentBuilder.enable.DependenciesInfoBuilder.includedInApk. הוא הוחלף על ידיincludeInApkDependenciesInfoBuilder.includedInBundle. הוא הוחלף על ידיincludeInBundleGeneratesApk.targetSdkVersion. הוא הוחלף על ידיtargetSdkVariant.minSdkVersion. הוא הוחלף על ידיminSdkVariant.maxSdkVersion. הוא הוחלף על ידיmaxSdkVariant.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שהוצאו משימוש והושבתו, שנותרו רק כדי לאפשר הידור (compilation) מול הגרסה העדכנית של AGP, תוך טירגוט להפעלה ב-AGP מגרסה 4.2 ומטה.
מאפייני Gradle שהוסרו
המאפיינים הבאים של Gradle נוספו בהתחלה כדרכים להשבית באופן גלובלי תכונות שהופעלו כברירת מחדל.
התכונות האלה מושבתות כברירת מחדל החל מגרסה 8.0 ומטה של AGP. כדי שה-build יהיה יעיל יותר, הפעילו את התכונות האלה רק בפרויקטי המשנה שמשתמשים בהן.
| מאפיין (property) | פונקציה | החלפה |
|---|---|---|
android. |
הפעלת הידור AIDL בכל פרויקטי המשנה |
מפעילים את הידור ה-AIDL רק בפרויקטי המשנה שבהם יש מקורות AIDL, על ידי הגדרת המאפיין הבא בקובצי ה-build של Gradle בפרויקטים האלה:
android {
buildFeatures {
aidl = true
}
} |
android. |
הפעלת הידור RenderScript בכל פרויקטי המשנה |
מפעילים את הידור ה-renderscript רק בפרויקטי המשנה שבהם יש מקורות renderscript, על ידי הגדרת המאפיין הבא בקובצי ה-build של Gradle בפרויקטים האלה:
android {
buildFeatures {
renderScript = true
}
} |
מאפייני Gradle שנאכפים
אם מגדירים את מאפייני Gradle הבאים, AGP 9.0 מקפיץ שגיאה.
מסייע השדרוג של הפלאגין של Android Gradle לא ישדרג ל-AGP 9.0 פרויקטים שמשתמשים במאפיינים האלה.
| מאפיין (property) | פונקציה |
|---|---|
android. |
כיווץ מקורות המידע פועל עכשיו תמיד כחלק מ-R8, וההטמעה הקודמת הוסרה. |
android. |
כיווץ מקורות המידע מתבצע עכשיו תמיד באופן מדויק, מה שמאפשר להסיר יותר מקורות מידע. |
שינויים ב-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 הנלוות, תמכה בעבר בתרחיש לדוגמה הבא:
- הידור של ספרייה עם שיטות ממשק של
default/static/privateל-DEX עםminSdk< 24 וכללים ששומרים על שיטות הממשק. - הידור של אפליקציה עם הספרייה ב-classpath וב-
-applymapping. - ממזגים את האפליקציה והספרייה.
שימו לב שהפעולה הזו פועלת רק עם -applymapping כי הביט disallow
obfuscation לא מועבר לשיטות הנלוות – כלומר, למחלקות הנלוות שנוצרו בשלב 1 יהיו שמות שיטות מעורפלים.
מעכשיו, התרחיש הזה לא נתמך יותר בגרסאות minSdk < 24. כדי לעקוף את הבעיה:
- הסרת סוכר תחביר מהספרייה עם שיטות ממשק
default/static/privateלקובצי כיתה עםminSdk< 24. - מבצעים קומפילציה של פריט המידע שנוצר בתהליך ההסרה של סוכר תחבירי באמצעות R8 וכללים ששומרים את השיטות של הממשק במחלקות הנלוות.
- הידור האפליקציה עם הספרייה ב-classpath.
- ממזגים את האפליקציה ואת פריט המידע שהוסר ממנו הסוכר התחבירי.
תופעת לוואי נוספת היא שכבר אי אפשר לשמור את המאפיינים של המחלקה הפנימית והשיטה המקיפה של מחלקות אנונימיות ומקומיות בתוך שיטות נלוות של ממשק.
שינוי קובץ המקור שמופק כברירת מחדל ל-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 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| שילוב Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| כלי לכיווץ (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||