פלאגין 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] אימות קשיח של מחלקה נכשל ב-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 פרופילים בסיסיים נוצרים עכשיו תמיד. פרטים נוספים זמינים במאמר בנושא פרופילי בסיס.
android.enableNewResourceShrinker true שימוש בהטמעה החדשה של כלי להסרת משאבים לא נחוצים כברירת מחדל. הכלי החדש לצמצום משאבים כולל תמיכה בתכונות דינמיות.
android.enableSourceSetPathsMap true התוסף משמש לחישוב מיפויי נתיבי משאבים יחסיים, כך שהגרסאות של 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 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

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

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

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

כשמשתמשים ב-Android Gradle Plugin 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.0

בעיות שתוקנו
Android Gradle Plugin
כשל לא עקבי ב-build במשימה MergeResources
השימוש ב-JavaPluginConvention וב-HasConvention הוצא משימוש
מיקום הקובץ שגוי ולא עקבי ב-Transform 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 App Distribution
‫lint.xml במודולים לא נלקח בחשבון בבדיקה UP-TO-DATE של משימות lint
בעיה בגרסה 7.0 ואילך של Android Gradle Plugin ובבדיקות 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 עם השגיאה "Querying the mapped value of map(provider(java.util.Set)) before task '...' has completed is not supported" (אין תמיכה בשאילתת הערך הממופה של 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 Integration
קובץ הבסיס הוא כרגע קלט ופלט של משימות ה-Lint
Shrinker (R8)
NPE / assertion error in CF frame verifier
רגרסיה אחרי הסרת מטמון של חיפוש שדות
‫`: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‏ 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.2

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