פלאגין 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' (אין VersionRequirement עם המזהה שצוין בטבלה) אחרי שדרוג מ-AGP 7.2.2 ל-7.4.0
‫R8 NullPointerException ב-markTypeAsLive‏ AGP 7.4.1
‫[R8 4.0.53] אימות קשיח של מחלקה נכשל ב-Android 11

שינוי שובר תאימות: חובה לציין מרחב שמות בסקריפט build ברמת המודול

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

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

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

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

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

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

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

דגל ערך נאכף הערות
android.dependencyResolutionAtConfigurationTime.warn true ‫AGP 8.0 מציג אזהרה אם הוא מזהה פתרון הגדרה במהלך שלב ההגדרה, כי זה משפיע לרעה על זמני ההגדרה של Gradle.
android.r8.failOnMissingClasses true גרסה AGP 8.0 נכשלת בבנייה שמשתמשת ב-R8 אם יש מחלקות חסרות, כדי להבטיח אופטימיזציה טובה יותר של DEX. כדי לפתור את הבעיה הזו, צריך להוסיף את הספריות החסרות או -dontwarnכללי שמירה. פרטים נוספים זמינים במאמר בנושא אזהרות על כיתות חסרות בכלי R8 shrinker.
android.testConfig.useRelativePath true כשמופעלת התמיכה בשימוש במשאבים, בנכסים ובמניפסטים של Android בבדיקות יחידה, AGP 8.0 יוצר קובץ test_config.properties שמכיל רק נתיבים יחסיים. כך אפשר לוודא שבדיקות יחידה ב-Android תמיד יוכלו להשתמש במטמון הבנייה של Gradle.
android.useNewJarCreator true ‫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. מידע נוסף מופיע במאמרי העזרה בנושא תוסף ההגדרות.

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

אין תמיכה בהקצאת מאפיינים עצלה ב-Kotlin

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

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

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

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

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

‫AGP 8.0.0-alpha09 מציג את התוסף החדש settings. התוסף Settings מאפשר לכם לרכז הגדרות גלובליות – הגדרות שחלות על כל המודולים – במקום אחד, כך שלא תצטרכו להעתיק ולהדביק את ההגדרות בכמה מודולים. בנוסף, אפשר להשתמש בתוסף ההגדרות כדי ליצור פרופילים להפעלת כלים, או הוראות שונות להפעלת כלי, ולעבור ביניהם.

כדי להשתמש בפלאגין ההגדרות, צריך להחיל את הפלאגין בקובץ 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 8.0 כדי לבצע build לאפליקציה, נדרש 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

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

Android Gradle plugin 8.0.1

בעיות שתוקנו
Shrinker (R8)
שגיאה: 'No VersionRequirement with the given id in the table' (אין VersionRequirement עם המזהה שצוין בטבלה) אחרי שדרוג מ-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 Plugin
כשל לא עקבי ב-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)
הודעת השגיאה החדשה 'unknown enum constant' מ-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
מעבר מנכס היעד אל הנכס 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' כולל מפתח חתימה שמוגדר כברירת מחדל, אבל סוגים אחרים לא כוללים מפתח כזה
generated source directory listed as Java directory in lint model's main source provider
‫Gradle 8.0-milestone-2 גורם לחריגה ב-AGP
אופטימיזציה של מיזוג קובצי Manifest לאפליקציות ולספריות
הוספה של gradle-settings-api ליצירת javadoc
הודעת השגיאה החדשה 'unknown enum constant' מ-javac ב-AGP 7.4.0-alpha09
‫AGP 7.4.0-alpha09 יוצר גרסאות build שלא ניתן להעלות ל-הפצת אפליקציות ב-Firebase
‫lint.xml במודולים לא נלקח בחשבון בבדיקת העדכניות של משימות lint
בעיה בפלאגין של Android Gradle מגרסה 7.0 ואילך ובבדיקות Android: לא ניתן למצוא משאב: מזהה
‫configureCMakeDebug קורס באופן לא עקבי עם חריגת מצביע null
שגיאת IllegalAccessError בשדרוג פרויקט ל-AS2022.2.1.5, FireBasePerfPlugin
הסנכרון נכשל עם השגיאה המסתורית "האוסף לא מכיל רכיב שתואם לתנאי".
‫Instrumentation API לא משנה תלות בקבצים מקומיים
השגיאה `AnnotationProcessorOptions.arguments are queried` כשמעדכנים לגרסה 7.4 Beta 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 באמצעות ממשקי AGP API גורמת לשבירת מטמון ההגדרות
הפלאגין Lint לא מהווה חלק מ-gradle-api
‫DexingFileDependenciesTask.outputKeepRules הוא ספרייה אבל הוא מסומן כ-OutputFile
שדרוג ל-AGP 7.4 מוביל ל-StackOverflowError
הפעולה processDebugUnitTestManifest נכשלת עם 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
בדיקת ה-lint של ResourceType לא פועלת במקורות kotlin
הפונקציה VersionChecks לא מטפלת בבדיקות טווח של Kotlin
תוצאה חיובית שגויה לגבי InlinedApi כשהיא עטופה
Lint false positive Recycle regarding openInputStream
‫[BuildTool/Lint] מאפיין constructor של ChecksSdkIntAtLeast
‫Lint: מיזוג של 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 לא יכול לזהות הקצאה של ערכים קבועים ממזהה משאב
לא מוצגת שגיאה במזהה התצוגה המפורטת
אם לא מתבצעת דה-סריאליזציה של מטמון משאבי ה-lint, מתקבלת שגיאת lint (אבל אמורה להתקבל אזהרה)
‫AGP Flamingo Alpha 8 Lint NewApi Desugar Regression
‫TypedArray#close (API 31) לא מבוטל אבל AS לא מציג אזהרה כשמשתמשים בו ב-try-with-resources
‫Lint לא בודק המרות חוקיות של מקבלי שיחות
כלי Lint בודק רק המרות בטוחות של ממשקים שהוטמעו ישירות, ולא של ממשקים שעברו בירושה
שילוב Lint
קובץ הבסיס הוא כרגע קלט ופלט של משימות Lint
Shrinker (R8)
NPE / assertion error in CF frame verifier
רגרסיה אחרי הסרת מטמון של חיפוש שדות
‫`‎:app:minifyVariantWithR8` מוציא NullPointerException ב-AGP 7.4.0-beta02
‫R8: ClassNotFoundException כשמשתמשים ב-‎-allowaccessmodification
הוספת תמיכה במקבלים של הקשר במטא-נתונים
‫java.lang.VerifyError: המאמת דחה את המחלקה 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