ProductFlavorでアプリ名や画像などリソースファイルを切り替えるようなアプリを作った際、いくつか切り替え方法があったのでまとめた。今回自分が調べただけで、大きく3種類あった。
用途に応じてそれぞれ使い分けられそうなのでまとめた。
- build.gradleのflavor定義のところに書く。
- stringsなどのリソースファイルに書く
- flavorフォルダにManifestを作って上書き
ここでいうflavorフォルダは、main/と同列に並んで作る、flavor名のついたフォルダのこと。res/とかAndroidManifest.xmlとか作れば、そのflavorを選択した時に読みに行ってくれる。
以下、それぞれ詳細。
build.gradleに書くパターン
applicationIdやversionCodeなど、一部の要素はここで記述可能。対応してればAndroidStudioが補完してくれる。
flavor_1 {
applicationId = 'app.id.1'
versionCode = '2'
versionName = '1.1'
}
flavor_2 {
applicationId = 'app.id.2'
versionCode = '12'
versionName = '2.3'
}
strings.xmlなどのリソースファイルに書くパターン
全てのflavorで必要だが、それぞれで値が異なるような場合は、この方法を使うと良さそう。例えば外部ライブラリのアプリIDやAPI keyといったものが該当しそう。
要素の記述自体はmain/AndroidManifest.xmlにしておく
<meta-data android:name="some_name" android:value="@string/some_value">
次に、{flavor}/res/にxmlファイルを作り、@string/some_value
を定義する。
<string name="some_value">hogefuga</string>
flavorフォルダに作るManifestをパターン
特定のflavorにしかない要素を作りたいときにはこの方法。
{flavor}/AndroidManifest.xmlを定義すると、ビルド時にmain/AndroidManifest.xmlとマージされたファイルができるようだ。
(/build/intermediates/manifests/full/{flavor}/{buildType}/AndroidManifest.xmlにできるので確認できる。)
例えば今回はappliction内で宣言されるmeta dataを宣言したときにはこんな感じ。
<!-- package名は親と合わせておく -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="{main/AndroidManifext.xmlで定義したpackage}">
<!-- 宣言したいmeta dataがapplicationタグ内のものであることを教える -->
<!-- applicationの属性とかは指定しなくていい -->
<application>
<meta-data android:name="some_flavor_name" android:value="some_flavor_value"/>
</application>
</manifest>
まとめ
- 対応してれば簡単なのでbuild.graldeに書き、flavor毎に値が変わるのは{flavor}/res/に、flavorによって定義したりしなかったりするやつはマニフェストに書く。
- 試してないけど、多分build typeにも応用できる。