Android Gradle Plugin 3.0.0 (אוקטובר 2017)

פלאגין Android Gradle מגרסה 3.0.0 כולל מגוון שינויים שמטרתם לטפל בבעיות ביצועים בפרויקטים גדולים.

לדוגמה, בפרויקט שלד לדוגמה עם כ-130 מודולים ומספר גדול של יחסי תלות חיצוניים (אבל ללא קוד או משאבים), אפשר לראות שיפורים בביצועים בדומה לנתונים הבאים:

גרסת הפלאגין של Android + גרסת Gradle פלאגין Android 2.2.0 + Gradle 2.14.1 פלאגין Android 2.3.0 + Gradle 3.3 פלאגין Android 3.0.0 + Gradle 4.1
הגדרה (למשל, הפעלת ./gradlew --help) כ-2 דקות כ-9 שניות בערך 2.5 שניות
שינוי ב-Java בשורה אחת (שינוי בהטמעה) כ-2 דקות ו-15 שניות כ-29 שניות כ-6.4 שניות

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

אם לא ראיתם את שיפורי הביצועים שמפורטים למעלה, תוכלו לשלוח באג ולצרף נתיב של ה-build באמצעות Gradle Profiler.

כדי להשתמש בגרסה הזו של הפלאגין ל-Android, נדרשים:

גרסת מינימום גרסת ברירת המחדל הערות
Gradle 4.1 4.1 מידע נוסף זמין במאמר עדכון Gradle.
SDK Build Tools 26.0.2 26.0.2 מתקינים או מגדירים את SDK Build Tools. בעקבות העדכון הזה, כבר לא צריך לציין גרסה לכלים ל-build – הפלאגין משתמש בגרסה המינימלית הנדרשת כברירת מחדל. עכשיו אפשר להסיר את הנכס android.buildToolsVersion.

3.0.1 (נובמבר 2017)

זהו עדכון קטן לתמיכה ב-Android Studio 3.0.1, שכולל תיקוני באגים כלליים ושיפורי ביצועים.

פעולות אופטימיזציה

  • תכונה שמאפשרת לבצע פעולות במקביל בפרויקטים עם כמה מודולים באמצעות תרשים משימות מפורט.
  • כשמבצעים שינויים ביחסי התלות, Gradle מבצע גרסאות build מהר יותר על ידי כך שלא מקמפל מחדש מודולים שאין להם גישה ל-API של יחסי התלות האלה. כדי להגביל את יחסי התלות שמאפשרים דליפת ממשקי API למודול אחר, צריך להשתמש בהגדרות החדשות של יחסי התלות ב-Gradle: implementation, ‏ api,‏ compileOnly ו-runtimeOnly.
  • מהירות פיתוח מצטבר מהירה יותר עקב דיקסון לכל כיתה. עכשיו כל כיתה מתומללת לקובצי DEX נפרדים, ורק הכיתות ששונו עוברות שוב תהליך DEX. בנוסף, מהירות ה-build צפויה להשתפר באפליקציות שהגדרת minSdkVersion שלהן היא 20 או פחות, והן משתמשות ב-multi-dex מדור קודם.
  • שיפור מהירויות ה-build על ידי אופטימיזציה של משימות מסוימות לשימוש בפלט שנשמר במטמון. כדי ליהנות מהאופטימיזציה הזו, קודם צריך להפעיל את המטמון של ה-build ב-Gradle.
  • עיבוד משאבים מצטבר משופר באמצעות AAPT2, שמופעל עכשיו כברירת מחדל. אם נתקלת בבעיות בזמן השימוש ב-AAPT2, אפשר לדווח על באג. אפשר גם להשבית את AAPT2 על ידי הגדרת android.enableAapt2=false בקובץ gradle.properties והפעלה מחדש של הדימון של Gradle באמצעות הפקודה ./gradlew --stop בשורת הפקודה.

