読者です 読者をやめる 読者になる 読者になる

TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

Androidアプリの広告版と有料版を一つのプロジェクトにする

今まで、広告版と有料版を別のプロジェクトにして、両方に同じ内容の修正を行っていたが、コードを共通化できると手間が省ける。
Android Studioのビルドバリアント機能を使えば、一つのプロジェクトにできることが分かった。

ビルドバリアントには、「Build Types」や「Product Flavors」など何種類かあるが、広告版と有料版を一つのプロジェクトにするには、「Product Flavors」を使う。

「Product Flavors」の定義は以下のようにして行える。

build.gradleの設定

Moduleのbuild.gradleのandroidのブロックに以下のようにproductFlavorsを定義する。

apply plugin: 'com.android.application'

android {
    ...
    productFlavors {
        Ad {
            buildConfigField "boolean", "NOAD", "false"
        }
        NoAd {
            applicationId "com.example.buildvariantstestNoAd"
            buildConfigField "boolean", "NOAD", "true"
        }
    }
}

「Ad」、「NoAd」は、それぞれ広告版と有料版につけたFlavorの名前で任意の名前にできる。
applicationIdは重複することができないため、デフォルトのapplicationIdを使用しない方には、applicationIdの定義を追加する。
また、buildConfigFieldを定義することで、コード内で値を参照できるようになる。

レイアウトを別にする

広告版と有料版でレイアウトを分ける場合は、Android StudioAndroidビューにして、appを右クリックして、「New Resource File」をクリックする。
名前に、デフォルトのレイアウトのファイル名と同じ名前を入力する。
Resource Typeを「layout」にする。
Source setをレイアウトを別にするFlavorの名前に設定する。

f:id:TadaoYamaoka:20161113175346p:plain

Android StudioAndroidビューに2つのバージョンのレイアウトファイルが表示されるようになる。

f:id:TadaoYamaoka:20161113180030p:plain

コード内で処理を分ける

コード内で処理を分けるには、build.gradleでbuildConfigFieldを定義する。
以下のようにコード内からbuildConfigFieldで定義した値を参照できる。

        String msg = "Hello World!";
        if (BuildConfig.NOAD) {
            msg = "Hello NoAd!";
        }

それぞれのバージョンをテストする

それぞれのバージョンをテストするには、Android Studioの左側のバーからBuildVariantsを選択し、Build Varirantの選択を切り替える。

f:id:TadaoYamaoka:20161113175902p:plain