Android マルチモジュール: Gradle周りで便利だと思う設定

マルチモジュールなアプリを作ることをテーマにブログを書いていこうの、2本目です。

1本目はこちらになります。

今回は、マルチモジュール環境における、Gradle周りの便利であろう設定について、次の4つを紹介します。

モジュール内のリソース名にルールを持たせる

resourcePrefixは、リソース名のプレフィックスにルールを設けるプロパティです。

例えば、次のように書くと、このモジュール内のリソース(レイアウト、Drawable、Stringなど)はhome_から始まる必要があります。

// build.gradle
android {
  ...
  resourcePrefix 'home_'
}

// strings.xml
<resource>
  // home_から始まる必要がある
  <string name="home_app_name">適当な文字列</string>
</resource>

これを定義することで、名前のコンフリクトを防ぐことが出来ます。また、名前からリソースがどのモジュールで定義されているかを推測すること出来ます。

BuildConfigを作らない

モジュールのBuildConfigの生成を無効にすることが出来ます。例えば、uber/AudoDisposeでは、次のように設定しています。

// build.gradle
project.android {
  libraryVariants.all {
    it.generateBuildConfigProvider.configure {
      it.enabled = false
    }
  }
}

モジュールで、BuildConfigが必要になることは稀なので、基本つけておくと良いと思います。

モジュール内でProGuard/R8の設定をする

consumerProguardFilesを使うことで、モジュールのProguard/R8の設定を定義することが出来ます。

例えば、次のように使います。

// build.gradle
android {
  defaultConfig {
    consumerProguardFiles 'consumer-rules.pro'
  }
}

// consumer-rules.pro
-keep class * implements com.google.gson.TypeAdapterFactory

このように書くことで、ProGuardを有効にしてビルドした時に、consumer-rules.proの設定も考慮して、コード最適化を行ってくれます。

Rファイルを小さく保つ

R.javaは依存関係にあるモジュールのR.javaを、マージしていくような動作をするため、マルチモジュール環境だと各モジュール内で生成されるR.javaのサイズが馬鹿にならないことがあります。そこで、gradle.propertiesに次の設定をすることで、モジュールのR.javaのサイズを抑えることが出来ます。

// gradle.properties
android.namespacedRClass=true

Jake Wharton/Twitterに書いてあるのですが、debugビルドで約20%のフィールドを削減することが出来たようです。

注意としては、各モジュールで、マージされた大きなR.javaが生成されなくなるため、次のようにimport文を書き直さなければいけない点です。

import com.jakewharton.sdksearch.roboto.R as RobotoR

SdkSearch/SearchUiBinder

また、この設定は、experimentalなフラグなので、今後挙動が変わる可能性があります。

まとめ

Written by