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

sumioの技術メモ

Androidについての記事が多くなると思います。

ビルドタイプ・プロダクトフレーバーのカスタマイズ可能項目一覧

はじめに

前回の記事で、ビルドタイプもプロダクトフレーバーも、リソースやソースコードの一部を差し替えることができる点は同じであると書きました。

ビルドタイプでもプロダクトフレーバーでも

src/<ビルドタイプ名 or プロダクトフレーバー名>/

配下にソースコードやリソースの差分を置くことができます。その点では、ビルドタイプとプロダクトフレーバーに機能差分はありません。

ところが、build.gradleでカスタマイズすることのできる項目は、ビルドタイプとプロダクトフレーバーに違いがあります。本家のユーザーガイドの末尾には、

BuildType and Product Flavor property reference

という見出しがあるのですが、現状では「coming soon」としか書かれていません。

そこで、ビルドタイプとプロダクトフレーバーに、それぞれどのような設定項目があるのか調べてみました。

調べ方

ビルドタイプも、プロダクトフレーバーも単なるGroovyクラス(のインスタンス)なので、それぞれのメソッド一覧をリストアップしてみました。リストアップした結果から、以下を取り除いたものを、設定可能項目と推定しています。
実際に設定が反映されるかまでの調査はしていませんので、その点はご注意ください。

  • equalstoStringなどの明らかに無関係なメソッド
  • getからはじまるもの

また、setDebuggabledebuggableのように、プロパティと同名のメソッドが定義されている場合は、後者のみを列挙しています。

調査したプラグインのバージョンは0.5.1です。

参考までに、調査したbuild.gradleファイルの一部を掲載しておきます。

// buildscript { ... } とapplyは省略

android {
    compileSdkVersion 17
    buildToolsVersion "17.0"

    // 適当にプロダクトフレーバーを宣言する
    productFlavors {
        f1 {}
        f2 {}
    }
}

// 「debug」ビルドタイプのインスタンスから、メソッドの一覧を出力する
println "buildTypes = ["
android.buildTypes.debug.metaClass.methods*.name.sort().unique().each {
    println "    ${it}"
}
println "]"

// 「f1」フレーバーのインスタンスから、メソッドの一覧を出力する
println "flavors = ["
android.productFlavors.f1.metaClass.methods*.name.sort().unique().each {
    println "    ${it}"
}
println "]"

カスタマイズ可能項目一覧

上記スクリプトの出力結果を、

  • ビルドタイプ・プロダクトフレーバー共通で利用できるもの
  • ビルドタイプでのみ利用できるもの
  • プロダクトフレーバーでのみ利用できるもの

の順に並べて表にしたものを以下に示します。

メソッド名 Build Type Product Flavor 備考
buildConfig  
proguardFile  
proguardFiles  
signingConfig  
debuggable ×  
init × 通常では利用しない?
initWith × 新規ビルドタイプ生成時に利用
jniDebugBuild ×  
packageNameSuffix × cf. packageName
renderscriptDebugBuild ×  
renderscriptOptimLevel ×  
runProguard ×  
versionNameSuffix × cf. versionName
zipAlign ×  
flavorGroup × 所属するフレーバーグループの宣言に使う
minSdkVersion ×  
packageName × cf. packageNameSuffix
renderscriptTargetApi ×  
targetSdkVersion ×  
testInstrumentationRunner ×  
testPackageName ×  
versionCode ×  
versionName × cf. versionNameSuffix

以上を見てみると、やはり、ビルドタイプは「デバッグ時とリリース時で設定が異なるべきものが設定できる」という位置付けのようです。一方、プロダクトフレーバーでは、minSdkVersionのようにサポートする機種ごとにapkを分けるための仕組みや、フレーバーごとにテスト関連の設定を変更できるような仕組みが用意されていることがわかります。

また、以下の点にも興味を引きました。

  • ProGuard関連や署名関連は、ビルドタイプだけでなく、プロダクトフレーバーでも設定可能。たとえば、有料アプリだけProGuardを有効にしたり、有料アプリと無料アプリで異なる署名をつけることができる。
  • マニフェストに設定するpackageNameversionNameは、ビルドタイプでは接尾辞のみが設定でき、プロダクトフレーバーでは文字列全体のみが設定できる。

まとめ

build.gradle上でカスタマイズ可能な項目について、ビルドタイプとプロダクトフレーバーの違いを列挙してみました。

  • ビルドタイプはデバッグ用(テスト用)とリリース用の違いを設定するために使う
  • その他の違いはプロダクトフレーバーでカスタマイズする

という用途で使い分ければ、カスタマイズしたくなるような項目は大体カバーされているのではないかと思います。

本家ドキュメントの補足として参考にしていただけると嬉しいです。