‫Android Gradle Plugin 7.0.0 (יולי 2021)

‫Android Gradle plugin 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.

נדרשת גרסת 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 ומנהל ה-AVD בחבילת SDK Tools שהוצאה משימוש לא פועלים עם JDK 11. כדי להמשיך להשתמש ב-SDK Manager וב-AVD Manager עם AGP 7.0 ואילך, צריך לעבור לגרסאות החדשות של הכלים בחבילת Android SDK Command-Line Tools הנוכחית.

גרסת API יציבה

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

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

שינויים בהתנהגות של Lint

בקטע הזה מתוארים כמה שינויים בהתנהגות של Lint ב-Android Gradle plugin 7.0.0.

שיפור של lint לתלות של הפרויקט בספרייה

הפעלת 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

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

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

הרצת lint במודולים של פיצ'רים דינמיים

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

הפעלת lint רק בווריאנט ברירת המחדל

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

אזהרות לגבי מחלקה חסרה בכלי R8 לכיווץ קוד

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

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

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, האזהרות האלה יהפכו לשגיאות שיגרמו לבעיות בבנייה. אפשר לשמור על ההתנהגות של 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. השינוי הזה לא משפיע על זמן הבנייה.

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

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

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

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

אין תמיכה בהוספה של ספריות מקוריות לתיקיית משאבי Java

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

בעיות מוכרות

בקטע הזה מתוארות בעיות מוכרות שקיימות ב-Android Gradle Plugin גרסה 7.0.0.

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

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

מידע נוסף זמין במאמר KT-43944.

פלט ה-lint חסר

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

לא כל התלויות בספרייה של תכונות דינמיות נבדקות על ידי Lint

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