Slide 1

Slide 1 text

Tips for faster development builds 2017/06/02 Shibuya.apk #15 @ctake0005

Slide 2

Slide 2 text

https://www.youtube.com/watch?v=7ll-rkLCtyk

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

About app’s project ● Single module ● 160 Java files ● 100 XML files, 700 PNGs ● Single-dex ● Use annotation processors ● APK size ~6MB

Slide 5

Slide 5 text

Specs of Build PC ● MacBook Pro (Early 2015) ● 2.9 GHz Intel Core i5 ● Memory : 16 GB ● 256 GB SSD

Slide 6

Slide 6 text

● Full build ○ clean, assembleDebug ● Incremental build - Java change ○ one line Java change ● Incremental build - resource change ○ add or remove string resource Benchmark: 3 build scenarios

Slide 7

Slide 7 text

Current Build Time (Android Gradle plugin 2.3.2)

Slide 8

Slide 8 text

buildscript { repositories { jcenter() maven { url 'https://maven.google.com' } } dependencies { classpath 'com.android.tools.build:gradle:3.0.0-alpha2' } } Tips 1: Use latest Android Gradle plugin

Slide 9

Slide 9 text

● Android Studio 3.0 is must ● 色々な Plugin が(現状)動かない。。。 ○ gradle-deploygate-plugin ○ dexcount-gradle-plugin ○ protobuf-gradle-plugin . . . 参考 )http://qiita.com/eaglesakura/items/133aa7130dea81c9fc1e http://qiita.com/tnj/items/5f5ce40d3ca2270d2082 https://github.com/google/protobuf-gradle-plugin/issues/129 Tips 1: Use latest Android Gradle plugin

Slide 10

Slide 10 text

Tips 1: Use latest Android Gradle plugin -10s -18s - 7s

Slide 11

Slide 11 text

Tips 2: Avoid legacy multidex ● Legacy multidex == Multidex + minSdkVersion < 21 ● Legacy multidex のビルドは遅い ● Android Studio 2.3 以上で [Run] する場合は、接続さ れている端末やエミュレータの API レベルが、 21 以上 であれば自動的に除かれる ● コマンドラインから実行した場合は除かれない  ※ 今回は multi-dex アプリではないので紹介のみ productFlavors { development { minSdkVersion 21 } }

Slide 12

Slide 12 text

Tips 3: Disable multi-APK ● splits{} で、 ABI や Density ごとに分けて APK サイズを小さくすることは とても重要! ● 開発中には不要なので コマンドラインオプションを設定して 実行しないようにする。 ext.splitEnabled = true android { if (project.hasProperty('devBuild')) { splitEnabled = false } splits { density { enable splitEnabled exclude "ldpi", "mdpi" } } }

Slide 13

Slide 13 text

Tips 3: Disable multi-APK ● コマンドライン ./gradlew :app:assembleDevelopmentDebug -PdevBuild ● Android Studio

Slide 14

Slide 14 text

Tips 3: Disable multi-APK - 9s - 5s -10s

Slide 15

Slide 15 text

Tips 4: Include minimal resources ● 多くの言語や画面サイズをサポートしていても、 開発中は使っている端末(エミュレータ)以外の リソースは無駄になる ● 必要なリソースだけを入れることで、無駄な時間 を削減する! ● ※この設定を入れて Sync すると下記のエラー が出る(けど、 build はできる) productFlavors { development { minSdkVersion 21 resConfigs("en", "xxhdpi") } }

Slide 16

Slide 16 text

Tips 4: Include minimal resources -10s - 5s - 1s

Slide 17

Slide 17 text

Tips 5: Disable png crunching ● デフォルトで PNG 画像サイズの最適化が有効になっているが、これも開発時には 不要なので、無効にする android { if (project.hasProperty('devBuild')) { splitEnabled = false aaptOptions.cruncherEnabled = false } }

Slide 18

Slide 18 text

Tips 5: Disable png crunching - 2s ± 0s - 1s

Slide 19

Slide 19 text

Tips 6: Use Instant Run ? - 9s + 3s *

Slide 20

Slide 20 text

Tips 7: Avoid inadvertent changes ● ビルドの度に Manifest の更新が行われるような設定は避ける ○ ex) versionCode をビルド毎にユニーク ID を振る def buildDateTime = new Date().format('yyMMddHHmm').toInteger() android { defaultConfig { versionCode buildDateTime } }

