פלאגין Android Gradle 8.0.0 (אפריל 2023)

‫פלאגין של Android Gradle 8.0.0 הוא גרסה מרכזית שכוללת מגוון של תכונות ושיפורים חדשים.

תאימות

גרסת המינימום גרסת ברירת המחדל הערות
Gradle 8.0 8.0 יש מידע נוסף במאמר בנושא עדכון Gradle.
SDK Build Tools 30.0.3 30.0.3 צריך להתקין או להגדיר את SDK Build Tools.
NDK לא רלוונטי 25.1.8937393 צריך להתקין או להגדיר גרסה אחרת של NDK.
JDK 17 17 מידע נוסף זמין במאמר הגדרת גרסת ה-JDK.

גרסאות תיקון

בהמשך מופיעה רשימה של גרסאות התיקונים של פלאגין של Android Gradle 8.0.

פלאגין של Android Gradle גרסה 8.0.2 (מאי 2023)

רשימת הבאגים שתוקנו ב-AGP 8.0.2 מופיעה בקטע הבעיות שנסגרו ב-Android Studio 2022.2.1.

פלאגין של Android Gradle גרסה 8.0.1 (מאי 2023)

העדכון הקטן הזה כולל את תיקוני הבאגים הבאים:

בעיות שתוקנו
שגיאה: "No VersionRequirement with the given id in the table" אחרי שדרוג AGP מגרסה 7.2.2 לגרסה 7.4.0
‫R8 NullPointerException ב-markTypeAsLive AGP 7.4.1
‫[R8 4.0.53] כשל באימות מחלקה קשיחה ב-Android 11

שינוי תוכנה שעלול לגרום לכשל: נדרש מרחב שמות בסקריפט ה-build ברמת המודול

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

כשעוברים למרחב השמות DSL, חשוב לשים לב לבעיות הבאות:

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

מידע נוסף זמין בתגובה מספר 19 בבעיה מספר 191813691.

שינויים בתוכנה שעלולים לגרום לכשלים: ערכי ברירת המחדל של אפשרויות ה-build

החל מגרסה 8.0 של AGP, ערכי ברירת המחדל של הדגלים האלה השתנו כדי לשפר את ביצועי ה-build. כדי לקבל עזרה בהתאמת הקוד לתמיכה בחלק מהשינויים האלה, אפשר להשתמש ב-AGP Upgrade Assistant (Tools > AGP Upgrade Assistant). הכלי Upgrade Assistant ידריך אתכם איך לעדכן את הקוד כדי להתאים אותו להתנהגות החדשה, או איך להגדיר דגלים כדי לשמור על ההתנהגות הקודמת.

דגל ערך ברירת מחדל חדש ערך ברירת המחדל הקודם הערות
android.defaults.buildfeatures.buildconfig false true כברירת מחדל, AGP 8.0 לא יוצר BuildConfig. צריך לציין את האפשרות הזו באמצעות ה-DSL בפרויקטים שבהם היא נדרשת.
android.defaults.buildfeatures.aidl false true ב-AGP 8.0, התמיכה ב-AIDL לא מופעלת כברירת מחדל. צריך לציין את האפשרות הזו באמצעות ה-DSL בפרויקטים שבהם היא נדרשת. אנחנו מתכננים להסיר את הדגל הזה ב-AGP 9.0.
android.defaults.buildfeatures.renderscript false true ‫AGP 8.0 לא מפעיל תמיכה ב-RenderScript כברירת מחדל. צריך לציין את האפשרות הזו באמצעות ה-DSL בפרויקטים שבהם אתם צריכים אותה. אנחנו מתכננים להסיר את הדגל הזה ב-AGP 9.0.
android.nonFinalResIds true false כברירת מחדל, AGP 8.0 יוצר מחלקות R עם שדות לא סופיים
android.nonTransitiveRClass true false ‫AGP 8.0 יוצר מחלקות R למשאבים שמוגדרים במודול הנוכחי בלבד.
android.enableR8.fullMode true false ‫AGP 8.0 מפעיל את המצב המלא של R8 כברירת מחדל. פרטים נוספים זמינים במאמר מצב מלא של R8.

שינויים בתוכנה שעלולים לגרום לכשלים: ערכים של אפשרויות build שנאכפים

החל מגרסה 8.0 של AGP, אי אפשר יותר לשנות את הערכים של הדגלים האלה. אם תציינו אותם בקובץ gradle.properties, המערכת תתעלם מהערך ו-AGP יציג אזהרות.

