Androidアプリ開発 AndroidStudio Gradleでビルド時間を改善する

2016年08月11日(編集2017年12月10日)
このエントリーをはてなブックマークに追加

Androidアプリ開発では、ビルドツールにGradleを利用するのが一般的です。 しかし、デフォルト設定でビルドをすると時間がかかります。なので、設定を変更して高速化するべきです。
この記事は、Androidアプリ開発でGradleを使ったビルド時間を高速化する方法を記載した記事です。

環境はAndroid 7.0 (API level 24) です。
記事の内容を、Android 8.1 (API level 27) 用に更新しました。

環境

  • macOS Sierra
  • Oracle jdk version 1.8.0_72
  • Android Studio 3.0.1
  • android sdk 27
  • Gradle 4.1+

難易度

初心者向け

計測

まずは、改善前のビルドの速度を計測します。

Android StudioでRebuildを実行します。
Rebuildはbuildフォルダのコンテンツを削除し、バイナリをビルドします。apkファイルは作成しません。

メニュー → Build → Rebuild Project

でRebuildを実行します。

Rebuild
terminal
// 1回目
BUILD SUCCESSFUL

Total time: 16.19 secs

// 2回目
BUILD SUCCESSFUL

Total time: 9.215 secs

// 3回目
BUILD SUCCESSFUL

Total time: 8.421 secs
        

上記は、3回のビルド実行結果です。

サンプルは小さなアプリなので、もともとビルドは早いです。

Gradleのバージョン

Androidアプリのビルドは、Gradleに依存します。当然、ビルド時間はGradleの性能と関連があります。
なので、Gradleのバージョンは可能な限り最新にします。

Gradleのバージョンは、gradle.propertyで設定します。

{project_folder}/gradle.property
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
    }
}
        

公式サイトのリリースノートはこちらです。

Offline workを有効にする

Android Studioで

Preference → Build,Execution,Deployment → Gradle

と進み Offline work と書かれたチェックボックスにチェックを入れると、ライブラリの依存関係の確認作業をしなくなります。

Offline work

これにより、Gradleのビルドを高速化できます。

gradle.propertyの設定

gradle.propertyを設定します。

{project_folder}/gradle.property
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.caching=true
        

各種プロパティの値と内容は、以下の表の通りです。

■ gradle.propertyの設定項目

名称 機能
org.gradle.daemon デーモンプロセスを使うか
org.gradle.jvmargs 実行時のJVM引数
org.gradle.parallel gradleの並列ビルドモードを有効にする
org.gradle.configureondemand 関連するプロジェクトがある場合に必要な部分だけビルドする
org.gradle.caching ビルドをキャッシュする。Gradleのインクリメンタルビルド機能を補完する。Gradle 3.5以上に対応。Introducing Gradle Build Cache

最も効果が高いのは、org.gradle.jvmargsのメモリ容量を増やすことです。

Dex In Processの有効化

Dex In Processを有効化します。 Dex In Processを有効にすると、フルクリーンビルドが劇的に早くなります。

{project_folder}/build.gradle
android {
    dexOptions {
        javaMaxHeapSize '2g'
    }
}
        

Dex In Processの設定を有効にするには、gradle.propertyのorg.gradle.jvmargsのメモリ容量を、javaMaxHeapSize以上にする必要があります。

インクリメンタルビルド

インクリメンタルビルドは、以前ビルドされなかったターゲットまたは古いターゲットだけをビルドすることです。
gradleで機能を有効にするには以下のようにします。

{project_folder}/build.gradle
android {
    dexOptions {
        incremental true
    }
}
        

必要のないリソースをコンパイルしない

開発ビルド限定

開発に利用している端末の量子化密度(dp)の指定をします。xxhdpiなら、xxhdpiを、xxxhdpiならxxxdpiのリソースを指定します。また、多言語化対応しているアプリなら、string.xmlも必要な言語を指定します。

例として、開発時に「日本語」で「xxhdpi端末」を利用してる場合の設定を以下に記載します。

{project_folder}/app/src/main/article90/FloatingActionButtonActivity.java
android {
    defaultConfig {
        resConfigs "ja", "xxhdpi"
    }
}
        

本番ビルドでは、この設定は無効にしてください。

PNG Crunchingの無効

開発ビルド限定

デフォルトだとpngリソースがビルド時に最適化されるので、一時的にオフにします。

{project_folder}/app/src/main/article90/FloatingActionButtonActivity.java
android {
  aaptOptions {
    cruncherEnabled false
  }
}
        

本番ビルドでは、この設定は無効にしてください。

Instant Run

gradleとは無関係ですが、Instant Runを有効にして開発をおこないましょう。

Android Studioで

Run → Apply Changes

で実行可能です。

端末

エミュレーターでなく、本物の端末で開発をおこないましょう。エミュレーターはメモリの関係もあって、速度に限界があります。

再計測

改善後のビルドの速度を計測します。
改善前と同じように3回Rebuildを実行します。

terminal
// 1回目
BUILD SUCCESSFUL

Total time: 8.52 secs

// 2回目
BUILD SUCCESSFUL

Total time: 7.972 secs

// 3回目
BUILD SUCCESSFUL

Total time: 6.686 secs
        

1.26倍ほど早くなりました。
小さなアプリだとあまり実感できませんが、大規模アプリだとかなりの高速化を感じることができると思います。

まとめ

アプリの容量が大きくなるほど、ビルドは時間がかかります。
適切なカスタマイズをして、ストレスの少ない開発環境を構築してください。30秒以内のビルド時間を目指しましょう。

また、Androidアプリ開発は、マシンパワーによる影響が大きいので、2-3年を目安に開発マシンを買い換えましょう。

関連記事

タグ検索で調べてみよう

Android7.0 Android Studio