פלאגין Android Gradle 8.1.0 (יולי 2023)

‫Android Gradle Plugin 8.1.0 הוא גרסה מרכזית שכוללת מגוון של תכונות ושיפורים חדשים.

תאימות

גרסת המינימום גרסת ברירת המחדל הערות
Gradle ‫8.0 ‫8.0 יש מידע נוסף במאמר בנושא עדכון Gradle.
SDK Build Tools 33.0.1 33.0.1 צריך להתקין או להגדיר את SDK Build Tools.
NDK לא רלוונטי 25.1.8937393 צריך להתקין או להגדיר גרסה אחרת של NDK.
JDK 17 17 מידע נוסף זמין במאמר בנושא הגדרת גרסת ה-JDK.

‫Kotlin DSL היא ברירת המחדל להגדרת build

בפרויקטים חדשים, שפת ה-DSL של Kotlin ‏ (build.gradle.kts) משמשת עכשיו כברירת מחדל להגדרת ה-build. היא מציעה חוויית עריכה טובה יותר מאשר Groovy DSL (build.gradle) עם הדגשת תחביר, השלמת קוד וניווט להצהרות. שימו לב: אם אתם משתמשים ב-AGP 8.1 וב-Kotlin DSL להגדרת ה-build, מומלץ להשתמש ב-Gradle 8.1 כדי ליהנות מהחוויה הטובה ביותר. מידע נוסף זמין במדריך להעברת נתונים של Kotlin DSL.

תמיכה אוטומטית בשפה לכל אפליקציה

החל מ-Android Studio Giraffe Canary 7 ומ-AGP 8.1.0-alpha07, אפשר להגדיר את האפליקציה כך שתתמוך אוטומטית בהעדפות שפה לכל אפליקציה. בהתבסס על משאבי הפרויקט, פלאגין Android Gradle יוצר את הקובץ LocaleConfig ומוסיף אליו הפניה בקובץ המניפסט הסופי, כך שלא צריך יותר לעשות זאת באופן ידני. ‫AGP משתמש במשאבים בתיקיות res של מודולי האפליקציה וביחסי תלות של מודולי ספריות כדי לקבוע את הלוקאלים שייכללו בקובץ LocaleConfig.

שימו לב שתכונת השפה האוטומטית לכל אפליקציה תומכת באפליקציות שפועלות ב-Android 13 (רמת API‏ 33) ומעלה. כדי להשתמש בתכונה, צריך להגדיר את הערך של compileSdkVersion ל-33 ומעלה. כדי להגדיר העדפות שפה לכל אפליקציה בגרסאות קודמות של Android, עדיין צריך להשתמש בממשקי ה-API ובבוררי השפה באפליקציה.

כדי להפעיל תמיכה אוטומטית בשפה לכל אפליקציה, צריך לציין לוקאל ברירת מחדל:

  1. בתיקייה res של מודול האפליקציה, יוצרים קובץ חדש בשם resources.properties.
  2. בקובץ resources.properties, מגדירים את הלוקאל שמשמש כברירת מחדל באמצעות התווית unqualifiedResLocale. כדי ליצור את שמות הלוקאל, משלבים את קוד השפה עם קוד הסקריפט וקוד האזור האופציונליים, ומפרידים בין כל אחד מהם באמצעות מקף:

    • שפה: צריך להשתמש בקוד ISO 639-1 בן שתי אותיות או שלוש אותיות.
    • כתב (אופציונלי): צריך להשתמש בקוד ISO 15924.
    • אזור (אופציונלי): משתמשים בקוד בן שתי אותיות ISO 3166-1-alpha-2 או בקוד בן שלוש ספרות UN_M.49.

    לדוגמה, אם ברירת המחדל של הלוקאל היא אנגלית אמריקאית:

        unqualifiedResLocale=en-US
        

‫AGP מוסיף את הלוקאל שמוגדר כברירת מחדל ולוקאלים חלופיים שציינתם, באמצעות ספריות values-* בתיקייה res, לקובץ LocaleConfig שנוצר אוטומטית.

