🎉
App モジュールの BuildConfig をプロジェクト全体で使う (android, hilt)
はじめに
マルチモジュールのアプリで App モジュールの BuildConfig などの設定をプロジェクト全体で使用する方法のメモです。
アプリ構成
- app モジュールが各機能モジュールに依存します。
- 各機能モジュールは repository モジュールに依存します。
- repository モジュールは databse,network モジュールに依存します。
実装
resource モジュールを作成、 AppConfig データクラスを作成する
設定値を保持するクラスを持つモジュールとして、resources を作成します。
その中に下記のような AppConfig
というデータクラスを定義します。
今回は API アクセスの URL を app モジュールで定義してみます。なので baseUrl
というプロパティを定義してみました。
data class AppConfig(
val isDebug: Boolean,
val baseUrl: String
)
app:build.gradle に設定値を追加し、BuildConfig に入れる。
android {
buildTypes {
debug {
buildConfigField("String", "BASE_URL", '"https://debug"')
}
release {
buildConfigField("String", "BASE_URL", '"https://release"')
}
}
}
app モジュール内に hilt のモジュールとして定義する。
app モジュールが AppConfig
を知らないと行けないので依存に追加します。
// app:build.gradle
dependencies {
implementation(project(":util"))
}
hilt のモジュールを定義し、必要な値を BuildConfig から設定します。
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
@Singleton
fun appConfig(): AppConfig {
return AppConfig(
isDebug = BuildConfig.DEBUG,
baseUrl = BuildConfig.BASE_URL
)
}
}
以上で AppConfig
を使う準備が完了しました。
AppConfig を使う
例えば netowork モジュールで使用したい場合を考えます。
まずは network モジュールの build.gradle に resources モジュールの依存を追加します。
// network:build.gradle
dependencies {
implementation(project(":util"))
}
network モジュール内の hilt では下記のように記述すれば AppConcig
のデータを使用できます。
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Singleton
@Provides
fun provideRetrofit(
appConfig: AppConfig // DIされる
): Retrofit {
return Retrofit.Builder()
.baseUrl(appConfig.baseUrl)
.build()
}
}
モジュールの依存関係は以下のようになります。
まとめ
Gradle のマルチモジュール構成にて、Hilt を使用して app モジュールの設定値をプロジェクト全体で使用する方法の解説をしました。
モジュール毎に設定値がある場合、例えば network モジュールや databse モジュールで必要な場合はそれぞれ、NetworkConfig
, DatabaseConfig
のように定義してみても良いかもしれません。
マルチモジュールのビルドロジックをまとめる記事も作成しているので、是非読んでみてください。(Qiita ですが。。😂)
Discussion