פלאגין Android Gradle 7.0.0 (יולי 2021)

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

7.0.1 (אוגוסט 2021)

העדכון המשני הזה כולל תיקוני באגים שונים. כדי לראות רשימה של תיקוני באגים בולטים, אפשר לקרוא את הפוסט הרלוונטי ב בלוג Release Updates.

תאימות

גרסת מינימום גרסת ברירת מחדל הערות
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.

JDK 11 נדרש כדי להריץ AGP 7.0

כשמשתמשים בפלאגין של 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 Command-Line Tools הנוכחית.

גרסה יציבה של Variant API

הגרסה החדשה של וריאנט API היא יציבה עכשיו. הממשקים החדשים מופיעים בחבילה com.android.build.api.variant, ודוגמאות מופיעות בפרויקט gradle-recipes ב-GitHub. במסגרת Variant API החדש, הוספנו מספר קבצים ביניים שנקראים ארטיפקטים, דרך הממשק Artifacts. אפשר לקבל את הארטיפקטים האלה, כמו המניפסט הממוזג, ולהתאים אותם אישית בבטחה באמצעות קוד ופלאגינים של צד שלישי.

נמשיך להרחיב את Variant API על ידי הוספת פונקציות חדשות והגדלת מספר הארטיפקטים הביניים שאנחנו מציעים להתאמה אישית.

שינויים בהתנהגות של 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

אם המקורות והמשאבים של מודול לא השתנו, אין צורך להריץ שוב את המשימה של ניתוח הקוד. במקרה כזה, ביצוע המשימה יופיע בפלט של Gradle בתור 'UP-TO-DATE'. בעקבות השינוי הזה, כשמריצים איתור שגיאות בקוד במודול של אפליקציה באמצעות checkDependencies = true, רק המודולים ששונו יצטרכו להריץ את הניתוח שלהם. לכן, Linux יכול לפעול מהר יותר.

