פלאגין 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 at 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). אשף השדרוג יעזור לכם לעדכן את הקוד כדי להתאים אותו להתנהגות החדשה, או להגדיר דגלים כדי לשמר את ההתנהגות הקודמת.

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

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

החל מ-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.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 כדי לבנות את האפליקציה, נדרש 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' (אין דרישת גרסה עם המזהה שצוין בטבלה) אחרי שדרוג מ-AGP 7.2.2 ל-7.4.0
‫R8 NullPointerException at 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 יש מפתח חתימה שמוגדר כברירת מחדל, אבל לסוגים אחרים אין
ספריית המקור שנוצרה מופיעה כספריית Java בספק המקור הראשי של מודל ה-lint
‫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
‫lint.xml in modules is not considered for UP-TO-DATE check of lint tasks
בעיה בפלאגין של Android Gradle מגרסה 7.0 ואילך ובבדיקות Android: אי אפשר למצוא משאב: מזהה
‫configureCMakeDebug קורס באופן לא עקבי עם חריגת מצביע null
‫IllegalAccessError שדרוג פרויקט ל-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 עם השגיאה "אין תמיכה בשליחת שאילתה של הערך הממופה של 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] ChecksSdkIntAtLeast constructor property
‫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
הוספת תמיכה ב-context receivers במטא-נתונים
‫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