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

לאחרונה התחלתי במשימה להעביר את בסיס הקוד של Android ב- Kure ל- AndroidX. זה נראה כמו ההזדמנות המושלמת לנסות לתקן את מהירויות הבנייה של הפרויקט.

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

כדי לתת לך הצצה לזמן שהצלחתי להשיל מהבניינים הנקיים שלנו, הנה מדד לפני ואחרי מסריקת הבנייה.

יורד מ 5.5 דקות ל 17 שניות ?? זה בונקרים.

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

אבל קודם!

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

./gradlew assembleDebug --scan

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

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

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

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

אנו יכולים למצוא כמה תיקונים קלים למהירות הבנייה שלנו בסעיף זה. אז בואו ונממש את ההצעות האלה בפרויקט שלנו.

שלב 1: עדכן את הכלים שלך

צוות אנדרואיד משפר ומתפתח כל הזמן את מערכת הבנייה של אנדרואיד. כך שלרוב אתה יכול לקבל שיפורים משמעותיים רק על ידי אימוץ הגרסה האחרונה של הכלים.

בזמן הפקטור הזה, הפרויקט שלנו היה בגרסה 3.2.1 של תוסף Gradle עבור Android Studio (שהוא כמה גרסאות ישנות יותר מהמהדורה האחרונה).

אתה יכול לבקר בקישור זה כדי לקבל את הגרסה למהדורה האחרונה של תוסף Gradle.

בזמן כתיבת פוסט זה הגרסה האחרונה במקרה גרסה 3.4.0.

אבל זה בא עם gotcha שאנחנו צריכים לזכור מאוחר יותר:

בעת שימוש ב- Gradle 5.0 ומעלה נצטרך להגדיל במפורש את גודל הערימה כדי להבטיח שמהירות הבנייה שלנו לא תחמיר. נחזור לזה תוך דקה בלבד.

פתח את הקובץ build.gradle ברמה העליונה שתמצא בשורש הפרויקט שלך והוסף את השורה הבאה בסעיף התלות:

classpath 'com.android.tools.build:gradle:3.4.0'

יהיה עליך לעדכן את כתובת ה- URL להפצה בקובץ מאפייני העטיפה הדרגתית הממוקם בכתובת gradle / wrapper / gradle-wrapper.properties. עדכן את כתובת האתר הבאה.

(קישור זה יהיה זמין בדף הפצת התוספים של Android Gradle.)

distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

אם אתה משתמש ב- Kotlin בפרויקט שלך, תיתקל בשגיאה אם ​​גרסת התוסף Kotlin Gradle שלך ​​נמוכה מ- 1.3.0 . אם זה המקרה, השתמש בהנחיה של IDE כדי לעדכן את התוסף Kotlin Gradle לגרסה העדכנית ביותר (שבזמן כתיבת פוסט זה במקרה גרסה 1.3.31 ).

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

שלב 2: עדכן את התצורות שלך

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

אוסף מצטבר בעצם מונע אוסף בזבזני של כל קבצי המקור ובמקום זה אוסף רק את הקבצים שהשתנו. כשמסתכלים על היומנים, ברור שאנחנו לא מנצלים את התכונה הזו. זה מציע לנו להשתמש ב- android.enableSeparateAnnotationProcessing = נכון, אך מכיוון שאנחנו משתמשים בקוטלין בפרויקטים שלנו, אנחנו לא צריכים להשתמש בתצורת 'annotationProcessor' בכל מקרה.

למרבה המזל, גרסת Kotlin 1.3.30 הוסיפה את התמיכה בעיבוד הערות מצטבר.

אז בואו

  1. שנה את תצורת מעבד ההערה ל- kapt
  2. אפשר דגל ניסיוני לעיבוד הערות מצטבר

פתח את הקובץ build.gradle ברמת המודול והוסף את השורה הבאה לראש הקובץ:

apply plugin: 'kotlin-kapt'

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

//Before annotationProcessor 'com.google.dagger:dagger-compiler:2.9' //After kapt 'com.google.dagger:dagger-compiler:2.9'

כעת פתח את קובץ ה- gradle.properties שנמצא בשורש הפרויקט שלך והוסף את השורה הבאה:

kapt.incremental.apt=true

בואו ננהל את ה- build שוב. ??????

בסדר, נראה שאנחנו מגיעים לשם.

שלב 3: מאפייני Gradle

אנחנו בשלב האחרון עכשיו. זוכר את ה- gotcha שנתקלנו בו בעת עדכון גרסת התוסף שלנו Gradle? מסתבר שהגרסאות החדשות יותר של Gradle מקטינות את גודל הערמה ל -512 MB. זה כדי לוודא שמכונות בקצה התחתון לא נחנקות. אני על מכונה של 16 ג'יגה אז אני יכול להרשות לעצמי לתת סביב 2-3 הופעות לדמון הגרדל, אבל הקילומטראז 'שלך עשוי להשתנות.

Open the gradle.properties file located at the root of your project and add the following line. Remember to select the size according to your requirements and machine specification.

org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

While we’re at it, let’s also enable parallel builds and configure on demand in the properties.

Here’s what my final gradle.properties file looks like:

org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.configureondemand=true kapt.incremental.apt=true
  • org.gradle.parallel - This flag allows Gradle to build modules within a project in parallel instead of sequentially. This is only beneficial in a multi-module project.
  • org.gradle.configureondemand - This flag configures only the modules needed by the project, instead of building all of them.

With these, let’s see where we are on our build speed metric:

And there we go. ???

Closing remarks

This is by no means an extensive coverage of all the ways one can optimize the build speed of their project. There are tons of other things which I did not go over in this post like using minSdk 21 when using MultiDex, pre-dexing your libraries, disabling PNG crunching, and so on — to name a few.

But most of these configurations require a deeper understanding of Android’s build system and experience working on large multi-module projects (which is where the benefits are most apparent). The steps I mentioned above are easy to incorporate in a project even by junior devs and have considerable payoffs. I hope this helps you trim down your build speeds!

Alright until next time, peace! ✌?