‫פלאגין של Android Gradle 3.0.0 (אוקטובר 2017)

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

לדוגמה, בפרויקט sample skeleton עם כ-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 באמצעות 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 שמוטמעת בשרשרת הכלים שמוגדרת כברירת מחדל. מידע נוסף זמין במאמר בנושא שימוש בתכונות של שפת 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:

    מגניב

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