דגל הערך שנאכף הערות
android.dependencyResolutionAtConfigurationTime.warn true ‫AGP 8.0 מציג אזהרה אם הוא מזהה רזולוציית הגדרה במהלך שלב ההגדרה, כי היא משפיעה לרעה על זמני ההגדרה של Gradle.
android.r8.failOnMissingClasses true גרסה 8.0 של AGP נכשלת ב-builds שמשתמשים ב-R8 אם חסרות מחלקות, כדי להבטיח אופטימיזציה טובה יותר של DEX. כדי לפתור את הבעיה, צריך להוסיף את הספריות החסרות או את כללי ה--dontwarn keep. פרטים נוספים זמינים במאמר אזהרות לגבי מחלקות חסרות בכלי לכיווץ R8.
android.testConfig.useRelativePath true כשמפעילים את התמיכה בשימוש במשאבים, בנכסים ובמניפסטים של Android בבדיקות יחידה, AGP 8.0 יוצר קובץ test_config.properties שמכיל רק נתיבים יחסיים. כך אפשר להבטיח שבדיקות היחידה של Android תמיד יוכלו להשתמש במטמון ה-build של Gradle.
android.useNewJarCreator true כדי לשפר את ביצועי ה-build, ‏AGP משתמש בספריית Zipflinger כשיוצרים קובצי JAR.
android.bundletool.includeRepositoriesInDependencyReport true כשמוסיפים מידע על יחסי תלות של SDK בקובצי AAB ו-APK, AGP 8.0 מוסיף למידע הזה גם רשימה של מאגרי פרויקטים. מידע נוסף זמין במאמר מידע על יחסי תלות ב-Play Console.
android.enableArtProfiles true פרופילים של Baseline נוצרים עכשיו תמיד. פרטים נוספים זמינים במאמר פרופילים בסיסיים.
android.enableNewResourceShrinker true שימוש בהטמעה החדשה של כיווץ המשאבים כברירת מחדל. הכלי החדש לכיווץ משאבים כולל תמיכה בתכונות דינמיות.
android.enableSourceSetPathsMap true משמש לחישוב מיפויים של נתיבי משאבים יחסיים, כך שה-builds של Gradle מעודכנים לעיתים קרובות יותר.
android.cacheCompileLibResources true עכשיו אפשר לשמור במטמון משאבי ספרייה שעברו הידור כברירת מחדל, כי Gradle עוקב אחרי קובצי משאבים ביחס למיקום הפרויקט. צריך להפעיל את android.enableSourceSetPathsMap.
android.disableAutomaticComponentCreation true ‫AGP 8.0 לא יוצר SoftwareComponent כברירת מחדל. במקום זאת, AGP יוצר SoftwareComponents רק לווריאציות שמוגדרות לפרסום באמצעות ה-DSL לפרסום.

דגל יציב חדש לפרופיל הביצוע

‫AGP כולל את הדגל החדש android.settings.executionProfile. משתמשים בדגל הזה כדי לשנות את פרופיל הביצוע שמוגדר כברירת מחדל ב-SettingsExtension. מידע נוסף זמין במאמרי העזרה בנושא פלאגין ההגדרות.

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

אין תמיכה בהקצאת מאפיינים מסוג lazy ב-Kotlin

אם אתם משתמשים ב-Kotlin DSL של Gradle לסקריפטים של ה-build, שימו לב ש-Android Studio ו-AGP 8.0 לא תומכים בהקצאת המאפיינים הניסיונית באמצעות האופרטור =. מידע נוסף על התכונה הזו זמין בנתוני הגרסה ובמסמכי התיעוד.

קטגוריות של משימות ב-Build Analyzer

החל מגרסת Android Studio Flamingo, ל-Build Analyzer יש תצוגת ברירת מחדל חדשה למשימות שמשפיעות על משך ה-build. אם הפרויקט שלכם משתמש ב-AGP בגרסה 8.0 ומעלה, במקום להציג משימות בנפרד, Build Analyzer מקבץ אותן לפי קטגוריה. לדוגמה, משימות שספציפיות למשאבי Android, ל-Kotlin או ל-Dexing מקובצות יחד ואז ממוינות לפי משך ה-build. כך תוכלו לזהות איזו קטגוריה משפיעה הכי הרבה על זמן ה-build. כשמרחיבים כל קטגוריה, מוצגת רשימה של המשימות שקשורות אליה. כדי להציג משימות בנפרד, בלי קיבוץ, משתמשים בתפריט הנפתח קיבוץ לפי.

קטגוריות של משימות ב-Build Analyzer.

פלאגין חדש להגדרות

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

כדי להשתמש בפלאגין ההגדרות, צריך להחיל את הפלאגין בקובץ settings.gradle:

apply plugin 'com.android.settings'

