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)を指定することができる。