תמיכה אוטומטית בשפה לכל אפליקציה מושבתת כברירת מחדל. כדי להפעיל את התכונה, משתמשים בהגדרה generateLocaleConfig בבלוק androidResources {} של קובץ build.gradle.kts ברמת המודול (קובץ build.gradle אם משתמשים ב-Groovy):

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Groovy

android {
  androidResources {
    generateLocaleConfig true
  }
}

‫Android Lint מכיל bytecode שמטרגט את JVM 17

החל מ-AGP 8.1.0-alpha04, ‏ Android Lint מכיל בייטקוד שמיועד ל-JVM 17. אם אתם כותבים בדיקות Lint בהתאמה אישית, אתם צריכים לבצע קומפילציה באמצעות JDK 17 ומעלה ולציין jvmTarget = '17' באפשרויות של קומפיילר Kotlin.

מידע נוסף על כלי ה-lint זמין במאמר בנושא שיפור הקוד באמצעות בדיקות lint.

ההגדרה של דחיסת ספריות מקוריות עברה ל-DSL

החל מ-AGP 8.1.0-alpha10, תוצג אזהרה אם לא תגדירו דחיסה של ספרייה מקומית באמצעות DSL במקום המניפסט. בהמשך מוסבר איך לעדכן את ההגדרות כדי להשתמש ב-DSL. כדי לקבל עזרה בעדכונים האלה, אפשר להשתמש בכלי AGP Upgrade Assistant (Tools > AGP Upgrade Assistant).

כדי להשתמש בספריות מקוריות לא דחוסות, צריך להסיר את המאפיין android::extractNativeLibs מקובץ המניפסט ולהוסיף את הקוד הבא לקובץ build.gradle.kts ברמת המודול (קובץ build.gradle אם משתמשים ב-Groovy):

Kotlin

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging = false
    }
  }
}

Groovy

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

דגלים ניסיוניים של גרסת build

אלה דגלים ניסיוניים להגדרת גרסת ה-build שזמינים ב-AGP 8.1.

סימון נוסף ב ערך ברירת מחדל פתקים
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false אם מפעילים את ההגדרה הזו בלי לציין הגדרות חתימה, AGP ישתמש בהגדרת חתימת ניפוי הבאגים שמוגדרת כברירת מחדל כשמריצים בנייה שניתן ליצור ממנה פרופיל או לנפות בה באגים. ההגדרה הזו מושבתת כברירת מחדל כדי לעודד את יוצרי ה-build להצהיר על הגדרות חתימה ספציפיות של פרופילים.
android.experimental.library.desugarAndroidTest AGP 8.0 false הדגל הזה מאפשר ליוצרי ספריות להפעיל desugaring של ספריות ליבה עבור קובצי APK של בדיקות בלי להשפיע על קובץ ה-AAR שנוצר, למשל באמצעות linting. אנחנו מתכננים לתמוך בהתנהגות הזו ב-Variant API בעתיד.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false אם האפשרות הזו מופעלת, Gradle Managed Devices מאפשרת סוג מכשיר מותאם אישית שמוגדר על ידי המשתמש ויכול להיות מסופק על ידי פלאגין. צריך להפעיל את הדגל הזה אם רוצים להשתמש בפלאגין Firebase Test Lab.
android.lint.printStackTrace AGP 8.0 false אם האפשרות הזו מופעלת, Android lint מדפיס את ה-stacktrace אם הוא קורס. לדגל הזה יש את אותן היכולות כמו למשתנה הסביבה LINT_PRINT_STACKTRACE.
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 ללא מציינת את המספר המקסימלי של מכשירים מנוהלים בו-זמנית של Gradle‏ (AVD) שיהיו פעילים בכל נקודת זמן. אם הערך הוא 0 או שלילי, אין מספר מקסימלי של מכשירים.
android.experimental.testOptions.installApkTimeout AGP 8.0 ללא משך הזמן הקצוב לתפוגה בשניות להתקנת קובץ APK. אם הערך הוא 0 או שלילי, הוא יוגדר כערך ברירת מחדל על ידי UTP.

בעיות שתוקנו

Android Gradle Plugin 8.1.4

