‫Android Gradle Plugin 4.2.0 (מרץ 2021)

תאימות

גרסת המינימום גרסת ברירת המחדל פתקים
Gradle 6.7.1 לא רלוונטי יש מידע נוסף במאמר בנושא עדכון Gradle.
SDK Build Tools 30.0.2 30.0.2 צריך להתקין או להגדיר את SDK Build Tools.
NDK לא רלוונטי 21.4.7075529 צריך להתקין או להגדיר גרסה אחרת של NDK.

תכונות חדשות

הגרסה הזו של Android Gradle plugin כוללת את התכונות החדשות הבאות.

גרסה 8 של שפת Java כברירת מחדל

החל מגרסה 4.2, ‏ AGP ישתמש ברמת השפה Java 8 כברירת מחדל. ‫Java 8 מספקת גישה למספר תכונות חדשות בשפה, כולל ביטויי למדה, הפניות לשיטות ושיטות סטטיות של ממשק. הרשימה המלאה של התכונות הנתמכות מופיעה במאמרי העזרה של Java 8.

כדי לשמור על ההתנהגות הקודמת, צריך לציין במפורש את Java 7 בקובץ build.gradle.kts או build.gradle ברמת המודול:

// build.gradle
android {
  ...
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }
  // For Kotlin projects, compile to Java 6 instead of 7
  kotlinOptions {
    jvmTarget = "1.6"
  }
}
// build.gradle.kts
android {
  ...
  compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
  }
  // For Kotlin projects, compile to Java 6 instead of 7
  kotlinOptions {
    jvmTarget = "1.6"
  }
}

מהדר חדש של משאבי JVM

מהדורה חדשה של מהדר משאבי JVM ב-Android Gradle plugin 4.2 מחליפה חלקים של מהדר המשאבים AAPT2, ועשויה לשפר את ביצועי ה-build, במיוחד במחשבי Windows. הקומפיילר החדש של משאבי JVM מופעל כברירת מחדל.

יש עכשיו תמיכה בחתימה בגרסאות 3 ו-4

‫Android Gradle Plugin 4.2 תומך עכשיו בפורמטים של חתימה APK v3 ו-APK v4. כדי להפעיל אחד מהפורמטים האלה או את שניהם בגרסה שלכם, מוסיפים את המאפיינים הבאים לקובץ build.gradle או build.gradle.kts ברמת המודול:

// build.gradle
android {
  ...
  signingConfigs {
    config {
        ...
        enableV3Signing true
        enableV4Signing true
    }
  }
}
// build.gradle.kts
android {
  ...
  signingConfigs {
      config {
          ...
          enableV3Signing = true
          enableV4Signing = true
      }
  }
}

חתימה ב-APK v4 מאפשרת לפרוס במהירות קובצי APK גדולים באמצעות התקנת APK מצטברת ב-ADB ב-Android 11. התג החדש הזה מטפל בשלב החתימה על ה-APK בתהליך הפריסה.

הגדרת חתימת אפליקציה לכל וריאנט

עכשיו אפשר להפעיל או להשבית את חתימת האפליקציה בפלאגין Android Gradle לכל וריאנט.

בדוגמה הזו מוסבר איך להגדיר חתימה על אפליקציה לכל וריאנט באמצעות השיטה onVariants() ב-Kotlin או ב-Groovy:

