פלאגין של Android Gradle 7.0.0 (יולי 2021)
פלאגין של Android Gradle 7.0.0 הוא גרסה מרכזית שכוללת מגוון של תכונות ושיפורים חדשים.
7.0.1 (אוגוסט 2021)
העדכון הקטן הזה כולל תיקוני באגים שונים. כדי לראות רשימה של תיקוני באגים חשובים, קראו את הפוסט הרלוונטי ב בלוג של עדכוני הגרסאות.
תאימות
| גרסת המינימום | גרסת ברירת המחדל | הערות | |
|---|---|---|---|
| Gradle | 7.0.2 | 7.0.2 | יש מידע נוסף במאמר בנושא עדכון Gradle. |
| SDK Build Tools | 30.0.2 | 30.0.2 | צריך להתקין או להגדיר את SDK Build Tools. |
| NDK | לא רלוונטי | 21.4.7075529 | צריך להתקין או להגדיר גרסה אחרת של NDK. |
| JDK | 11 | 11 | מידע נוסף זמין במאמר הגדרת גרסת ה-JDK. |
כדי להפעיל את AGP 7.0, נדרש JDK 11
כשמשתמשים בפלאגין של Android Gradle בגרסה 7.0 כדי ליצור את האפליקציה, צריך עכשיו את JDK 11 כדי להריץ את Gradle. Android Studio Arctic Fox כולל את JDK 11 ומגדיר את Gradle להשתמש בו כברירת מחדל, כך שרוב המשתמשים ב-Android Studio לא צריכים לבצע שינויים בהגדרות של הפרויקטים שלהם.
אם אתם צריכים להגדיר ידנית את גרסת ה-JDK שבה AGP משתמש ב-Android Studio, אתם צריכים להשתמש ב-JDK 11 או בגרסה חדשה יותר.
כשמשתמשים ב-AGP בנפרד מ-Android Studio, משדרגים את גרסת ה-JDK על ידי הגדרת משתנה הסביבה JAVA_HOME או -Dorg.gradle.java.home אפשרות שורת הפקודה לספריית ההתקנה של JDK 11.
שימו לב ש-SDK Manager ו-AVD Manager בחבילת SDK Tools שהוצאה משימוש לא פועלים עם JDK 11. כדי להמשיך להשתמש ב-SDK Manager וב-AVD Manager עם AGP מגרסה 7.0 ואילך, צריך לעבור לגרסאות החדשות של הכלים בחבילה הנוכחית של כלי שורת הפקודה של Android SDK.
גרסה יציבה של Variant API
ה-Variant API החדש יציב עכשיו. הממשקים החדשים מופיעים בחבילה com.android.build.api.variant, ודוגמאות מופיעות בפרויקט gradle-recipes ב-GitHub. כחלק מ-Variant API החדש, הוספנו כמה קובצי ביניים שנקראים פריטי מידע שנוצרו בתהליך הפיתוח (Artifacts), דרך הממשק Artifacts. אפשר להשיג את פריטי המידע האלה, כמו המניפסט שעבר מיזוג, ולהתאים אותם אישית בצורה בטוחה באמצעות פלאגינים וקוד של צד שלישי.
נמשיך להרחיב את Variant API על ידי הוספת פונקציות חדשות והגדלת מספר פריטי המידע (artifacts) הזמינים להתאמה אישית.
שינויים בהתנהגות של Lint
בקטע הזה מתוארים כמה שינויים בהתנהגות של Lint בפלאגין Android Gradle בגרסה 7.0.0.
ניתוח קוד סטטי משופר לתלות של הפרויקט בספריות
עכשיו אפשר להריץ את lint עם checkDependencies = true מהר יותר מבעבר. בפרויקטים של Android שמורכבים מאפליקציה עם יחסי תלות בספרייה, מומלץ להגדיר את checkDependencies ל-true כמו בדוגמה הבאה, ולהריץ את lint באמצעות ./gradlew :app:lint. הפעולה הזו תנתח את כל המודולים של יחסי התלות במקביל ותפיק דוח אחד שכולל בעיות מהאפליקציה ומכל יחסי התלות שלה.
מגניב
// build.gradle
android {
...
lintOptions {
checkDependencies true
}
}Kotlin
// build.gradle.kts
android {
...
lint {
isCheckDependencies = true
}
}משימות Lint יכולות עכשיו להיות עדכניות (UP-TO-DATE)
אם המקורות והמשאבים של מודול לא השתנו, אין צורך להריץ שוב את משימת ניתוח ה-lint של המודול. במצב כזה, ביצוע המשימה מופיע כ-UP-TO-DATE בפלט של Gradle. בעקבות השינוי הזה, כשמריצים את lint במודול של אפליקציה עם checkDependencies = true, רק מודולים שהשתנו יצטרכו להריץ את הניתוח שלהם. כתוצאה מכך, Lint יכול לפעול מהר יותר.
גם את המשימה של דוח Lint לא צריך להריץ אם הקלט שלה לא השתנה. בעיה ידועה שקשורה לכך היא שאין פלט טקסט של lint שמודפס ל-stdout כשמשימת ה-lint היא UP-TO-DATE (בעיה מספר 191897708).
הפעלת lint במודולים של תכונות דינמיות
AGP כבר לא תומך בהפעלת lint ממודולים של תכונות דינמיות.
הפעלת lint ממודול האפליקציה המתאים תפעיל את lint במודולים של התכונות הדינמיות שלו, ותכלול את כל הבעיות בדוח ה-lint של האפליקציה. בעיה מוכרת שקשורה לכך היא שכאשר מריצים את lint עם checkDependencies = true ממודול של אפליקציה, יחסי התלות של ספריית התכונות הדינמיות לא נבדקים, אלא אם הם גם יחסי תלות של האפליקציה (בעיה מספר 191977888).
הרצת lint על וריאנט ברירת המחדל בלבד
עכשיו, כשמריצים את ./gradlew :app:lint, הפקודה lint פועלת רק על וריאנט ברירת המחדל. בגרסאות קודמות של AGP, הוא היה מריץ את lint לכל הווריאציות.
אזהרות על כיתות חסרות בכלי לכיווץ R8
R8 מטפל בצורה מדויקת ועקבית יותר במחלקות חסרות ובאפשרות -dontwarn.
לכן, כדאי להתחיל לבדוק את האזהרות על מחלקות חסרות שמוצגות על ידי R8.
כש-R8 נתקל בהפניה למחלקה שלא מוגדרת באפליקציה או באחד מהרכיבים שהיא תלויה בהם, הוא פולט אזהרה שמופיעה בפלט ה-build. לדוגמה:
R8: Missing class: java.lang.instrument.ClassFileTransformerהאזהרה הזו מציינת שלא נמצאה הגדרת המחלקה java.lang.instrument.ClassFileTransformer במהלך ניתוח הקוד של האפליקציה. בדרך כלל זה אומר שיש שגיאה, אבל יכול להיות שתרצו להתעלם מהאזהרה הזו. שתי סיבות נפוצות להתעלמות מהאזהרה:
-
ספריות שמטרגטות את ה-JVM והמחלקה החסרה הן מסוג ספריית JVM (כמו בדוגמה שלמעלה).
-
אחד מהרכיבים שהאפליקציה תלויה בהם משתמש ב-API לזמן הידור בלבד.
כדי להתעלם מאזהרה על מחלקה חסרה, אפשר להוסיף כלל -dontwarn לקובץ proguard-rules.pro. לדוגמה:
-dontwarn java.lang.instrument.ClassFileTransformerכדי להקל עליכם, AGP ייצור קובץ שמכיל את כל הכללים שעלולים להיות חסרים, ויכתוב אותם בנתיב כמו:
app/build/outputs/mapping/release/missing_rules.txt. מוסיפים את הכללים לקובץ proguard-rules.pro כדי להתעלם מהאזהרות.
ב-AGP 7.0, הודעות על מחלקות חסרות יופיעו כאזהרות, ואפשר להפוך אותן לשגיאות על ידי הגדרת android.r8.failOnMissingClasses = true ב-gradle.properties. ב-AGP 8.0, האזהרות האלה יהפכו לשגיאות שיגרמו לכשל ב-build. אפשר לשמור על ההתנהגות של AGP 7.0 על ידי הוספת האפשרות -ignorewarnings לקובץ proguard-rules.pro, אבל זה לא מומלץ.
הוסר מטמון ה-build של הפלאגין של Android Gradle
מטמון ה-build של AGP הוסר ב-AGP 4.1. מטמון ה-build של AGP הוצג בעבר ב-AGP 2.3 כדי להשלים את מטמון ה-build של Gradle, והוחלף לחלוטין על ידי מטמון ה-build של Gradle ב-AGP 4.1. השינוי הזה לא משפיע על זמן ה-build.
ב-AGP 7.0, המאפיין android.enableBuildCache, המאפיין android.buildCacheDir והמשימה cleanBuildCache הוסרו.
שימוש בקוד מקור של Java 11 בפרויקט
עכשיו אפשר לקמפל קוד מקור עד Java 11 בפרויקט של האפליקציה, וכך להשתמש בתכונות חדשות יותר של השפה, כמו שיטות של ממשק פרטי, אופרטור היהלום למחלקות אנונימיות ותחביר של משתנים מקומיים לפרמטרים של למבדה.
כדי להפעיל את התכונה הזו, מגדירים את compileOptions לגרסת Java הרצויה ואת compileSdkVersion ל-30 ומעלה:
// build.gradle
android {
compileSdkVersion 30
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "11"
}
}// build.gradle.kts
android {
compileSdkVersion(30)
compileOptions {
sourceCompatibility(JavaVersion.VERSION_11)
targetCompatibility(JavaVersion.VERSION_11)
}
kotlinOptions {
jvmTarget = "11"
}
}הגדרות התלות הוסרו
ב-AGP 7.0, ההגדרות הבאות (או היקפי התלות) הוסרו:
-
compile
בהתאם לתרחיש לדוגמה, הוא הוחלף ב-apiאו ב-implementation.
הכלל חל גם על וריאציות של *Compile, לדוגמה:debugCompile. -
provided
הוחלף על ידיcompileOnly.
הכלל הזה חל גם על וריאציות של *Provided, לדוגמה:releaseProvided. -
apk
הוחלף על ידיruntimeOnly. -
publish
הוחלף על ידיruntimeOnly.
ברוב המקרים, מסייע השדרוג של AGP יעביר את הפרויקט באופן אוטומטי להגדרות האישיות החדשות.
שינוי ב-classpath כשמבצעים קומפילציה מול הפלאגין של Android Gradle
אם אתם מבצעים קומפילציה מול הפלאגין של Android Gradle, יכול להיות ש-classpath של הקומפילציה ישתנה. מכיוון ש-AGP משתמש עכשיו בהגדרות api/implementation באופן פנימי, יכול להיות שחלק מהפריטים יוסרו מנתיב ה-classpath של ה-compile. אם אתם מסתמכים על תלות של AGP בזמן הקימפול, הקפידו להוסיף אותה כתלות מפורשת.
אי אפשר להוסיף ספריות JNI לתיקיית משאבים של Java
בעבר, אפשר היה להוסיף ספריית JNI בתיקיית משאבים של Java, ולרשום את התיקייה באמצעות android.sourceSets.main.resources.srcDirs
כדי שספריית ה-JNI תחולץ ותתווסף ל-APK הסופי. החל מ-AGP 7.0, אין תמיכה בזה והמערכת מתעלמת מספריות JNI בתיקיית משאבים של Java. במקום זאת, צריך להשתמש ב-method של DSL שמיועדת לספריות JNI, android.sourceSets.main.jniLibs.srcDirs. מידע נוסף זמין במאמר איך מגדירים קבוצות מקורות.
בעיות מוכרות
בקטע הזה מתוארות בעיות מוכרות שקיימות בפלאגין של Android Gradle בגרסה 7.0.0.
חוסר תאימות לפלאגין Kotlin Multiplatform בגרסה 1.4.x
Android Gradle Plugin 7.0.0 תואם לפלאגין Kotlin Multiplatform בגרסה 1.5.0 ואילך. בפרויקטים שמשתמשים בתמיכה של Kotlin Multiplatform, צריך לעדכן ל-Kotlin 1.5.0 כדי להשתמש בפלאגין של Android Gradle בגרסה 7.0.0. כפתרון עקיף, אפשר לשדרג לאחור את הפלאגין של Android Gradle לגרסה 4.2.x, אבל זה לא מומלץ.
מידע נוסף זמין במאמר KT-43944.
חסר פלט של lint
לא מודפס פלט טקסט של lint ל-stdout כשמשימת ה-lint מעודכנת (בעיה מספר 191897708). למידע נוסף, ראו שינויים בהתנהגות של lint. הבעיה הזו תתוקן בפלאגין של Android Gradle בגרסה 7.1.
לא כל התלויות של ספריית התכונות הדינמיות נבדקות באמצעות lint
כשמריצים את lint עם checkDependencies = true ממודול של אפליקציה, לא נבדקות תלויות של ספריית תכונות דינמיות, אלא אם הן גם תלויות של האפליקציה (בעיה מספר 191977888).
כדי לעקוף את הבעיה, אפשר להריץ את משימת ה-lint בספריות האלה. למידע נוסף, קראו את המאמר שינויים בהתנהגות של lint.