Android
Studio flavorを用いた2つの構成を切り替えて2つのアプリを作る メモ
coskx 20200830 20180421
androoid studio (4.0.1)で,1つのプロジェクトから一部が異なる2つのアプリを作成する。
作業の目的
androoid studio
で,1つのプロジェクトから一部が異なる2つのアプリ(配布形式1,配布形式2)を作成するプロジェクトを定義する。
2つのアプリの共通部分は同じソースを用い,2つのアプリで異なるソースだけをそれぞれ作成し,
フォルダを差し替えたりせずに,アプリケーションbuildの段階で,どちらでbuildするかを選択できるようにする。
概要
アプリに使われている文字列が2つの配布形式で異なる場合は,
リソースのStringファイルを使って文字列リソースIDで参照しておく。
例えば使用する文字列が配布方法1の設定のものと配布方法2のもので異なる場合は
文字列リソースのStringファイルを2つを同じファイル名で別のファオルダ内に作っておき,切り替えることになる。
(切り替え方法は後述のとおり,Android Studioが自動的に行ってくれる仕掛けを使う)
使用しているクラスの一部が2つの版で異なる場合も,同じクラス名・同じファイル名を持つxxxx.javaを
別のファオルダ内にそれぞれ作っておき,これを切り替える。
音声などのリソースを使う場合で,2つの版で異なる場合も2重化しておき,同様に切り替えることになる。
アプリケーションbuildの段階で,どちらでbuildするかを選択する。
2つの構成の違いを,例えばcase1,case2という名前(flavor名)で識別することにする。
設定ファイルに,次のように切り替える仕組み(flavor)を記述しておく
作業の詳細
1.ファイル(クラス)の2重化
1.1 2重化する前のプロジェクトMyproject
ワークスペース(例えばAndroidStudioProjects)中に2重化されていないプロジェクトMyproject があるとすると,
Myproject¥app\src
の中は
├─androidTest
│ 略
│
├─main
│ ├─java
│ │ └─com
│ │ └─example
│
│
└─username
│
│
└─myproject
│
│
mainActivity.java など
│
│
MyClass.java
│ ├─res
│ └─AndroidManifest.xml
├─test
│ 略
のようになっている。
1.2 以下のものを2重化することとする
res.values内のstring.xml
MyClass.java
res.raw内の複数のファイル
そうすると,次のような構成にする。
case1,case2という名前はflavor名であると同時にフォルダ名にも使用する。
├─androidTest
│ 略
│
├─case1
│ ├─java
│ │ └─com
│ │ └─example
│
│
└─username
│
│
└─myproject
│
│
MyClass.java
│ │
│ └─res
│ ├─raw
│
│ abc.wav
│
│ def.wav
│
│ eighty.wav
│
│ などcase1に特有のもの,またcase2側に同じ名前のものがあってもよい
│
│
│ │
│ └─values
│
strings.xml case1特有の文字列が定義されている
│
├─case2
│ ├─java
│ │ └─com
│ │ └─example
│
│
└─username
│
│
└─myproject
│
│
MyClass.java
│ │
│ └─res
│ ├─raw
│
│ aiueo.wav
│
│ kakikukeko.wav
│
│ などcase2に特有のもの,またcase1側に同じ名前のものがあってもよい
│
│
│ │
│ └─values
│
strings.xml case2特有の文字列が定義されている
│
├─main
│ ├─java
│ │ └─com
│ │ └─example
│
│
└─username
│
│
└─myproject
│
│
MainActivity.java など最初からあった.java
│ ├─res
│ │
├─drawable
│ │
├─layout
│ │
├─menu
│ │
├─raw
│ │
├─values
│ │ │ string.xml case1,case2共通の文字列が定義されている
│ │
│ など
│ │ │
│ │
│
└─AndroidManifest.xml
│
└─test
略
★注意点
MyClass.javaは2つの版で異なる記述がある。この場合は,
mainフォルダ中にMyClass.javaは残っていてはいけない。
共通で使うファイルは,(例えば,main.res.raw,special_string.xml)
main.res.values 中にあってもよい。
case1にだけ,カメラ使用をするときには,
<uses-permission android:name="android.permission.CAMERA"/>
を書きたくなるが,
case1フォルダ内にもAndroidManifest.xmlを置き,その中に差分だけを記述することもできる。
2.設定ファイルの修正
設定ファイルの修正は手作業で行ってもよいが,android
studioがflavorの設定で自動的に行ってくれる。
1)「File Menu」の「Project Structure」を開く
2) 左側ペインで「Build Valiants」に設定,「Modules」ペインでappを選んでおいてFlavors Tabを開く
「+」クリックで「Add Flavor Dimensions」で例えば「source」と入力
「+」クリックで「Add product Flavors」を使って必要なだけFlavorを作る
ここではcase1とcase2を作る。
項目中「Application ID Suffix」にそれぞれcase1とcase2を書いておくと,IDにこれが付け加えられるので便利
build.gradleファイル中に次の記述が生成される。
flavorDimensions 'source'
productFlavors {
case1 {
dimension 'source'
applicationIdSuffix 'case1'
}
case2 {
dimension 'source'
applicationIdSuffix 'case2'
}
}
3.ビルド
androidstudioの左端の縦に並んだタブから,「Build Variants」を開いて,
所望の版(case1またはcase2)を指定することができる。