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

Android Gradle plugin 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 Plugin 8.0.

Android Gradle Plugin 8.0.2 (מאי 2023)

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

Android Gradle Plugin 8.0.1 (מאי 2023)

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

בעיות שתוקנו
שגיאה: "No VersionRequirement with the given id in the table" אחרי שדרוג AGP 7.2.2 -> 7.4.0
R8 NullPointerException at markTypeAsLive AGP 7.4.1
[R8 4.0.53] Hard class verification failure on Android 11

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

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

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

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

למידע נוסף, ראו issue #191813691 comment #19.

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

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

סימון ערך ברירת המחדל החדש ערך ברירת המחדל הקודם הערות
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 מאולצים

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

סימון ערך נאכף הערות
android.dependencyResolutionAtConfigurationTime.warn true AGP 8.0 פולט אזהרה אם הוא מזהה פתרון של הגדרות במהלך שלב ההגדרה, כי זה משפיע לרעה על זמני ההגדרה של Gradle.
android.r8.failOnMissingClasses true כדי להבטיח אופטימיזציה טובה יותר של DEX, AGP 8.0 נכשל ב-builds שמשתמשים ב-R8 אם חסרות בהם כיתות. כדי לפתור את הבעיה, צריך להוסיף את הספריות החסרות או את כללי השמירה -dontwarn. פרטים נוספים זמינים במאמר אזהרות חסרות לגבי סיווגים ב-R8 shrinker.
android.testConfig.useRelativePath true כשמפעילים את התמיכה בשימוש במשאבים, בנכסים ובמניפסטים של Android בבדיקות יחידה, AGP 8.0 יוצר קובץ test_config.properties שמכיל רק נתיבים יחסיים. כך אפשר להבטיח שבדיקות יחידה של Android תמיד יוכלו להשתמש במטמון ה-build של Gradle.
android.useNewJarCreator true AGP משתמש בספריית Zipflinger כשיוצר קובצי JAR כדי לשפר את ביצועי ה-build.
android.bundletool.includeRepositoriesInDependencyReport true כשמפעילים את האפשרות להוסיף מידע על יחסי התלות של SDK ב-AAB וב-APK, AGP 8.0 מוסיף למידע הזה גם רשימה של מאגרי פרויקטים. מידע נוסף זמין במאמר מידע על יחסי תלות ב-Play Console.
android.enableArtProfiles true עכשיו תמיד נוצרים פרופילים בסיסיים. פרטים נוספים זמינים במאמר פרופי בסיס.
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 Resources, ל-Kotlin או ל-Dexing מקובצות יחד ולאחר מכן ממוינות לפי משך הזמן של ה-build. כך תוכלו לדעת בקלות איזו קטגוריה משפיעה הכי הרבה על זמן ה-build. כשמרחיבים כל קטגוריה, מוצגת רשימה של המשימות התואמות. כדי להציג את המשימות בנפרד, ללא קיבוץ, משתמשים בתפריט הנפתח Group by.

קטגוריות המשימות של 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

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

אם אתם משתמשים ב-Android Gradle Plugin 8.0 כדי ליצור את האפליקציה, עכשיו נדרשת גרסה 17 של JDK כדי להריץ את 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 plugin 8.0.0