ריכוז ההגדרות הגלובליות

כדי להגדיר הגדרות גלובליות, משתמשים בבלוק החדש android בקובץ settings.gradle. הנה דוגמה:

android {
  compileSdk 31
  minSdk 28
  ...
}

פרופילים של הרצת כלים

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

יוצרים פרופילי הפעלה ומגדירים את פרופיל ההפעלה שמוגדר כברירת מחדל בקובץ settings.gradle, כמו בדוגמה הבאה:

android {
  execution {
    profiles {
      high {
        r8 {
          jvmOptions += ["-Xms2048m", "-Xmx8192m", "-XX:+HeapDumpOnOutOfMemoryError"]
          runInSeparateProcess true
        }
      }
      low {
        r8 {
          jvmOptions += ["-Xms256m", "-Xmx2048m", "-XX:+HeapDumpOnOutOfMemoryError"]
          runInSeparateProcess true
        }
      }
      ci {
        r8.runInSeparateProcess false
      }
    }
    defaultProfile "low"
  }
}

כדי לשנות את פרופיל ברירת המחדל, בוחרים פרופיל אחר באמצעות המאפיין android.experimental.settings.executionProfile בקובץ gradle.properties:

android.experimental.settings.executionProfile=high

אפשר גם להגדיר את המאפיין הזה באמצעות שורת הפקודה, שמאפשרת להגדיר תהליכי עבודה שונים. לדוגמה, אם יש לכם תהליך עבודה של אינטגרציה רציפה (CI), אתם יכולים להשתמש בשורת הפקודה כדי לשנות את פרופיל ההפעלה בלי לשנות את הקובץ settings.gradle:

./gradlew assembleRelease \
-Pandroid.experimental.settings.executionProfile=ci

כדי להפעיל את AGP 8.0 נדרש JDK 17

כשמשתמשים בפלאגין של Android Gradle בגרסה 8.0 כדי ליצור את האפליקציה, צריך עכשיו את JDK 17 כדי להריץ את Gradle. ‫Android Studio Flamingo כולל את JDK 17 ומגדיר את Gradle להשתמש בו כברירת מחדל, כך שרוב המשתמשים ב-Android Studio לא צריכים לבצע שינויים בהגדרות של הפרויקטים שלהם.

אם אתם צריכים להגדיר ידנית את גרסת ה-JDK שבה AGP משתמש ב-Android Studio, אתם צריכים להשתמש ב-JDK 17 ואילך.

כשמשתמשים ב-AGP בלי קשר ל-Android Studio, משדרגים את גרסת ה-JDK על ידי הגדרת משתנה הסביבה JAVA_HOME או האפשרות של שורת הפקודה -Dorg.gradle.java.home לספריית ההתקנה של JDK 17.

בעיות שתוקנו

פלאגין של Android Gradle‏ ‎8.0.2

בעיות שתוקנו
כלי לכיווץ (R8)
‫R8 נכשל במהלך ה-build של Compose עם ArrayIndexOutOfBoundsException
‫VerifyError: המאמת דחה את המחלקה כשמשתמשים ב-R8 עם Kotlin 1.8.20
‫R8 ב-AGP 8 משבש את שירות Google Fit
הכללת מידע על קובץ המקור עם שמות שיוריים שחופפים לשמות הקלט לא מיוצגת בצורה נכונה

פלאגין של Android Gradle‏ ‎8.0.1

בעיות שתוקנו
כלי לכיווץ (R8)
שגיאה: "No VersionRequirement with the given id in the table" אחרי שדרוג AGP מגרסה 7.2.2 לגרסה 7.4.0
‫R8 NullPointerException ב-markTypeAsLive AGP 7.4.1
‫[R8 4.0.53] כשל באימות מחלקה קשיחה ב-Android 11

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

