Tips for faster development builds

Tips for faster development builds

参考URL
- 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_plugin
- 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
- Android Studio 2.3から3.0へのマイグレーションポイント
- http://qiita.com/eaglesakura/items/133aa7130dea81c9fc1e
- Android Studio 3.0でのGradleプラグインの非互換性
- http://qiita.com/tnj/items/5f5ce40d3ca2270d2082
- Error on build in Android Studio 3 Canary & Gradle 4
- https://github.com/google/protobuf-gradle-plugin/issues/129

C6364c3b33b6508f1f41733f57576d83?s=128

takenach

June 02, 2017
Tweet

Transcript

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

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

  3. None
  4. About app’s project • Single module • 160 Java files

    • 100 XML files, 700 PNGs • Single-dex • Use annotation processors • APK size ~6MB
  5. Specs of Build PC • MacBook Pro (Early 2015) •

    2.9 GHz Intel Core i5 • Memory : 16 GB • 256 GB SSD
  6. • 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
  7. Current Build Time (Android Gradle plugin 2.3.2)

  8. 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
  9. • 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
  10. Tips 1: Use latest Android Gradle plugin -10s -18s -

    7s
  11. 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 } }
  12. 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" } } }
  13. Tips 3: Disable multi-APK • コマンドライン ./gradlew :app:assembleDevelopmentDebug -PdevBuild •

    Android Studio
  14. Tips 3: Disable multi-APK - 9s - 5s -10s

  15. Tips 4: Include minimal resources • 多くの言語や画面サイズをサポートしていても、 開発中は使っている端末(エミュレータ)以外の リソースは無駄になる •

    必要なリソースだけを入れることで、無駄な時間 を削減する! • ※この設定を入れて Sync すると下記のエラー が出る(けど、 build はできる) productFlavors { development { minSdkVersion 21 resConfigs("en", "xxhdpi") } }
  16. Tips 4: Include minimal resources -10s - 5s - 1s

  17. Tips 5: Disable png crunching • デフォルトで PNG 画像サイズの最適化が有効になっているが、これも開発時には 不要なので、無効にする

    android { if (project.hasProperty('devBuild')) { splitEnabled = false aaptOptions.cruncherEnabled = false } }
  18. Tips 5: Disable png crunching - 2s ± 0s -

    1s
  19. Tips 6: Use Instant Run ? - 9s + 3s

    *
  20. Tips 7: Avoid inadvertent changes • ビルドの度に Manifest の更新が行われるような設定は避ける ◦

    ex) versionCode をビルド毎にユニーク ID を振る def buildDateTime = new Date().format('yyMMddHHmm').toInteger() android { defaultConfig { versionCode buildDateTime } }
  21. Tips 7: Avoid inadvertent changes

  22. Tips 7: Avoid inadvertent changes • Fixing versionCode updates def

    buildDateTime = project.hasProperty('devBuild') ? 100 : new Date().format('yyMMddHHmm').toInteger() android { defaultConfig { versionCode buildDateTime } }
  23. • 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 . . . <string name="com.crashlytics.android.build_id">RANDOM_UUID</string> ext.enableCrashlytics = false
  24. Tips 8: Don’t use dynamic versions • dependencies に [+]

    で、バージョン指定しない ◦ 毎日、最新バージョンチェックが行われる ◦ (意図しない変更が入ってしまう恐れがある) dependencies { compile ‘com.android.support:appcompat-v7:+’ . . . }
  25. 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
  26. 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
  27. Tips 10: Enable Gradle Caching - 7s + 2s -

    7s
  28. 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
  29. But It’s still slow…

  30. Tips Ex: multidex in debug • Single-dex に収めるために debug ビルド時も

    proguard をかけている(難読化はして いない) その処理に時間がかかっている、、、
  31. 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 } }
  32. Tips Ex: multidex in debug -30s -28s -31s

  33. 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
  34. (Extra) Build by AS 2.3.2 [exclude Tips 1 & Tips

    10]
  35. None
  36. 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
  37. Thank you