androidComponents {
    onVariants(selector().withName("fooDebug"), {
        signingConfig.enableV1Signing.set(false)
        signingConfig.enableV2Signing.set(true)
    })

מאפיין חדש של Gradle: android.native.buildOutput

כדי לצמצם את העומס בפלט של ה-build, ‏ AGP 4.2 מסנן הודעות מ-builds מקוריים שמשתמשים ב-CMake וב-ndk-build, ומציג כברירת מחדל רק את הפלט של מהדר C/C++. בעבר, שורת פלט נוצרה לכל קובץ שנבנה, וכתוצאה מכך נוצרה כמות גדולה של הודעות מידע.

כדי לראות את כל הפלט המקורי, מגדירים את מאפיין Gradle החדש android.native.buildOutput לערך verbose.

אפשר להגדיר את המאפיין הזה בקובץ gradle.properties או באמצעות שורת הפקודה.

gradle.properties
android.native.buildOutput=verbose

שורת פקודה
-Pandroid.native.buildOutput=verbose

ערך ברירת המחדל של המאפיין הזה הוא quiet.

שינוי בהתנהגות של קובצי gradle.properties

החל מ-AGP 4.2, אי אפשר יותר לבטל את ההגדרה של מאפייני Gradle מפרויקטים משניים. במילים אחרות, אם מצהירים על מאפיין בקובץ gradle.properties בפרויקט משנה במקום בפרויקט הבסיס, המערכת תתעלם ממנו.

לדוגמה, בגרסאות קודמות, AGP קרא ערכים מתוך <var>projectDir</var>/gradle.properties, <var>projectDir</var>/app/gradle.properties, <var>projectDir</var>/library/gradle.properties, וכו'. במודולים של אפליקציות, אם אותה מאפיין Gradle היה קיים גם ב- <var>projectDir</var>/gradle.properties וגם ב- <var>projectDir</var>/app/gradle.properties, הערך מ- <var>projectDir</var>/app/gradle.properties קיבל עדיפות.

ב-AGP 4.2, אופן הפעולה הזה השתנה, ו-AGP לא יטען ערכים מ-gradle.properties בפרויקטים משניים (למשל, <var>projectDir</var>/app/gradle.properties). השינוי הזה משקף את ההתנהגות החדשה של Gradle ותומך בשמירת הגדרות התצורה במטמון

מידע נוסף על הגדרת ערכים בקובצי gradle.properties זמין במסמכי Gradle.

שינויים בתאימות ובאופן ההגדרה של Gradle

כשמריצים את כלי ה-build של Gradle ב-Android Studio, נעשה שימוש ב-JDK שכלול ב-Studio. בגרסאות קודמות, JDK 8 נכלל ב-Studio. לעומת זאת, בגרסה 4.2, ‏ JDK 11 כלול בחבילה. כשמשתמשים ב-JDK החדש שצורף כדי להריץ את Gradle, יכול להיות שיהיו בעיות תאימות או השפעה על הביצועים של JVM בגלל שינויים ב-garbage collector. הבעיות האלה מתוארות בהמשך.

הערה: מומלץ להריץ את Gradle עם JDK 11, אבל אפשר לשנות את ה-JDK שמשמש להרצת Gradle בתיבת הדו-שיח Project Structure. שינוי ההגדרה הזו ישנה רק את ה-JDK שמשמש להפעלת Gradle, ולא ישנה את ה-JDK שמשמש להפעלת Studio עצמו.

תאימות של Studio עם Android Gradle Plugin ‏ (AGP)

‫Android Studio 4.2 יכול לפתוח פרויקטים שמשתמשים ב-AGP 3.1 ומעלה, בתנאי ש-AGP מריץ Gradle 4.8.1 ומעלה. מידע נוסף על תאימות ל-Gradle זמין במאמר בנושא עדכון Gradle.

אופטימיזציה של קובצי build ב-Gradle ל-JDK 11

העדכון הזה ל-JDK 11 משפיע על הגדרת ברירת המחדל של איסוף האשפה ב-JVM, כי ב-JDK 8 נעשה שימוש באיסוף אשפה מקביל, וב-JDK 11 נעשה שימוש באיסוף אשפה מסוג G1.

כדי לשפר את ביצועי הבנייה, מומלץ לבצע בדיקות של בניית Gradle באמצעות איסוף נתונים מקבילי של אובייקטים מיותרים (garbage collection). ב-gradle.properties מגדירים את הפרטים הבאים:

org.gradle.jvmargs=-XX:+UseParallelGC

אם כבר מוגדרות אפשרויות אחרות בשדה הזה, מוסיפים אפשרות חדשה:

org.gradle.jvmargs=-Xmx1536m -XX:+UseParallelGC

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

קובצי DEX לא דחוסים בקובצי APK כש-minSdk = 28 ומעלה

‫AGP אורז עכשיו קובצי DEX לא דחוסים ב-APK כברירת מחדל כש-minSdk = 28 או יותר. הפעולה הזו גורמת לעלייה בגודל ה-APK, אבל היא מובילה לגודל התקנה קטן יותר במכשיר, וגודל ההורדה נשאר בערך אותו דבר.

כדי לחייב את AGP לארוז במקום זאת את קובצי ה-DEX כשהם דחוסים, אפשר להוסיף את השורות הבאות לקובץ build.gradle:

android {
    packagingOptions {
        dex {
            useLegacyPackaging true
        }
    }
}

שימוש ב-DSL לאריזת ספריות מקוריות דחוסות

מומלץ לארוז ספריות מקוריות בצורה לא דחוסה, כי כך גודל ההתקנה של האפליקציה קטן יותר, גודל ההורדה של האפליקציה קטן יותר וזמן הטעינה של האפליקציה מהיר יותר עבור המשתמשים. עם זאת, אם רוצים שפלאגין Android Gradle ידחס ספריות Native כשהאפליקציה נבנית, צריך להגדיר את useLegacyPackaging לערך true בקובץ build.gradle של האפליקציה:

android {
    packagingOptions {
        jniLibs {
            useLegacyPackaging true
        }
    }
}

הדגל useLegacyPackaging מחליף את מאפיין המניפסט extractNativeLibs. מידע נוסף זמין בהערת הגרסה בנושא ספריות מקוריות שנארזות כברירת מחדל ללא דחיסה.