だいぶ今更な感じだが、最近対応してみて割と便利だったのでメモ。
アプリに署名するProductID(パッケージ名)が別であれば別アプリとして認識されるので、開発版とリリース用とをGradleのProductFlavorを使ってBuildVariantsで切りかえられるようにします。
今回は「開発版アプリとリリースアプリを一端末に共存させる」までの最短距離を記すので、BuildVariants、BuildType、Flavorについての詳細を知りたい方はこの辺りの記事をご参考に。
build.gradleの設定
まずはbuild.gradleにproductFlavorsを追加し、devで署名された場合はapplicationIdがdev用のもので上書きされるように設定しています。productionの場合はdefaultConfigのままにするので空欄で。なお、dev/productionという名前はお好きなものに。
また、アプリ名を切りかえのためにプレースホルダーを設定します。
defaultConfigとproductFlavors->devのmanifestPlaceholdersにappNameを追加し、それぞれアプリ名を指定しておきます。
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.hoge.hoge"
manifestPlaceholders = [appName:"@string/app_name"]
minSdkVersion 15
targetSdkVersion 23
versionCode 20
versionName "2.0.0"
}
productFlavors {
dev {
applicationId = "com.hoge.hoge.dev"
manifestPlaceholders = [appName:"@string/app_name_dev"]
}
production {
}
}
}
AndroidManifestの設定
applicationと最初のactivityに「android:label="${appName}」を記載し、build.gradleで定義したappNameを読み込みます。これでランチャー上のアプリ名がdevとproductionそれぞれのものになります。
また、BroadcastReceiver等は「android:authorities="${applicationId}」を明示してあげないとエラーが出るので注意。
<application
android:name=".Application"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme"
android:label="${appName}">
<activity
android:name="com.hoge.hoge.HogeActivity"
android:label="${appName}">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
・・・
BuildVariantsの設定
debug/releaseそれぞれFlavor付きのvariantが選択できるようになっています。
debug/relaseで署名しBuildされたアプリは同一端末にそれぞれインストールできます。
まとめ
非常に簡単でした。
「バージョンごと」「APIの向き先ごと」でアプリを共存させるなどの用途でも活用できそうです。