Android Gradle Plugin 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 כדי ליצור את האפליקציה, עכשיו נדרשת גרסה 11 של JDK כדי להריץ את 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

הגרסה החדשה של Variant 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. הפקודה הזו תנתח את כל המודולים של יחסי התלות במקביל ותייצר דוח אחד שכולל בעיות מהאפליקציה ומכל יחסי התלות שלה.

Groovy

// build.gradle
android {
  ...
  lintOptions {
    checkDependencies true
  }
}

Kotlin

// build.gradle.kts
android {
  ...
  lint {
    isCheckDependencies = true
  }
}

מעכשיו אפשר להגדיר משימות Lint כ-UP-TO-DATE

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

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

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

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

הפעלת איתור שגיאות בקוד (lint) בגרסה שמוגדרת כברירת מחדל בלבד

הרצת ./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.

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

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

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

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