כמו כן, אין צורך להריץ את משימת הדוח Linux אם הקלט שלה לא השתנה. בעיה קשורה ידועה היא שאין פלט טקסט של איתור שגיאות בקוד שמודפס ב-stdout כשמשימה של איתור שגיאות בקוד היא UP-TO-DATE (בעיה מס' 191897708).

הפעלת איתור שגיאות בקוד במודולים של פיצ'רים דינמיים

AGP לא תומך יותר בהרצת איתור שגיאות בקוד (lint) ממודולים של תכונות דינמיות. הפעלת איתור שגיאות בקוד ממודול האפליקציה התואם תפעיל איתור שגיאות בקוד במודולים של התכונות הדינמיות שלו ותכלול את כל הבעיות בדוח איתור השגיאות בקוד של האפליקציה. בעיה קשורה ידועה: כשמריצים איתור שגיאות בקוד (lint) באמצעות checkDependencies = true מתוך מודול של אפליקציה, לא מתבצעת בדיקה של יחסי התלות בספריות של תכונות דינמיות, אלא אם הן גם יחסי תלות של האפליקציה (בעיה מס' 191977888).

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

הרצת הפקודה ./gradlew :app:lint תריץ עכשיו איתור שגיאות בקוד רק לווריאנט שמוגדר כברירת מחדל. בגרסאות קודמות של AGP, המערכת הפעילה את ה-lint לכל הווריאציות.

חסרות אזהרות מחלקה ב-R8 shrinker

R8 מטפל באופן מדויק ועקבי יותר במחלקות חסרות ובאפשרות -dontwarn. לכן, כדאי להתחיל לבדוק את האזהרות החסרות של הכיתה שהופקו על ידי R8.

כש-R8 נתקל בהפניה לכיתה שלא מוגדרת באפליקציה או באחת מהתלות שלה, הוא ינפיק אזהרה שתופיע בפלט של ה-build. לדוגמה:

R8: Missing class: java.lang.instrument.ClassFileTransformer

האזהרה הזו מופיעה אם לא נמצאה הגדרת הכיתה java.lang.instrument.ClassFileTransformer במהלך ניתוח הקוד של האפליקציה. למרות שבדרך כלל המשמעות היא שיש שגיאה, יש אפשרות להתעלם מהאזהרה הזו. שתי סיבות נפוצות להתעלמות מהאזהרה הן:

  1. ספריות שמטרגטות את JVM ואת הכיתה החסרה הן מסוג ספריית JVM (כמו בדוגמה שלמעלה).

  2. אחד מיחסי התלות משתמש ב-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 בפרויקט של האפליקציה, וכך להשתמש בתכונות חדשות יותר של השפה, כמו שיטות ממשק פרטיות, אופרטור משולש למחלקות אנונימיות ותחביר של משתנה מקומי לפרמטרים של פונקציית lambda.

כדי להפעיל את התכונה הזו, מגדירים את 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.
    האפשרות הזו רלוונטית גם לווריאציות *שסופקו, לדוגמה: releaseProvided.
  • apk
    הערך הזה הוחלפה ב-runtimeOnly.
  • publish
    הקוד הזה הוחלף ב-runtimeOnly.

ברוב המקרים, AGP Upgrade Assistant יעביר את הפרויקט להגדרות החדשות באופן אוטומטי.

שינוי נתיב ה-Classpath בזמן הידור מול פלאגין Android Gradle

אם אתם מבצעים הידור באמצעות הפלאגין של Android Gradle, ייתכן שנתיב ה-classpath של הידור ישתנה. מכיוון ש-AGP משתמש עכשיו בהגדרות api/implementation באופן פנימי, יכול להיות שחלק מהארכיטקטורות יוסרו מנתיב ה-classpath שלכם. אם אתם תלויים בתלות של AGP בזמן הידור, הקפידו להוסיף אותה כתלות מפורשת.

אי אפשר להוסיף ספריות מקוריות בתיקיית משאבים של Java

בעבר, אפשר היה להוסיף ספרייה מקומית בתיקיית משאבים של Java, ולרשום את התיקייה באמצעות android.sourceSets.main.resources.srcDirs כדי שהספרייה המקומית תוחזר ותתווסף לחבילת ה-APK הסופית. החל מ-AGP 7.0, האפשרות הזו לא נתמכת והמערכת מתעלמת מספריות מקוריות בתיקיית משאבים של Java. במקום זאת, צריך להשתמש בשיטת ה-DSL שמיועדת לספריות נייטיב, android.sourceSets.main.jniLibs.srcDirs. למידע נוסף, ראו איך מגדירים קבוצות מקורות.

בעיות מוכרות

בקטע הזה מתוארות בעיות ידועות בפלאגין של Android Gradle בגרסה 7.0.0.

חוסר תאימות לפלאגין Kotlin Multiplatform של 1.4.x

Android Gradle Plugin 7.0.0 תואם ל-Kotlin Multiplatform Plugin בגרסה 1.5.0 ואילך. בפרויקטים שמשתמשים בתמיכה של Kotlin למספר פלטפורמות צריך לעדכן ל-Kotlin 1.5.0 כדי להשתמש ב-Android Gradle Plugin 7.0.0. כפתרון זמני, אפשר לשדרג לאחור את הפלאגין של Android Gradle לגרסה 4.2.x, אבל לא מומלץ לעשות זאת.

למידע נוסף, ראו KT-43944.

חסר פלט של איתור שגיאות בקוד

כאשר משימת איתור השגיאות בקוד עדכנית (גיליון מס' 191897708), לא מודפס פלט טקסט של איתור שגיאות בקוד. לקבלת הקשר נוסף, אפשר לעיין במאמר שינויים בהתנהגות של איתור שגיאות בקוד. הבעיה הזו תיפתר בפלאגין של Android Gradle בגרסה 7.1.

לא כל יחסי התלות בספריות של תכונות דינמיות נבדקים באמצעות איתור שגיאות בקוד

כשמריצים איתור שגיאות בקוד עם checkDependencies = true מתוך מודול של אפליקציה, יחסי התלות בספריות של תכונות דינמיות לא נבדקים אלא אם הם גם יחסי תלות של האפליקציה (בעיה מס' 191977888). כדי לעקוף את הבעיה, אפשר להריץ את המשימה lint בספריות האלה. למידע נוסף, ראו שינויים בהתנהגות של איתור שגיאות בקוד.