בעיות שתוקנו
פלאגין של Android Gradle
כשל ב-build לא יציב במשימה MergeResources
‫JavaPluginConvention ו-HasConvention הוצאו משימוש
מיקום הקובץ שגוי ולא עקבי ב-API החדש לטרנספורמציה
הפלאגין של Android Gradle לא יכול להשתמש בפונקציה GUtil.toWords(string)‎ שהוצאה משימוש
בפלאגין של Android Gradle אסור להשתמש בפונקציה ConfigureUtil.configure(closure, target)‎ שהוצאה משימוש
עדכון בדיקות AGP לשימוש ב-KGP 1.7.20-Beta
‫Gradle 7.4 נכשל (לא ניתן ליצור מופע של AnalyticsService)
"קבוע enum לא ידוע" חדש מ-javac ב-AGP 7.4.0-alpha09
ההגדרה של MergeGeneratedProguardFilesCreationAction איטית גם כשהתכונה "שמירת הגדרות במטמון" מופעלת
‫[AGP] הוספת ספריית קובצי מקור שנוצרה למודל IDE (Variant API)
‫JavaPluginConvention ו-HasConvention הוצאו משימוש
לא להוסיף את ignorewarnings ל-R8 כברירת מחדל
הצגת אזהרה כשקובצי proguard לא קיימים
‫AGP 7.3.0 מפסיק את הסנכרון של Gradle בפרויקטים של פלטפורמת Gradle
ספריית apksig: ‏ ApkVerifier$Result.getV4SchemeSigners()‎ מסומנת כפרטית
הפסקת היצירה של הגדרת androidJacocoAnt אם הכיסוי לא מופעל
שימוש ב-‎ @IntDef ברכיב ספרייה לא יוצר את annotations.zip ב-aar
לא ניתן למצוא סוג-על משותף ל- ול-
מוסיפים גרסה של מאפיין gradle של LINT_PRINT_STACKTRACE=true
רכיבי prefab לא עדכניים נארזים ב-AAR
מעבר מהמאפיין destination למאפיין outputLocation כדי לטפל באזהרת ההוצאה משימוש ולהתכונן ל-Gradle 9.0
צריך להביא בחשבון את הדגל `--release` כשמגדירים את המשימה JavaCompile
‫[AGP-7.3.0-beta03] המשימה ShrinkResourcesNewShrinkerTask נכשלת כשיש שורה ריקה אחרי הצהרת XML
הפעלת יעד lintVital כברירת מחדל בווריאנט של ניפוי באגים
הצגת אזהרה כשקובצי proguard לא קיימים
‫AGP מנסה להוסיף את kotlinOptions.freeCompilerArgs בשלב הביצוע של המשימה
הסנכרון של Gradle נכשל: הסנכרון נכשל: סיבה לא ידועה
‫DependencyReportTask לא תואם למטמון ההגדרות האישיות
שינוי משאבים באמצעות resValue ב-build.gradle מוביל לשגיאה: משאבים כפולים
לסוג ה-build‏ 'debug' יש מפתח חתימה שמוגדר כברירת מחדל, לאחרים אין
שימוש בתכונות דינמיות ובכיווץ מקורות המידע גורם לקריסה בזמן הריצה
לסוג ה-build‏ 'debug' יש מפתח חתימה שמוגדר כברירת מחדל, לאחרים אין
ספריית קובצי המקור שנוצרה מופיעה כספריית Java בספק המקור הראשי של מודל ה-lint
‫Gradle 8.0-milestone-2 גורם לחריגה ב-AGP
אופטימיזציה של מיזוג המניפסטים של האפליקציות והספרייה
הוספת gradle-settings-api ליצירת javadoc
"קבוע enum לא ידוע" חדש מ-javac ב-AGP 7.4.0-alpha09
‫AGP 7.4.0-alpha09 יוצר גרסאות build שלא ניתן להעלות ל"הפצת אפליקציות ב-Firebase"
‫lint.xml במודולים לא נלקח בחשבון בבדיקת UP-TO-DATE של משימות lint
בעיה ב-פלאגין של Android Gradle 7.0+‎ ובבדיקות של Android: לא נמצא המשאב: id
קריסה לא עקבית של configureCMakeDebug עם חריגת מצביע null
‫IllegalAccessError בשדרוג הפרויקט ל-AS2022.2.1.5, ‏FireBasePerfPlugin
הסנכרון נכשל ומוצגת הודעת השגיאה הלא ברורה "Collection contains no element matching the predicate" (האוסף לא מכיל רכיב שתואם לפרדיקט).
‫Instrumentation API לא משנה את יחסי התלות של קבצים מקומיים
שגיאת `AnnotationProcessorOptions.arguments are queried` כשמעדכנים לגרסה 7.4 בטא 1
העברת פלאגינים ציבוריים של Gradle אל gradle-api והסרת BasePlugin.getExtension
לא נעשה שימוש ב-r8.jvmArgs
‫JDK17 כגרסה המינימלית שנדרשת ל-AGP
‫AGP 8.0.0 A8 מפסיק את פרופילי Baseline
שינוי של compileSdkVersion ל-compileSdk בהודעה CheckAarMetadataTask ב-AGP 8.0
‫AGP 7.4.0-rc01 משבש את Variant API עם השגיאה "אין תמיכה בשליחת שאילתה לגבי הערך הממופה של map(provider(java.util.Set)) לפני שהמשימה '…' הושלמה"
בעיות ב-`com.android.build.gradle.tasks.ShaderCompile` עם מטמון ההגדרות האישיות
הוספה למשאבי Java באמצעות ממשקי API של AGP משבשת את מטמון ההגדרות האישיות
הפלאגין Lint הוא לא חלק מ-gradle-api
‫DexingFileDependenciesTask.outputKeepRules היא ספרייה אבל היא מסומנת כ-OutputFile
שדרוג ל-AGP 7.4 גורם לשגיאת StackOverflowError
‫processDebugUnitTestManifest נכשל עם פלייסהולדרים של מניפסט לווריאנטים של בדיקה
‫Lint ניגש למידע על קבוצות מקורות בלי תלויות
שגיאת ה-build מתייחסת לרמת API‏ 34, שלא קיימת
"מומלץ להשתמש בפלאגין חדש יותר של Android Gradle" כשאין פלאגין חדש יותר
המאפיין android.injected.testOnly=false לא עובד
Dexer (D8)
שגיאה במיזוג Dex שקשורה ל-global synthetics אחרי שדרוג AS Canary 6 ל-7
צריך לעדכן את ספריית המטא-נתונים של Kotlin לגרסה 0.6.0
נראה שנדרש פתרון עקיף ל-JDK-8272564 ברמת API‏ 28-30
Lint
בדיקת ה-lint של ResourceType לא פועלת במקורות של Kotlin
‫VersionChecks לא מטפל בבדיקות טווח של Kotlin
תוצאה חיובית כוזבת של InlinedApi כשהוא עטוף
‫Lint false positive Recycle regarding openInputStream
‫[BuildTool/Lint] מאפיין ה-constructor של ChecksSdkIntAtLeast
איתור שגיאות בקוד: מיזוג PartialResults לא פועל כמו שצריך
‫Android Studio מסמן גרסה מסוימת כלא עדכנית, למרות שהיא כן עדכנית.
‫AndroidDeprecationInspection.DeprecationFilter EP אף פעם לא רשום בקובץ android-plugin.xml
ההסבר לבדיקת ה-lint של AccessibilityDetector לא עדכני
בדיקות Lint SDK_INT צריכות להבין משתנים מקומיים זמניים
שגיאה כש-TestMode.TYPE_ALIAS מחליף את סוג הפונקציה ב-typealias
באג: כשיוצרים ObjectAnimator מחוץ לבלוק הקוד הנוכחי, מופיעות אזהרות חיוביות כוזבות על כך שהוא לא מופעל #38
Lint: NPE due to querying Application instance in mergeOnly mode
כלל ה-lint‏ NonConstantResourceId לא יכול לזהות הקצאה של ערכים קבועים ממזהה המשאב
not showing error on view id
כשל בביטול ההמשכה של מטמון המשאבים של ה-lint גורם לשגיאת lint (אבל אמור להיות אזהרה)
‫AGP Flamingo Alpha 8 Lint NewApi Desugar Regression
‫TypedArray#close (API 31)‎ לא עובר הסרה של סוכר תחבירי, אבל AS לא מציג אזהרה כשמשתמשים בו ב-try-with-resources
‫Lint לא בודק המרות חוקיות של מקבלי שיחות
‫Lint בודק רק המרות בטוחות לממשקים שהוטמעו ישירות, ולא לממשקים שעברו בירושה
שילוב Lint
קובץ הבסיס הוא כרגע קלט ופלט של משימות Lint
כלי לכיווץ (R8)
שגיאת NPE או שגיאת טענה נכונה (assertion) במאמת המסגרת של CF
רגרסיה אחרי הסרת המטמון של חיפוש השדות
‫`:app:minifyVariantWithR8` זורק NullPointerException ב-AGP 7.4.0-beta02
‫R8: ClassNotFoundException כשמשתמשים ב-allowaccessmodification-
הוספת תמיכה במקלטי הקשר במטא-נתונים
java.lang.VerifyError: Verifier rejected class androidx.compose.ui.graphics.colorspace.o: void androidx.compose.ui.graphics.colorspace.o.(java.lang.Object) failed to verify: void androidx.compose.ui.graphics.colorspace.o.(java.lang.Object): [0x0] cannot access instance field java.lang.Object androidx.compose.ui.graphics.colorspace.n.a from object of type Precise Reference: androidx.compose.ui.graphics.colorspace.o
‫AGP 7.4.0/7.3.1 – ניסיון להוסיף פעולה לתור ברשימת עבודה של תור שלא ניתן להוסיף אליו פריטים
הקטנת קוד Renderscript: ירידה משמעותית בביצועים כשמשדרגים את AGP מגרסה 7.3.1 לגרסה 7.4.0