Androidで複数Product Flavorを利用する

ゴール

複数のビルド生成ファイルを作成(端末インストール)する。

上記を実現する際に問題が生じることがある。

問題

ビルド時のアウトプットファイル(.apk)の名前が重複してしまい

複数アプリを同時にインストールできなくなってしまうことがある。

根本的な原因は以下。

  • applicationIdが同一

  • Content Providerのauthoritiesが同一

解決方法

1. applicationId

build.gradleファイル内のapplicationIdを別々にしたら解決。

free {
    applicationId "com.bison.sampleapp.free"
}
paid {
    applicationId "com.bison.sampleapp.paid"
}

ただ、Flavorをわけているので、applicationId変更しないことはないかな笑

問題はBuild Typeをrelease, debugに置き換える際に発生します。

Build TypeのプロパティにapplicationIdSuffixがあるので、それ使いましょう。

buildTypes{
    release{
    }
    debug{
        applicationIdSuffix ".debug"
    }
}

これでdebugビルド後のみ生成ファイルが
applicationId + applicationIdSuffix
になるのでコンフリクトが起きなくなります。

2. Content Provider 

  Content Providerを利用する場合、同じように異なるFlavorでビルドを行った際にエラーが生じます。

<provider
    android:name=".SampleContentProvider"
    android:authorities="com.bison.sampleapp.provider"
    android:exported="false" />

AndroidManifest.xml内のauthoritiesにユニークな識別子を与える必要あり。

そのためには、authoritiesを動的に変更できるようにします。

authoritiesはアプリのパッケージ名に揃えるのが通例です。

<provider
    android:name=".SampleContentProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false" />

applicationIdはbuild.gradleから動的に自動で割り当てられる変数です。 (もしくは、build.gradle内でManifestHolderを利用してください。)

以上。

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築