תכונות חדשות

  • ניהול יחסי תלות שמתחשב בגרסת הווריאנט. כשמפתחים וריאנט מסוים של מודול, הפלאגין מתאים עכשיו באופן אוטומטי בין וריאציות של יחסי התלות של מודולים בספריות מקומיות לבין הווריאנט של המודול שאתם מפתחים.
  • כולל פלאגין חדש של מודול תכונות לתמיכה ב-Android Instant Apps וב-Android Instant Apps SDK (אפשר להוריד אותו באמצעות מנהל ה-SDK). למידע נוסף על יצירת מודולים של תכונות באמצעות הפלאגין החדש, קראו את המאמר המבנה של אפליקציה מיידית עם כמה תכונות.
  • תמיכה מובנית בשימוש בתכונות מסוימות של שפת Java 8 ובספריות של Java 8. Jack הוצא משימוש ועכשיו הוא לא נדרש, ולכן צריך להשבית את Jack כדי להשתמש בתמיכה המשופרת ב-Java 8 שמובנית בכלי הפיתוח שמוגדרים כברירת מחדל. למידע נוסף, ראו שימוש בתכונות השפה של Java 8.
  • הוספנו תמיכה בהרצת בדיקות באמצעות Android Test Orchestrator, שמאפשרת להריץ כל בדיקה של האפליקציה בתוך קריאה משלה ל-Instrumentation. מכיוון שכל בדיקה פועלת במכונה משלה של Instrumentation, כל מצב משותף בין בדיקות לא מצטבר במעבד או בזיכרון של המכשיר. בנוסף, גם אם ניסוי אחד קורס, הוא גורם לקריסה רק של המכונה שלו ב-Instrumentation, כך שהבדיקות האחרות עדיין פועלות.

    • הוספנו את testOptions.execution כדי לקבוע אם להשתמש בתזמור בדיקות במכשיר. אם רוצים להשתמש ב-Android Test Orchestrator, צריך לציין את הערך ANDROID_TEST_ORCHESTRATOR, כפי שמתואר בהמשך. כברירת מחדל, הנכס הזה מוגדר ל-HOST, שמשבית את התזמור במכשיר והוא השיטה הרגילה להרצת בדיקות.

    Groovy

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • הגדרת התלות החדשה androidTestUtil מאפשרת להתקין קובץ APK נוסף של כלי עזר לבדיקות לפני שמריצים את בדיקות המדידה, כמו Android Test Orchestrator:

    Groovy

            dependencies {
              androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
              ...
            }
            

    Kotlin

            dependencies {
              androidTestUtil("com.android.support.test:orchestrator:1.0.0")
              ...
            }
            
  • הוספנו את testOptions.unitTests.includeAndroidResources כדי לתמוך בבדיקות יחידה שדורשות משאבי Android, כמו Roboelectric. כשמגדירים את המאפיין הזה לערך true, הפלאגין מבצע מיזוג של משאבים, נכסים ומניפסטים לפני שמריצים את בדיקות היחידה. לאחר מכן, הבדיקות יכולות לבדוק את com/android/tools/test_config.properties ב-classpath עבור המפתחות הבאים:

    • android_merged_assets: הנתיב המוחלט לספרייה של הנכסים הממוזגים.

      הערה: במודולים של ספריות, הנכסים הממוזגים לא מכילים את הנכסים של יחסי התלות (ראו בעיה מס' 65550419).

    • android_merged_manifest: הנתיב המוחלט לקובץ המניפסט הממוזג.

    • android_merged_resources: הנתיב המוחלט לספריית המשאבים הממוזגת, שמכילה את כל המשאבים מהמודול ואת כל יחסי התלות שלו.

    • android_custom_package: שם החבילה של המחלקה הסופית של R. אם משנים באופן דינמי את מזהה האפליקציה, יכול להיות ששם החבילה הזה לא יתאים למאפיין package במניפסט של האפליקציה.

  • תמיכה בגופנים בתור משאבים (זוהי תכונה חדשה שנוספה ב-Android 8.0 (רמת API 26)).
  • תמיכה בחבילות APK ספציפיות לשפה עם Android Instant Apps SDK 1.1 ואילך.
  • עכשיו אפשר לשנות את ספריית הפלט של הפרויקט החיצוני ל-build מקורי, כפי שמתואר בהמשך:

    Groovy

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory "./outputs/cmake"
                    }
                }
            }
            

    Kotlin

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory = "./outputs/cmake"
                    }
                }
            }
            
  • עכשיו אפשר להשתמש ב-CMake 3.7 ואילך כשמפתחים פרויקטים מקומיים מ-Android Studio.
  • הגדרת התלות החדשה lintChecks מאפשרת ליצור קובץ JAR שמגדיר כללי איתור שגיאות מותאמים אישית, ולארז אותו בפרויקטים של AAR ו-APK.

    כללי ה-lint המותאמים אישית צריכים להיות שייכים לפרויקט נפרד שמפיק קובץ JAR יחיד וכולל רק יחסי תלות של compileOnly. לאחר מכן, מודולים אחרים של אפליקציות וספריות יכולים להסתמך על הפרויקט שלכם לזיהוי שגיאות באמצעות ההגדרה של lintChecks:

    Groovy

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks project(':lint-checks')
            }
            

    Kotlin

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks(project(":lint-checks"))
            }
            

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

  • הפלאגין של Android בגרסה 3.0.0 מסיר ממשקי API מסוימים, וה-build יתקלקל אם תשתמשו בהם. לדוגמה, אי אפשר יותר להשתמש ב-Variants API כדי לגשת לאובייקטים מסוג outputFile() או להשתמש ב-processManifest.manifestOutputFile() כדי לקבל את קובץ המניפסט של כל וריאנט. מידע נוסף זמין במאמר שינויים ב-API.
  • לא צריך יותר לציין גרסה לכלים ל-build (כך שאפשר עכשיו להסיר את נכס android.buildToolsVersion). כברירת מחדל, הפלאגין משתמש באופן אוטומטי בגרסה המינימלית הנדרשת של כלי ה-build לגרסה של הפלאגין ל-Android שבה אתם משתמשים.
  • עכשיו אפשר להפעיל או להשבית את דחיסת ה-PNG בבלוק buildTypes, כפי שמתואר בהמשך. דחיסת PNG מופעלת כברירת מחדל בכל גרסאות ה-build, מלבד גרסאות build לצורך ניפוי באגים, כי היא מאריכה את זמני ה-build בפרויקטים שכוללים הרבה קובצי PNG. לכן, כדי לשפר את זמני ה-build לסוגים אחרים של build, צריך להשבית את דחיסת ה-PNG או להמיר את התמונות ל-WebP.

    Groovy

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                crunchPngs false
              }
            }
          }
          

    Kotlin

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                isCrunchPngs = false
              }
            }
          }
          
  • הפלאגין של Android יוצר עכשיו באופן אוטומטי יעדי הפעלה שמוגדרים בפרויקטים החיצוניים של CMake.
  • עכשיו צריך להוסיף מעבדי אנוטציות לנתיב ה-class של המעבד באמצעות הגדרת התלות annotationProcessor.
  • השימוש ב-ndkCompile שהוצא משימוש מוגבל עכשיו יותר. במקום זאת, מומלץ לעבור לשימוש ב-CMake או ב-ndk-build כדי לקמפל קוד מקומי שרוצים לארוז ב-APK. מידע נוסף זמין במאמר מעבר מ-ndkcompile.