LoginSignup
11
8

More than 5 years have passed since last update.

マルチモジュール構成のAndroidプロジェクトでbuild.gradleの記述を共通化する

Posted at

モジュール毎のbuild.gradleのdependenciesの記述を共通化したい

Android Studioでレイヤー毎にモジュール化を行ったプロジェクトを作成した際に、モジュール間の依存性解決にKoinを用いたところ、各モジュールのdependenciesにそれぞれKoinに対するimplementationを記載しなければいけなくなった。

app/build.gradle
dependencies {
    // Koin
    implementation "org.koin:koin-core:$rootProject.koin_version"
    implementation "org.koin:koin-android:$rootProject.koin_version"
}

すべてのモジュールにこれを記載していくのはあまりイケていないなー。共通化したいなと思い、なにか良い方法が無いかなと調べたところ、プロジェクトレベルのbuild.gradleにsubprojectsブロックを定義するとすべてのモジュールで共通となる記述をまとめることが出来るようなので、試してみました。

ところがimplementationが定義されていないよ的なエラーがでてGradle Syncが失敗する…

原因調べたところ、appモジュールやライブラリモジュール作成時に定義されている

apply plugin: 'com.android.application'

などの後に定義する必要があるようです。たしかにそうですね。

解決方法

上記のapply pluginの部分をsubprojectsに移動したのですが、1つ困った事があり、

モジュールのタイプ プラグイン名
App Moduleの場合 com.android.application
Android Library Moduleの場合 com.android.library

みたいな感じでプラグイン名を変える必要があったのでモジュール名によって判定するコードを追加しました。

build.gradle
subprojects {
    switch (project.name) {
        case 'app':
            apply plugin: 'com.android.application'
            break
        default:
            apply plugin: 'com.android.library'
            break
    }

    dependencies {
        // Koin
        implementation "org.koin:koin-core:$rootProject.koin_version"
        implementation "org.koin:koin-android:$rootProject.koin_version"
    }
}

Java LibraryやDynamic Feature Module等を使用している場合はまた別のプラグインとなるので、

  • モジュール名によって判定
  • するか、モジュール名の命名規則を決めてswitch文で正規表現を用いた判定などを行う

などの対応を行うと良いかと思います。

最初のswitch文だけ書いておけば、モジュール側のbuild.gradleに記述されている内容はほぼこちらに記載することが可能なので次のように
androidブロックの内容などもsubprojectsで共通化すれば、app, library側のbuild.gradleはかなりスッキリさせる事ができるのではないかなと思います。

build.gradle
subprojects {
    switch (project.name) {
        case 'app':
            apply plugin: 'com.android.application'
            break
        default:
            apply plugin: 'com.android.library'
            break
    }

    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'

    android {
        compileSdkVersion 27

        defaultConfig {
            minSdkVersion 23
            targetSdkVersion 27
            versionCode 1
            versionName "1.0"

            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    }

    kotlin {
        experimental {
            coroutines 'enable'
        }
    }

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])

        // Kotlin
        implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.24.0'
        implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.24.0'

        // Koin
        implementation "org.koin:koin-core:$rootProject.koin_version"
        implementation "org.koin:koin-android:$rootProject.koin_version"
    }
}
11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8