‫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 שניות

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

אם לא חוויתם את שיפורי הביצועים שמתוארים למעלה, אפשר לדווח על באג ולצרף עקבות של הבנייה באמצעות Gradle Profiler.

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

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

3.0.1 (נובמבר 2017)

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

אופטימיזציות

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

תכונות חדשות

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

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

    מגניב

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

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

    מגניב

            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 בנתיב המחלקה לגבי המפתחות הבאים:

    • 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 ומעלה.
  • עכשיו אפשר לשנות את ספריית הפלט של פרויקט חיצוני לבנייה מקומית, כמו שמוצג בהמשך:

    מגניב

            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 שמגדיר כללי lint מותאמים אישית, ולצרף אותו לפרויקטים של AAR ו-APK.

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

    מגניב

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

    מגניב

          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.
  • עכשיו צריך להוסיף מעבדי הערות לנתיב המחלקה של המעבד באמצעות הגדרת התלות annotationProcessor.
  • השימוש ב-ndkCompile שהוצא משימוש מוגבל יותר עכשיו. במקום זאת, צריך לעבור לשימוש ב-CMake או ב-ndk-build כדי לקמפל קוד מקומי שרוצים לארוז ב-APK. מידע נוסף זמין במאמר בנושא מעבר מ-ndkcompile.