LIFULL Creators Blog

「株式会社LIFULL(ライフル)」の社員によるブログです。

Build Variants について

こんにちは。菊地と申します。

今回は AndroidStudio で導入された Build Variants という仕組みについてです。

AndroidStudio がリリースされてだいぶ経ちますので、今更な感じはしなくもないですが、意外と知らない人も多いかな?と思ったのでまとめてみました。

はじめに

AndroidStudio では既存のビルドシステムである Ant に代わって、 Gradle が採用されています。ビルドの設定は build.gradle というファイルに記述していきます。 build.gradle に記述できる内容は多岐に渡り、様々なことが可能となっています。

例えば

  • debug ビルドと release ビルドで APK を区別したい!
  • AndroidManifext.xml に記述する permissionrelease ビルドには記述したくない!
  • Google Maps Android API v2API Keydebugrelease で切り替えたい!
  • 同じソースコードから広告あり版と広告なしのアプリをビルドしたい!

こんなことができたらいいと思ったことはありませんか

これらは Build Variant を使うことで解決することができます。

Build Variants とは?

公式によると

Build Type + Product Flavor = Build Variant

Build TypeProduct Flavor ってなに???となりますよね。

そこで、 Build Variants を理解するために必要な Build TypeProduct Flavor についても理解する必要があるため、簡単な例とともに説明します。

Build Types

Build Types はビルドの種類のことです。 ビルドの種類毎にプロパティを設定することで、個別に設定を反映することができます。

デフォルトでは自動的に debugrelease という2つのバージョンをビルドします。 (今回は説明のために debugrelease を記述しています)

android {
  ...

  defaultConfig {
    ...
  }

  buildTypes {
    debug {
      ...
      packageNameSuffix ".debug"
    }
    release {
      ...
    }
  }
}

buildTypes の中に debugrelease の2種類が書かれています。 debug に対して packageNameSuffix ".debug" を設定しました。

packageNameSuffixpackageName の末尾に指定文字列を追記するものになります。

こうすることで、 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 毎にビルド対象となるソースコードを分けることもできます。

  • buildTypedebug のとき

src/debug が存在する場合は配下にあるソースコードもビルド対象

  • buildTyperelease のとき 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 毎にビルド対象となるソースコードを分けることもできます。

  • productFlavordevelopment のとき

src/development が存在する場合は配下にあるソースコードもビルド対象

  • productFlavorproduction のとき src/production が存在する場合は配下にあるソースコードもビルド対象

Build Variants

BuildTypesProductFlavors について、どういったものかがわかったところで、本題である Build Variants についてもみてみます。

Build Type + Product Flavor = Build Variant

Build Variant は Build TypeProduct 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 v2API Key などを src/debug/AndroidManifest.xmlsrc/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 に記述する permissionrelease ビルドには記述したくない!

  • Build Type を使って src/debug/AndroidManifest.xml にだけ permission を追記する

Google Maps Android API v2API Keydebugrelease で切り替えたい!

  • Build Type を使って src/debug/AndroidManifest.xmldebug key, src/release/AndroidManifest.xmlrelease key を設定する

同じソースコードから広告あり版と広告なしのアプリをビルドしたい!

  • Product Flavor を使って ソースコードをわけたりライブラリの依存関係を設定する

おまけ

Google Play Developer ConsoleAPK をアップロードする際にデバッグ可能な APK をアップロードしました。」と言われた!

  • Build Variants の値が Debug になっていないかを確認してください。

Build Variants ってどこでみれるの?

  • AndroidStudioView > Tool Windows > Build Variants からみれます。
Module Build Variant
next debug