Help us understand the problem. What is going on with this article?

動的に Build types を生成してビルドする

More than 1 year has passed since last update.

まずは手動でやる

パッケージ名や一部のパラメータだけを変更するような APK が必要な場合、 Android では Build types や Product flavors と呼ばれる仕組みを使って一部のみを差し替えたビルドを簡単に作成することができます。

そのためには以下のようにします。

android {
    ...
    buildTypes {
        release {
            ...
        }
        debug {
            ...
        }
        preview {
            // preview ビルド用のベースとなるビルド設定を記述する
        }
        preview_foo {
            initWith preview
            applicationIdSuffix '.foo'
            buildConfigField 'String', 'SOME_PARAM', '"foo"'
        }
        preview_bar {
            initWith preview
            applicationIdSuffix '.bar'
            buildConfigField 'String', 'SOME_PARAM', '"bar"'
        }
        preview_baz {
            initWith preview
            applicationIdSuffix '.baz'
            buildConfigField 'String', 'SOME_PARAM', '"baz"'
        }
    }
    ...
    sourceSets {
        preview_foo {
            setRoot 'src/preview'
        }
        preview_bar {
            setRoot 'src/preview'
        }
        preview_baz {
            setRoot 'src/preview'
        }
    }
}
dependencies {
    ...
    preview_fooCompile 'com.example:somelibrary:1.0.0-alpha'
    preview_barCompile 'com.example:somelibrary:1.0.0'
    preview_bazCompile 'com.example:somelibrary:1.0.1'
}

しかし、受託開発時などには動作確認用のビルドなどが たくさん 必要になることがあります。
しかも2, 3回しか使わなかったり、急に新しいものが必要になったり、とにかく手動でビルド設定を増やしたりするのはそれなりに手間がかかります。
ビルド毎に依存関係を変更しなければならない場合など尚更です。

動的にやる

そのような場合は動的にビルド設定を定義できると便利です。
Gradle では以下のように記述することが出来ます。

def previewConfigs = [
        foo: [someParam: 'foo', dependencyVersion: '1.0.0-alpha'],
        bar: [someParam: 'bar', dependencyVersion: '1.0.0'],
        baz: [someParam: 'baz', dependencyVersion: '1.0.1'],
]

android {
    buildTypes {
        release {
            ...
        }
        deubg {
            ...
        }
        preview {
            // preview ビルド用のベースとなるビルド設定を記述する
        }
        previewConfigs.each { name, config ->
            "preview_$name" {
                initWith preview
                applicationIdSuffix ".$name"
                buildConfigField 'String', 'SOME_PARAM', "\"${config.someParam}\""
            }
        }
    }
    ...
    sourceSets {
        previewConfigs.each { name, config ->
            "preview_$name" {
                setRoot 'src/preview'
            }
        }
    }
}
dependencies {
    ...
    previewConfigs.each { name, config ->
        "preview_${name}Compile" "com.example:somelibrary:${config.dependencyVersion}"
    }
}

このように previewConfigs を定義し、各種の設定ではその値を使用するように指定することで、とても簡単に動的にビルド設定を追加、変更、削除することができます。

参照

kawmra
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away