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

flavorDimensionsによるflavorの指定方法

More than 3 years have passed since last update.

flavorDimension指定は2015/10/27現在のAndroidStudioでdeprecatedになっていたため、記述を修正しました。

例えば、こちらで紹介しているように、productFlavorによってビルド設定を変えたいような場面があると思います。

android {
    productFlavors {
        // 開発環境
        dev {
            // 開発時にはビルドを高速化!
            minSdkVersion 21
        }
        // プロダクション環境
        prod {
            minSdkVersion 14
        }
    }
}

しかし、すでにproductFlavorによって複数のソースツリーが管理されている場合、productFlavorによる設定を変えることは難しいです。

android {
    productFlavors {
        // 課金なしのアプリ
        freeApp {
            ...
        }
        // 課金ありアプリ
        paidApp {
           ...
        }
    }
}

なぜなら、これらのflavorをにはたいてい対応したソースツリーが存在するからです。

src/main/java
src/freeApp/java
src/freeApp/rsc
src/paidApp/java
src/paidApp/rsc

これに無理やりビルド設定のflavorをかけ合わせると

android {
    productFlavors {
        // 課金なしのアプリの開発版
        freeAppDev {
           minSdkVersion 21
            ...
        }
        // 課金なしのアプリのプロダクション版
        freeAppProd {
           minSdkVersion 15
            ...
        }
        // 課金ありアプリの開発版
        paidAppDev {
            minSdkVersion 21
           ...
        }
        // 課金ありアプリのプロダクション版
        paidAppProd {
           minSdkVersion 15
           ...
        }
    }
}

となり対応するソースツリーは

src/main/java
src/freeAppDev/java -- freeAppDevとfreeAppProdは同じソースが入っている必要がある
src/freeAppDev/rsc
src/freeAppProd/java
src/freeAppProd/rsc
src/paidAppDev/java -- paidAppDevとpaidAppProdは同じソースが入っている必要がある
src/paidAppDev/rsc
src/paidAppProd/java
src/paidAppProd/rsc

のようになってしまい、2重管理が必要になります。

そこでflavorDimensionsだよ

Android StudioにはflavorDimensionsという機能があり、flavorDimensions指定を行うと個々のflavorに対して、直交する次元(dimension)をもたせ、それを組み合わせたbuild variantを作ることができます。

何を言っているかよくわからないと思いますが実際に上記の例にflavorDimensionsを適用してみましょう

    flavorDimensions "sourceSet", "usage"

    productFlavors {
        free {
            dimension "sourceSet"
            // 従来のflavorの設定を記述
        }

        paid {
            dimension "sourceSet"
            // 従来のflavorの設定を記述
        }

        product {
            dimension "usage"
            minSdkVersion 15
        }

        dev {
            dimension "usage"
            // minSdkVersionを21に設定するとmultidexでのビルドが速くなる
            minSdkVersion 21
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'
        }
        debug {
            jniDebuggable true
            minifyEnabled false
            shrinkResources false
        }

    }




ここではsourceSetusageという2つのdimensionを定義しており、それぞれfreepaidのflavorDimensionはsourceSet、またproductdevのflavorDimensionはusageを割り当てています。この場合flavorはsourceSetusageの組み合わせて

  • freeProduct
  • freeDev
  • paidProduct
  • paidDev

の4つと定義されます。
また、release/debugのbuildTypeと組み合わせると

  • freeProductRelease
  • freeProductDebug
  • freeDevRelease
  • freeDevDebug
  • paidProductRelease
  • paidProductDebug
  • paidDevRelease
  • paidDevDebug

の8種類のbuild variantが生成されます。

便利!

flavorをJavaのコードから参照する場合

従来のflavorはJavaのコード上から以下のように参照できました。

        switch (BuildConfig.FLAVOR) {
            case "paid":
                // paid flavorの時の処理
                break;
            case "free":
                // free flavorの時の処理
                break;
        }

上記のようにdimensionsを定義するとBuildConfig.FLAVOR以下のように参照できます。

        switch (BuildConfig.FLAVOR) {
            case "paidProduct":
            case "paidDev":
                // paid flavorの時の処理
                break;
            case "freeProduct":
            case "freeDev":
                // free flavorの時の処理
                break;
        }

ただ、この場合新しくdimensionが増えると分岐の数が増え、そのたびにこのコードを修正しなければならなくなります。
そういうときは以下のような指定を使います。

        switch (BuildConfig.FLAVOR_sourceSet) {
            case "paid":
                // paid flavorの時の処理
                break;
            case "free":
                // free flavorの時の処理
                break;
        }

なんとdimensionごとにBuildConfig上に定数が生成されるんです。これでかりにdimensionが増えても注目すべきdimensionのFlavorだけ取り出して処理の分岐を扱うことができます。

めでたしめでたし

sansan
法人向け名刺管理サービスSansan及び個人向け名刺管理サービスEightを企画・開発・販売するベンチャー
http://jp.corp-sansan.com/
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