בעיות שתוקנו
Android Gradle Plugin
אל תפעילו את משימת ה-dexing על המחלקות של פרויקטים משניים כשהן כבר עברו dexing באמצעות טרנספורמציות של ארטיפקטים

Android Gradle Plugin 8.1.3

בעיות שתוקנו
Android Gradle Plugin
‫[AGP 8.1.0] הפקודה ‎./gradlew test נכשלת עם השגיאה 'לא ניתן למצוא את פלט המניפסט' אם גם splits.abi.isEnable וגם testOptions.unitTests.isIncludeAndroidResources מוגדרים כ-true
כשל ב-Build אחרי עדכון ל-AGP 8.1

Android Gradle Plugin 8.1.2

בעיות שתוקנו
Android Gradle Plugin
‫androidResources לא זמין במודול ספריית Android
‫[AGP 8.1.0] הפקודה ‎./gradlew test נכשלת עם השגיאה 'לא ניתן למצוא את פלט המניפסט' אם גם splits.abi.isEnable וגם testOptions.unitTests.isIncludeAndroidResources מוגדרים כ-true
Shrinker (R8)
‫Kotlin 1.9 גורם להשמדה של ביטויי למדה של Kotlin על ידי R8 אם בדיקות ה-null הוסרו
הגרסה R8 נכשלת עם השגיאה Undefined value encountered during compilation (זוהה ערך לא מוגדר במהלך ההידור) עבור play-services-measurement-21.3.0-runtime.jar

Android Gradle Plugin 8.1.1

בעיות שתוקנו
Dexer (D8)
‫Java 16 Records: equals(null) throws NullPointerException
Shrinker (R8)
‫java.lang.VerifyError: המאמת דחה את המחלקה
התהליך Build נתקע בשלב ‎ :minifyReleaseWithR8 כשמשתמשים בספריית Apache POI
דחיית הפעלה כשמופעלת האפשרות r8 optimize
NoClassDefFoundError for java.lang.reflect.Executable

Android Gradle Plugin 8.1.0

