פלאגין 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 Plugin 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 at 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 וגם במקורות של האפליקציה.

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

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

החל מ-AGP 8.0, ערכי ברירת המחדל של הדגלים האלה השתנו ל- שיפור ביצועי ה-build. כדי לקבל עזרה בהתאמת הקוד לתמיכה בחלק מהשינויים האלה, תוכלו להשתמש ב-AGP Upgrade Assistant (כלים > AGP 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 מאולצים

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

סימון ערך נאכף הערות
android.dependencyResolutionAtConfigurationTime.warn true AGP 8.0 פולט אזהרה אם הוא מזהה פתרון של הגדרות במהלך שלב ההגדרה, כי זה משפיע לרעה על זמני ההגדרה של Gradle.
android.r8.failOnMissingClasses true AGP 8.0 נכשל בגרסאות build שמשתמשות ב-R8 אם יש מחלקות חסרות לבצע אופטימיזציה טובה יותר של DEX. כדי לפתור את הבעיה, צריך להוסיף ספריות חסרות או -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 ו-APKs, כמו כן, AGP 8.0 מוסיף רשימה של מאגרי פרויקטים למידע הזה. מידע נוסף זמין במאמר מידע על יחסי תלות ב-Play Console.
android.enableArtProfiles true מעכשיו, פרופילים בסיסיים של משתמשים תמיד נוצרים. פרטים נוספים זמינים במאמר פרופילים בסיסיים.
android.enableNewResourceShrinker true שימוש בהטמעה החדשה של המשאב shinker כברירת מחדל. הגרסה החדשה Resource shrinker כולל תמיכה בתכונות דינמיות.
android.enableSourceSetPathsMap true משמש לחישוב מיפויים יחסיים של נתיבי משאבים, כך שה-builds של Gradle מתעדכנים לעיתים קרובות יותר.
android.cacheCompileLibResources true עכשיו אפשר לשמור במטמון כברירת מחדל משאבים של ספריות שנאספו, כי Gradle עוקב אחרי קובצי המשאבים ביחס למיקום הפרויקט. נדרשת android.enableSourceSetPathsMap כדי להפעיל.
android.disableAutomaticComponentCreation true AGP 8.0 לא יוצר רכיב תוכנה כברירת מחדל. במקום זאת, מערכת AGP יוצרת את SoftwareComponents רק לגרסאות שהוגדר להן לפרסם באמצעות ה-DSL לפרסום.

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

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

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

אין תמיכה בהקצאת מאפיינים איטיים (lazy) ב-Kotlin

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

יצירת קטגוריות של משימות בכלי הניתוח

החל מ-Android Studio Flamingo, ל-Build Analyzer יש תצוגת ברירת מחדל חדשה עבור משימות שמשפיעות על משך הזמן של ה-build. אם בפרויקט שלכם נעשה שימוש ב-AGP 8.0 ואילך, במקום להציג משימות בנפרד, בקטגוריה שלכם. לדוגמה, משימות ספציפיות ל-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
אסור להשתמש בפלאגין של Android Gradle באמצעות הפונקציה ConfigurationUtil.Configure(closure, target) שהוצאה משימוש
עדכון הבדיקות של AGP כך שישתמשו ב-KGP 1.7.20-Beta
Gradle 7.4 נכשלה (לא הייתה אפשרות ליצור מופע של AnalyticsService)
חדש 'קבוע טיפוסים לא ידועים' (enum) מ-Javac ב-AGP 7.4.0-alpha09
ההגדרה של MergeGeneratedProguardFilesCreationAction איטית גם כשאחסון במטמון של ההגדרות מופעל
[AGP] Add generated source directory to IDE model (Variant API)
הכלי JavaPluginConvention ו- HasConvention הוצא משימוש
כברירת מחדל, אין להוסיף אזהרות מסוג התעלמות ל-R8
הצגת אזהרה כשאין קובצי הגנה
AGP 7.3.0 משבש את סנכרון Gradle בפרויקטים של פלטפורמת Gradle
ספריית APK: ApkVerifier$results.getV4SchemeSigners() מסומנת כפרטית
הפסקת יצירת הגדרה של androidJacocoAnt אם הכיסוי לא מופעל
שימוש ב- @IntDef ברכיב ספרייה לא גורם ליצירת notes.zip ב-aar.
לא ניתן למצוא סופר-סוג משותף ל- ול-
הוספת גרסה של מאפיין gradle של LINT_ORIGINAL_STACKTRACE=true
אריזות לא עדכניות של רכיבי הכנה לא פעילים ב-AAR
מעבר מנכס יעד לנכס exportLocation כדי לטפל באזהרה על הוצאה משימוש ולהתכונן ל-Gradle 9.0
חשוב לקחת בחשבון את סימון '--השקה' כשמגדירים משימת JavaCompile
[AGP-7.3.0-beta03] הפעולה של ShrinkResourcesNewShrinkerTask נכשלה כשיש שורה ריקה אחרי הצהרת ה-XML
יעד lintVital מופעל כברירת מחדל בווריאנט של ניפוי באגים
הצגת אזהרה כשאין קובצי הגנה
AGP מנסה להוסיף את kotlinOptions.freeCompilerArgs בשלב ביצוע המשימה
Gradle sync failed: Sync failed: reason unknown
DependencyReportTask לא תואם למטמון ההגדרות
ביטול משאבים באמצעות resValue ב-build.gradle מוביל לשגיאה: משאבים כפולים
לסוג ה-build 'debug' יש מפתח חתימה שמוגדר כברירת מחדל, ולסוגים אחרים אין
שימוש בתכונות דינמיות ובצמצום משאבים גורם לקריסה בסביבת זמן הריצה
'ניפוי באגים' לסוג ה-build יש מפתח חתימה שמוגדר כברירת מחדל, לאחרים אין
ספריית המקור שנוצרה בתור ספריית 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
הסנכרון נכשל עם שגיאה הצפנה 'האוסף לא מכיל רכיב שתואם לפרדקט'.
אינסטרומנטציה API לא משנה יחסי תלות מקומיים של קבצים
השגיאה 'AnnotationProcessorOptions.arguments.arguments are queried') בעדכון לגרסה 7.4 בטא 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 עם 'הרצת שאילתה על הערך הממופה של map(provider(java.util.Set) (לפני המשימה '...' הסתיים לא נתמך"
בעיות מסוג 'com.android.build.gradle.tasks.ShaderCompile' עם מטמון של הגדרות אישיות
הוספה למשאבים של Java באמצעות ממשקי API של AGP גורמת לשבירה של מטמון ההגדרות
הפלאגין של Linux אינו חלק מ-gradle-api
DexingFileDependenciesTask.outputKeepRules היא ספרייה אבל היא מסומנת כקובץ OutputFile
שדרוג ל-AGP 7.4 גורם ל-StackOverflowError
resultDebugUnitTestManifest נכשל עם placeholders של מניפסטים לווריאציות לבדיקה
איתור שגיאות בקוד (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
איתור שגיאות בקוד: המיזוג של תוצאות חלקיות פועל באופן שגוי
מערכת 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 8lint NewApi Desugar Regression
לא בוצעה הסרה של הסוכר מ-TypedArray#close‏ (API 31), אבל AS לא מציג אזהרה כשמשתמשים ב-try-with-resources
Lint לא בודק הטמעות חוקיות של נתונים (casts) לנמעני קריאה
איתור שגיאות בקוד (lint) בודק העברות בטוחות רק לממשקים שמוטמעים ישירות, ולא לממשקים שעברו בירושה
Lint Integration
קובץ הבסיס הוא כרגע קלט ופלט של המשימות של Linux
Shrinker (R8)
שגיאת NPE או שגיאת טענת נכוֹנוּת באימות המסגרת של CF
רגרסיה אחרי הסרת מטמון של חיפוש שדות
' :app:minifyVariantWithR8' מקפיצה הודעת NullPointerחריגה ב-AGP 7.4.0-beta02
R8: ClassNotFoundError כאשר -allowaccessmodification
הוספת תמיכה במקבלי הקשר במטא-נתונים
.val.lang.VerifyError: Verifier rejected class androidx.compose.ui.graphics.colorspace.o: cancel androidx.compose.ui.graphics.colorspace.o.(AJAX.lang.Object) לא הצליח לבצע אימות: cancel androidx.compose.ui.graphics.colorspace.o.(java.lang.Object): [0xuiposgraphic object.Java.Objectlang.Object): לא ניתן לגשת למופע [0xuiposvision.vision.lang.Object): לא ניתן לגשת למופע android.ruise.langspace.
AGP 7.4.0/7.3.1 – ניסיון להוסיף פעולה לתור ברשימת משימות של מערך משימות שלא ניתן לדחוף אליו
צמצום קוד Renderscript: ירידה משמעותית בביצועים כשמשדרגים את AGP מגרסה 7.3.1 לגרסה 7.4.0

פלאגין Android Gradle 8.0.1

בעיות שתוקנו
Shrinker‏ (R8)
שגיאה: "אין דרישת גרסה עם המזהה הנתון בטבלה" לאחר שדרוג 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 נדחה מחלקה בעת שימוש ב-R8 עם Kotlin 1.8.20
R8 ב-AGP 8 גורם לשיבושים בשירות Google Fit
המערכת לא מייצגת בצורה נכונה מידע על קובץ מקור עם שמות שיותר מאחד מהם חופף לשמות הקלט