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

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

7.0.1 (אוגוסט 2021)

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

תאימות

גרסת המינימום גרסת ברירת המחדל
גרדל 7.0.2 7.0.2
כלים לבניית SDK 30.0.2 30.0.2
NDK לא רלוונטי 21.4.7075529
JDK 11 11

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 חבילה.

יציבות ב-API של וריאנט

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

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

שינויים בהתנהגות של איתור שגיאות בקוד (lint)

בקטע הזה מתוארים כמה שינויים בהתנהגות של Linux ב-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
  }
}

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

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

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

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

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

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

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

חסרות אזהרות מחלקה ב-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. הושק בעבר ב-AGP 2.3 כדי להשלים את מטמון ה-build של Gradle, מטמון ה-build של AGP הוחלף לגמרי באמצעות מטמון ה-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 השדרוג של Assistant יעביר באופן אוטומטי את הפרויקט הגדרות אישיות.

שינוי נתיב במהלך הידור (compiling) ל-Android פלאגין של Gradle

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

הוספה של ספריות מקוריות במשאבי 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 תואם קוטלין פלאגין מרובה פלטפורמות 1.5.0 ואילך. פרויקטים שמשתמשים ב-Kotlin כדי להשתמש ב-Android Gradle, צריך לעדכן את התמיכה במגוון פלטפורמות ל-Kotlin 1.5.0 פלאגין 7.0.0. כדי לעקוף את הבעיה, אפשר לשדרג לאחור את הפלאגין של Android Gradle ל- 4.2.x, למרות שזה לא מומלץ.

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

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

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

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

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