בעיות שתוקנו
Android Gradle Plugin
בעיות ב-`com.android.build.gradle.tasks.ShaderCompile` עם מטמון ההגדרות
הוספה למשאבי Java באמצעות ממשקי AGP API גורמת לשבירת מטמון ההגדרות
‫[Android Studio : Flamingo | 2022.2.1 Canary 8] liblog.so is packaged inside the APK
‫KGP קורא את המניפסט במהלך ההגדרה, וגורם לביטול התוקף של מטמון ההגדרות כשמשנים את המניפסט
הודעת האזהרה לא ברורה כשמופיעה בעיה במניפסט הממוזג
שדרוג ל-AGP 7.4 מוביל ל-StackOverflowError
‫ClassNotFoundException בתכונה דינמית שתלויה ישירות בפרויקט משנה של ספריית Kotlin
הפעולה processDebugUnitTestManifest נכשלת עם placeholders של מניפסטים לגרסאות בדיקה
הפעולה processDebugUnitTestManifest נכשלת עם placeholders של מניפסטים לגרסאות בדיקה
המאפיין namespace כנראה שייך ל-HasAndroidResources
אי אפשר להשבית את ההודעה 'קבצי Gradle השתנו מאז הסינכרון האחרון של הפרויקט'
ההודעה 'מומלץ להשתמש בפלאגין חדש יותר של Android Gradle' מוצגת כשאין פלאגין חדש יותר
הפעולה processDebugUnitTestManifest נכשלת עם placeholders של מניפסטים לגרסאות בדיקה
דגל בוליאני להשבתת הבדיקה של SDK למהדר ב-CheckAarMetadataTask
שגיאת build מתייחסת לרמת API‏ 34, שלא קיימת
הגדרת JVM toolchain לא משפיעה על הערך של targetCompatibility ב-JavaCompile
לרשומות של קישורי עומק לניווט עם דומיינים שרשומים כתווים כלליים לחיפוש אין מאפיין android:host במניפסט הממוזג
המשימה processDebugMainManifest נכשלה כי Android Gradle Plugin הוא מגרסה 8.1
אפשר להסיר את AnalyticsRecordingTask?
התוכן של output-metadata.json לא עקבי
אפשר להסיר את AnalyticsRecordingTask?
התוכן של output-metadata.json לא עקבי
הגדרת JVM toolchain לא משפיעה על הערך של targetCompatibility ב-JavaCompile
לרשומות של קישורי עומק לניווט עם דומיינים שרשומים כתווים כלליים לחיפוש אין מאפיין android:host במניפסט הממוזג
המשימה processDebugMainManifest נכשלה כי Android Gradle Plugin הוא מגרסה 8.1
‫Android Studio לא מתייחס למשתנה הסביבה STUDIO_GRADLE_JDK
סוגי מקור בהתאמה אישית צריכים ליצור ערכות מקורות עם כמה טעמים
צריך לעדכן את ה-API ואת המסמך של DependenciesInfoBuilder
‫DexingNoClasspathTransform‏ (minSdk >= 24) עם יעד Java 11 נכשל בגלל גורמים מורכבים חסרים
השיטה DslExtension.Builder.extendProjectWith() לא פועלת כמו שמתואר ב-Groovy
נוסף VariantSelector.withFlavor API שלא משתמש ב-kotlin.Pair
‫AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) has a cache miss because `proguard.txt` has changed
קובץ המניפסט הממוזג של האפליקציה מכיל את המאפיינים extractNativeLibs ו-useEmbeddedDex מהתלויות
‫AGP: חשיפת הנתיב לכלי AIDL ולקובץ AIDL של המסגרת כ-API ציבורי
בקשה: לאפשר ל-IDE להציע תיקון לבעיה PermittedSubclasses requires ASM9
באג: האפשרות 'הפעלת KSP ושימוש במעבד KSP עבור התלות הזו' פשוט מעבירה לאתר
גרסה Gradle 8.1 גורמת לבעיות בזיכרון המטמון של ההגדרות בגלל ‎ .gradle/.android/analytics.settings
‫generateLocaleConfig ב-AGP 8.1.0 משתמש בסדר לא דטרמיניסטי, מה שגורם לבעיות ב-builds שניתן לשחזר
Dexer (D8)
הסרת הסוכר של ספריית הליבה גורמת לקריסת האפליקציה אחרי עדכונים אחרונים.
‫agp 8.1.0 regression with API 21 - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Check failed: !method->IsAbstract()
Lint
‫Lint בודק רק המרות בטוחות לממשקים שהוטמעו ישירות, ולא לממשקים שעברו בירושה
‫Lint לא בודק המרות חוקיות של מקבלי שיחות
‫TypedArray#close (API 31) לא מבוטל אבל AS לא מציג אזהרה כשמשתמשים בו ב-try-with-resources
באג: אזהרה חיובית כוזבת 'הספק 'BC' הוצא משימוש החל מ-Android P...'
תוצאה חיובית שגויה של Lint לגבי remember אחרי שדרוג Kotlin לגרסה 1.8.0
אזהרת Lint חיובית כוזבת לגבי בדיקות SDK_INT שמתבצעות בתוך שיטה עם פרמטר enum
בדיקת ה-lint של TypographyQuotes לא פועלת על מרכאות עם תו בריחה
בדיקת ה-lint של TrustAllX509TrustManager מסמנת באופן שגוי ממשקים שמרחיבים את X509TrustManager
עיצוב מחדש רק של הקוד שהוסיף התיקון
‫Lint: תצוגה מקדימה של כוונה מעלה חריגה עבור ReplaceStringQuickFix
Shrinker (R8)
VerifyError: Verifier rejected class when using R8 with Kotlin 1.8.20
‫R8 ב-AGP 8 מפסיק את השירות Google Fit
הצגה לא נכונה של מידע על קובץ המקור עם שמות שיוריים שחופפים לשמות הקלט
ה-build של Compose נכשל ב-R8 עם ArrayIndexOutOfBoundsException
קוד פשוט שקשור ל-StringBuilder לא כולל קריאה ל-append במצב release או במצב debuggable=false
מקרה קצה בשיטה VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()
‫dex-startup-optimization results in java.lang.VerifyError: Rejecting class
קריסה עם שגיאת אימות ב-Android מגרסה 12 ואילך