Slide 21

Slide 21 text

Tips 7: Avoid inadvertent changes

Slide 22

Slide 22 text

Tips 7: Avoid inadvertent changes ● Fixing versionCode updates def buildDateTime = project.hasProperty('devBuild') ? 100 : new Date().format('yyMMddHHmm').toInteger() android { defaultConfig { versionCode buildDateTime } }

Slide 23

Slide 23 text

● Crashlytics は デフォルトで、ビルド毎にユニークな Build ID を生成して res/value を更新している ● 下記の設定をすることで、 ID が無い時だけ生成するようになる ● debug ビルド時に Crashlitycs が無効で良いなら if you use Crashlytics by default android { buildType { debug { // Only use this flag on builds you don't proguard or upload to beta-by-crashlytics ext.alwaysUpdateBuildId = false . . . RANDOM_UUID ext.enableCrashlytics = false

Slide 24

Slide 24 text

Tips 8: Don’t use dynamic versions ● dependencies に [+] で、バージョン指定しない ○ 毎日、最新バージョンチェックが行われる ○ (意図しない変更が入ってしまう恐れがある) dependencies { compile ‘com.android.support:appcompat-v7:+’ . . . }

Slide 25

Slide 25 text

Tips 9: Watch the memory ● Android Studio は新規プロジェクト作成時に gradle に 1.5 GB のメモリを割り当てる ● 上記が適当か否かは、プロジェクト次第なので [gradle.properties] の jvmargs を最 適になるように調整する ● Gradle plugin 2.1 以降は、デフォルトで Dex-in-process が有効になっているので、 android.dexOptions.javaMaxHeapSize の指定は必要ない # Optimize this in gradle.properties org.gradle.jvmargs=-Xmx1536m

Slide 26

Slide 26 text

Tips 10: Enable Gradle Caching ● New from Gradle 3.5 ● Different from Android Studio 2.3 build cache ● Canary では不完全だが、バージョンが上がる毎にパフォーマンスが改善されていく はずなので、今から true に設定しておくことがオススメとのこと # Set this in gradle.properties org.gradle.caching=true

Slide 27

Slide 27 text

Tips 10: Enable Gradle Caching - 7s + 2s - 7s

Slide 28

Slide 28 text

Build tips summary 1. Use latest Android Gradle plugin 2. Avoid legacy multidex 3. Disable multi-APK 4. Include minimal resources 5. Disable png crunching 6. Use Instant Run 7. Avoid inadvertent changes 8. Don’t use dynamic versions 9. Watch the memory 10. Enable Gradle caching

Slide 29

Slide 29 text

But It’s still slow…

Slide 30

Slide 30 text

Tips Ex: multidex in debug ● Single-dex に収めるために debug ビルド時も proguard をかけている(難読化はして いない) その処理に時間がかかっている、、、

Slide 31

Slide 31 text

Tips Ex: multidex in debug ● 『 Tips 2: Avoid legacy multidex 』にプラスして debug Build 時のみ multidex にすれば早くなるのでは? buildTypes { release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { // Enabling multidex support. multiDexEnabled true } } productFlavors { production { } development { minSdkVersion 21 } }

Slide 32

Slide 32 text

Tips Ex: multidex in debug -30s -28s -31s

Slide 33

Slide 33 text

Cumulative improvement Full build Incremental build Java change Incremental build resorce change 82 s → 14 s 73 s → 10 s 63 s → 9 s 6x faster 7x faster 7x faster

Slide 34

Slide 34 text

(Extra) Build by AS 2.3.2 [exclude Tips 1 & Tips 10]

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

More Info ● Google I/O 2017 Session Movie ○ https://www.youtube.com/watch?v=7ll-rkLCtyk ● Optimize your build speed ○ https://developer.android.com/studio/build/optimize-your-build.html ● Migration Guide to Android Gradle plugin 3.0 ○ https://developer.android.com/studio/preview/features/new-android-plugin-migration.html#apply_p lugin ● Santa Tracker Project fork ○ https://github.com/jmslau/santa-tracker-android ● [Fabric] Gradle Advanced setup ○ https://docs.fabric.io/android/crashlytics/build-tools.html#gradle-advanced-setup

Slide 37

Slide 37 text

Thank you