Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

takenach

June 02, 2017
Tweet

More Decks by takenach

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. View Slide

  4. About app’s project

    Single module

    160 Java files

    100 XML files, 700 PNGs

    Single-dex

    Use annotation processors

    APK size ~6MB

    View Slide

  5. Specs of Build PC

    MacBook Pro (Early 2015)

    2.9 GHz Intel Core i5

    Memory : 16 GB

    256 GB SSD

    View Slide


  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

    View Slide

  7. Current Build Time (Android Gradle plugin 2.3.2)

    View Slide

  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

    View Slide


  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

    View Slide

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

    View Slide

  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
    }
    }

    View Slide

  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"
    }
    }
    }

    View Slide

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

    Android Studio

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

    View Slide

  21. Tips 7: Avoid inadvertent changes

    View Slide

  22. Tips 7: Avoid inadvertent changes

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

    View Slide


  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
    . . .
    RANDOM_UUID
    ext.enableCrashlytics = false

    View Slide

  24. Tips 8: Don’t use dynamic versions

    dependencies

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  29. But It’s still slow…

    View Slide

  30. Tips Ex: multidex in debug

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

    View Slide

  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
    }
    }

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  35. View Slide

  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

    View Slide

  37. Thank you

    View Slide