בעיות שתוקנו
Android Gradle Plugin
כישלון לא עקבי ב-build במשימה MergeResources
JavaPluginConvention ו-HasConvention הוצאו משימוש
מיקום קובץ שגוי ולא עקבי של ה-API החדש של הטרנספורמציה
אסור להשתמש בפונקציה GUtil.toWords(string) שהוצאה משימוש בפלאגין של Android Gradle
אסור להשתמש בפונקציה ConfigureUtil.configure(closure, target)‎ שהוצאה משימוש בפלאגין של Android Gradle
עדכון הבדיקות של AGP כך שישתמשו ב-KGP 1.7.20-Beta
Gradle 7.4 נכשל (לא ניתן ליצור מופע של AnalyticsService)
הודעת השגיאה החדשה 'unknown enum constant' מ-javac ב-AGP 7.4.0-alpha09
ההגדרה של MergeGeneratedProguardFilesCreationAction איטית גם כשאחסון במטמון של ההגדרות מופעל
[AGP] Add generated source directory to IDE model (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
ארטיפקטים מוכנים מראש שפג תוקפם נארזים ב-AAR
איך עוברים מנכס היעד לנכס outputLocation כדי לטפל באזהרה על הוצאה משימוש ולהתכונן ל-Gradle 9.0
חשוב להביא בחשבון את הדגל `--release` כשמגדירים את המשימה JavaCompile
[AGP-7.3.0-beta03] ShrinkResourcesNewShrinkerTask is failed when there is an empty line after xml declaration
היעד lintVital פועל כברירת מחדל בגרסת ניפוי באגים של וריאנט
הצגת אזהרה כשקבצי Proguard לא קיימים
AGP מנסה להוסיף את kotlinOptions.freeCompilerArgs בשלב ביצוע המשימה
Gradle sync failed: Sync failed: reason unknown
DependencyReportTask לא תואם למטמון ההגדרות
שינוי משאבים באמצעות resValue ב-build.gradle מוביל לשגיאה: משאבים כפולים
לסוג ה-build 'debug' יש מפתח חתימה שמוגדר כברירת מחדל, ולסוגים אחרים אין
שימוש בתכונות דינמיות ובצמצום משאבים גורם לקריסה בסביבת זמן הריצה
לסוג ה-build 'debug' יש מפתח חתימה שמוגדר כברירת מחדל, ולסוגים אחרים אין
ספריית קובצי המקור שנוצרה מופיעה כספריית Java בספק המקור הראשי של מודל האיתור של שגיאות בקוד
Gradle 8.0-milestone-2 גורם לחריגה ב-AGP
אופטימיזציה של מיזוג המניפסט לאפליקציות ולספרייה
הוספת gradle-settings-api ליצירת javadoc
הודעת השגיאה החדשה 'unknown enum constant' מ-javac ב-AGP 7.4.0-alpha09
AGP 7.4.0-alpha09 יוצר גרסאות build שלא ניתן להעלות ל-Firebase App Distribution
קובץ lint.xml במודולים לא נלקח בחשבון בבדיקת העדכון של משימות איתור שגיאות בקוד
בעיה בפלאגין Android Gradle מגרסה 7.0 ואילך ובבדיקות Android: לא ניתן למצוא את המשאב: id
configureCMakeDebug נוטה לקרוס עם חריגת מצביע null
IllegalAccessError upgrading project to AS2022.2.1.5, FireBasePerfPlugin
הסנכרון נכשל עם הודעת השגיאה הקודרת "Collection contains no element matching the predicate".
Instrumentation API לא מבצע טרנספורמציה של יחסי תלות בקבצים מקומיים
שגיאה מסוג 'AnnotationProcessorOptions.arguments are queried' בזמן העדכון לגרסה 7.4 Beta 1
העברת הפלאגינים הציבוריים של Gradle אל gradle-api והסרת BasePlugin.getExtension
לא נעשה שימוש ב-r8.jvmArgs
JDK17 כגרסה מינימלית הנדרשת ל-AGP
AGP 8.0.0 A8 משבש את הפרופילים הבסיסיים
שינוי הערך של 'compileSdkVersion' ל-'compileSdk' בהודעה של CheckAarMetadataTask ב-AGP 8.0
גרסת AGP 7.4.0-rc01 גורמת לשגיאה ב-Variant API עם ההודעה "Querying the mapped value of map(provider(java.util.Set)) before task '...' has completed is not supported"
בעיות ב-`com.android.build.gradle.tasks.ShaderCompile` במטמון ההגדרות
הוספה למשאבים של Java באמצעות ממשקי API של AGP גורמת לשבירה של מטמון ההגדרות
הפלאגין Lint לא נכלל ב-gradle-api
DexingFileDependenciesTask.outputKeepRules הוא ספרייה אבל מסומן כ-OutputFile
שדרוג ל-AGP 7.4 גורם ל-StackOverflowError
processDebugUnitTestManifest נכשל עם placeholder של מניפסט לגרסאות הבדיקה
Lint ניגש למידע על קבוצות מקורות ללא יחסי תלות
שגיאת build מתייחסת לרמת API 34, שלא קיימת
"מומלץ להשתמש בפלאגין חדש יותר של Android Gradle" כשאין פלאגין חדש יותר
android.injected.testOnly=false לא פועל
Dexer‏ (D8)
שגיאה במיזוג של Dex שקשורה לנתונים סינתטיים גלובליים אחרי שדרוג AS Canary 6 ל-7
עדכון ספריית המטא-נתונים של Kotlin לגרסה 0.6.0
נראה שדרושה פתרון עקיף ל-JDK-8272564 ברמת API 28-30
Lint
בדיקת איתור שגיאות בקוד של ResourceType לא פועלת במקורות של Kotlin
VersionChecks לא מטפל בבדיקות טווח של Kotlin
תוצאה חיובית שגויה ל-InlinedApi כשעוטפים אותו
Lint false positive Recycle regarding openInputStream
[BuildTool/Lint] מאפיין ה-constructor של ChecksSdkIntAtLeast
Lint: PartialResults merging works incorrectly
גרסת Android Studio מסוימת מסומנת בטעות כגרסה לא עדכנית.
ה-EP AndroidDeprecationInspection.DeprecationFilter אף פעם לא רשום בקובץ android-plugin.xml
ההסבר על בדיקת איתור השגיאות של 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) גורמת לשגיאת איתור שגיאות בקוד (אבל אמורה להופיע אזהרה)
AGP Flamingo Alpha 8 Lint NewApi Desugar Regression
לא בוצעה הסרה של הסוכר מ-TypedArray#close‏ (API 31), אבל AS לא מציג אזהרה כשמשתמשים ב-try-with-resources
Lint לא בודק הטמעות חוקיות של נתונים (casts) לנמעני קריאה
Lint בודק הטמעות בטוחות של ממשקים רק בממשקים שהוטמעו ישירות, ולא בממשקים שעברו בירושה
שילוב איתור שגיאות בקוד
קובץ הבסיס הוא כרגע קלט ופלט של משימות ה-Lint
Shrinker‏ (R8)
שגיאת NPE או שגיאת טענת נכוֹנוּת באימות המסגרת של CF
נסיגה אחרי הסרת מטמון של חיפוש שדות
‎:app:minifyVariantWithR8‎ גורם ל-NullPointerException ב-AGP 7.4.0-beta02
R8: ClassNotFoundException when -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

Android Gradle plugin 8.0.1

בעיות שתוקנו
Shrinker‏ (R8)
שגיאה: "No VersionRequirement with the given id in the table" אחרי שדרוג AGP 7.2.2 -> 7.4.0
R8 NullPointerException at markTypeAsLive AGP 7.4.1
[R8 4.0.53] Hard class verification failure on Android 11

Android Gradle plugin 8.0.2

בעיות שתוקנו
Shrinker‏ (R8)
R8 נכשל במהלך ה-build של Compose עם ArrayIndexOutOfBoundsException
VerifyError: Verifier rejected class when using R8 with Kotlin 1.8.20
R8 ב-AGP 8 גורם לשיבושים בשירות Google Fit
המערכת לא מייצגת בצורה נכונה מידע על קובץ מקור עם שמות שיותר מאחד מהם חופף לשמות הקלט