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
כלי חדש של Android Gradle plugin 4.2 למהדר משאבים של JVM מחליף חלקים של מהדר המשאבים AAPT2, ויכול לשפר את ביצועי ה-build, במיוחד במחשבי Windows. הקומפיילר החדש של משאבי JVM מופעל כברירת מחדל.
יש עכשיו תמיכה בחתימה בגרסאות 3 ו-4
פלאגין Android Gradle 4.2 תומך עכשיו בפורמטים לחתימה APK v3
ו-APK v4.
כדי להפעיל אחד מהפורמטים האלה או את שניהם ב-build, מוסיפים את המאפיינים הבאים לקובץ 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 משפיע על הגדרת ברירת המחדל של איסוף הזבל (garbage collection) ב-JVM, כי ב-JDK 8 נעשה שימוש באיסוף זבל מקביל, וב-JDK 11 נעשה שימוש באיסוף זבל מסוג G1.
כדי לשפר את ביצועי ה-build, מומלץ לבצע בדיקה של ה-builds ב-Gradle באמצעות איסוף מקביל של נתונים לא רלוונטיים. ב-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. מידע נוסף זמין בהערת הגרסה בנושא ספריות מקוריות שנארזות כברירת מחדל ללא דחיסה.