פלאגין 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

בפרויקטים חדשים נעשה עכשיו שימוש ב-Kotlin DSL ‏ (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 שזמינים ב-AGP 8.1.

סימון נוסף ב ערך ברירת מחדל פתקים
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false אם מפעילים את ההגדרה הזו בלי לציין הגדרות חתימה, AGP ישתמש בהגדרת החתימה של ניפוי הבאגים שמוגדרת כברירת מחדל כשמריצים build שאפשר ליצור ממנו פרופיל או לבצע בו ניפוי באגים. ההגדרה הזו מושבתת כברירת מחדל כדי לעודד את יוצרי ה-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 נכשלת עם השגיאה Unable to find manifest output (לא ניתן למצוא את פלט המניפסט) אם הערכים של 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 נכשלת עם השגיאה Unable to find manifest output (לא ניתן למצוא את פלט המניפסט) אם הערכים של 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
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)
הסרת הסוכר (desugaring) של ספריית הליבה גורמת לקריסת האפליקציה אחרי עדכונים אחרונים.
‫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 מוביל ל-java.lang.VerifyError: דחיית מחלקה
קריסה עם שגיאת אימות ב-Android מגרסה 12 ואילך