こんにちは。菊地と申します。
今回は AndroidStudio で導入された Build Variants という仕組みについてです。
AndroidStudio がリリースされてだいぶ経ちますので、今更な感じはしなくもないですが、意外と知らない人も多いかな?と思ったのでまとめてみました。
はじめに
AndroidStudio では既存のビルドシステムである Ant に代わって、 Gradle が採用されています。ビルドの設定は build.gradle というファイルに記述していきます。 build.gradle に記述できる内容は多岐に渡り、様々なことが可能となっています。
例えば
- debug ビルドと release ビルドで APK を区別したい!
- AndroidManifext.xml に記述する permission を release ビルドには記述したくない!
- Google Maps Android API v2 の API Key を debug と release で切り替えたい!
- 同じソースコードから広告あり版と広告なしのアプリをビルドしたい!
こんなことができたらいいと思ったことはありませんか
これらは Build Variant を使うことで解決することができます。
Build Variants とは?
公式によると
Build Type + Product Flavor = Build Variant
Build Type と Product Flavor ってなに???となりますよね。
そこで、 Build Variants を理解するために必要な Build Type と Product Flavor についても理解する必要があるため、簡単な例とともに説明します。
Build Types
Build Types はビルドの種類のことです。 ビルドの種類毎にプロパティを設定することで、個別に設定を反映することができます。
デフォルトでは自動的に debug と release という2つのバージョンをビルドします。 (今回は説明のために debug と release を記述しています)
android {
...
defaultConfig {
...
}
buildTypes {
debug {
...
packageNameSuffix ".debug"
}
release {
...
}
}
}
buildTypes の中に debug と release の2種類が書かれています。
debug に対して packageNameSuffix ".debug" を設定しました。
packageNameSuffix は packageName の末尾に指定文字列を追記するものになります。
こうすることで、 debug ビルドの場合に packageName の末尾に .debug が付与されるため、一つの端末上で debug ビルドと release ビルドの APK が共存可能になります。
ちなみに、設定可能な property は以下のようなものがあります。 詳細については今回は割愛させていただきます。
Property name Default values for debug Default values for release / other debuggable true false jniDebugBuild false false renderscriptDebugBuild false false renderscriptOptimLevel 3 3 packageNameSuffix null null versionNameSuffix null null signingConfig android.signingConfins.debug null zipAlign false true runProguard false false proguardFile N/A(set only) N/A(set only) produardFiles N/A(set only) N/A(set only)
Sourcesets
デフォルトではビルド対象となるソースコードは src/main になりますが、 buildTypes 毎にビルド対象となるソースコードを分けることもできます。
- buildType が debug のとき
src/debug が存在する場合は配下にあるソースコードもビルド対象
- buildType が release のとき src/release が存在する場合は配下にあるソースコードもビルド対象
Dependencies
デフォルトでは Compile, Provided, APK, TestCompile の4種類が指定可能ですが Build Type を設定したことにより Build Type 毎に Complie を指定できるようになります。
android {
...
}
dependencies {
compile ''
provided ''
apk ''
androidTestCompile
// debug build だけの依存関係
debugComplie ''
// release build だけの依存関係
releaseComplie ''
}
Product Flavors
Product Flavors はアプリケーションのビルドをカスタマイズしたものを作るための仕組みになります。 有料版と無料版のビルドを1つのプロジェクトから行ったりといったことが可能になります。
android {
...
defaultConfig {
...
}
productFlavors {
development {
...
packageName "jp.co.next.development"
}
production {
...
packageName "jp.co.next.production"
}
}
}
Source
デフォルトではビルド対象となるソースコードは src/main になりますが、 buildTypes と同じ様に productFlavors 毎にビルド対象となるソースコードを分けることもできます。
- productFlavor が development のとき
src/development が存在する場合は配下にあるソースコードもビルド対象
- productFlavor が production のとき src/production が存在する場合は配下にあるソースコードもビルド対象
Build Variants
BuildTypes と ProductFlavors について、どういったものかがわかったところで、本題である Build Variants についてもみてみます。
Build Type + Product Flavor = Build Variant
Build Variant は Build Type と Product Flavor の組み合わせ毎にビルドを行うものになります。
Build Variant 毎の タスク名 および ソースディレクトリ名 は以下のようになります。
| Build Types | Product Flavors | タスク名 |
|---|---|---|
| debug | assembleDebug | |
| release | assembleRelease | |
| debug | development | assembleDevelopmentDebug |
| release | development | assembleDevelopmentRelease |
| debug | production | assembleProductionDebug |
| release | production | assembleProductionRelease |
| Build Types | Product Flavors | ディレクトリ名 |
|---|---|---|
| debug | src/main + src/debug | |
| release | src/main + src/release | |
| development | src/main + src/development | |
| production | src/main + src/production | |
| debug | development | src/main + src/developmentDebug |
| release | development | src/main + src/developmentRelease |
| debug | production | src/main + src/productionDebug |
| release | production | src/main + src/productionRelease |
※ AndroidManifest.xml が複数存在する場合は内容がマージされます
src/main/AndroicManifest.xml には Activity などを共通的なものを記述し debug ビルドでのみ必要となる permission などを src/debug/AndroidManfest.xml に書くといったこともできます
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.co.next" >
...
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity />
</application>
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.co.next" >
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
</manifest>
Google Maps Android API v2 の API Key などを src/debug/AndroidManifest.xml と src/release/AndroidManifest.xml でかき分けておくと便利!
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.co.next" >
...
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="debug用のAPIキー"/>
<uses-library
android:name="com.google.android.maps" />
</application>
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.co.next" >
...
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="release用のAPIキー"/>
<uses-library
android:name="com.google.android.maps" />
</application>
</manifest>
まとめ
今回は、簡単にですが Build Variants ってなに?どんなことができるの?という点についてまとめてみました。
さて、冒頭で例にあげたこと。もうやり方はわかっているとは思いますが、まとめておきます。
debug ビルドと release ビルドで APK を区別したい!
- Build Type 毎に packageNameSuffix を設定する
- Product Flavor 毎に packageName を設定する
AndroidManifext.xml に記述する permission を release ビルドには記述したくない!
- Build Type を使って src/debug/AndroidManifest.xml にだけ permission を追記する
Google Maps Android API v2 の API Key を debug と release で切り替えたい!
- Build Type を使って src/debug/AndroidManifest.xml に debug key, src/release/AndroidManifest.xml に release key を設定する
同じソースコードから広告あり版と広告なしのアプリをビルドしたい!
- Product Flavor を使って ソースコードをわけたりライブラリの依存関係を設定する
おまけ
Google Play Developer Console に APK をアップロードする際にデバッグ可能な APK をアップロードしました。」と言われた!
- Build Variants の値が Debug になっていないかを確認してください。
Build Variants ってどこでみれるの?
- AndroidStudio の View > Tool Windows > Build Variants からみれます。
| Module | Build Variant |
|---|---|
| next | debug |