Androidアプリ開発における build.gradle のビルドタイプごと設定やディレクトリ構成についての備忘録


![Androidアプリ開発における build.gradle のビルドタイプごと設定やディレクトリ構成についての備忘録.png](https://qiita-image-store.s3.amazonaws.com/0/41522/9bc8c5ad-b6c6-5211-dd6f-44f464c0a6bf.png "Androidアプリ開発における build.gradle のビルドタイプごと設定やディレクトリ構成についての備忘録.png")

本記事の前段についてはこちら
[iOSエンジニアのAndroidアプリ開発備忘録 - Qiita](http://qiita.com/RyoAbe/private/f44299bfdb470dcebb8f)

# はじめに
本記事は、私がAndroidアプリ開発時に行ったビルドタイプごとの build.gradle や、AndroidManifest.xml の記述内容、ディレクトリ構成 等を備忘録的にまとめたものになります。
誤りやもっと良い方法などあったらご指摘いただけるととてもありがたいです。

# app/build.gradle
- ビルドタイプ、Product Flavor、依存ライブラリ、署名の設定などは本ファイルに記述
- ここで指定したビルドタイプ（× Product Flavor）の数が `Build Variants` となりビルドごとの設定を切り替えられる
- keystore はdebug用、release用の2つ作成（developやstagingではdebug用のものを使用）

```swift:app/build.gradle
// プラグイン
apply plugin: "com.android.application"
    :

android {
    compileSdkVersion 24
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.myapplication" // アプリケーションID
        minSdkVersion 19
        targetSdkVersion 24
        versionCode 1000000 // メジャーバージョンは ×1000000、ミドルバージョンは ×10000、マイナーバージョンは ×100、リビジョンは ×1。何かを参考にした
        versionName "1.0.0"
        multiDexEnabled true // multidex を有効/無効
    }
    // 署名設定
    signingConfigs {
        debug {
            storeFile file("debug.keystore")
            storePassword "password"
            keyAlias "alias"
            keyPassword "password"
        }
        release {
            storeFile file("production.keystore")
            storePassword "password"
            keyAlias "alias"
            keyPassword "password"
        }
    }
    // ビルドタイプ
    buildTypes {
        debug {
            debuggable true // デバッグモード有効。adb コマンドが叩けるようになる
            applicationIdSuffix ".debug" // application_id のサフィックス。これにより同端末にビルドタイプごとにアプリの同梱できる
            versionNameSuffix "-DEBUG" // バージョン名のサフィックス
            resValue "string", "app_name", "Debug My Application" // アプリケーション名を指定。デバッグモードとわかるような名前に変更
            signingConfig signingConfigs.debug // signingConfig で定義したものを指定
        }
        // develop { 必要に応じて }
        // staging { 必要に応じて }
        release {
            debuggable false // デバッグモード無効
            minifyEnabled true // プロガード 有効/無効
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
            shrinkResources true // リソースの圧縮
            zipAlignEnabled true // app の最適化 有効/無効 https://developer.android.com/studio/command-line/zipalign.html
            resValue "string", "app_name", "My Application"
            signingConfig signingConfigs.release
        }
    }
    // Product Flavors
    productFlavors {
        /*
        使ったことがないが、ビルドタイプとは別にアプリ内のモードの切り替えに使用するらしい
        （例えばアプリの 無料版/有料版 など）
        free { }
        pro { }
        これを追加することでビルドモードは buildTypes × productFlavors 個になる。
        （pro-debug, pro-release, free-debug, free-release）
        */
    }
    // ビルドタイプに応じたソースの参照先を指定（後述）
    sourceSets {
        main.java.srcDirs += "src/main/kotlin"
        debug.java.srcDirs += "src/debug/kotlin"
        // staging.java.srcDirs += "src/debug/kotlin"
        // develop.java.srcDirs += "src/develop/kotlin"
        release.java.srcDirs += "src/release/kotlin"
    }
}

dependencies {
    compile fileTree(dir: "libs", include: ["*.jar"])

    // test compile scope（テストビルドの時のみ有効）
    testCompile "junit:junit:X.X.X"

    // debug compile scope（デバッグビルドタイプの時のみ有効）
    debugCompile "com.example.xxx:X.X.X"

    // develop compile scope（開発ビルドタイプの時のみ有効）
    // staging compile scope（Stagingビルドタイプの時のみ有効）

    // release compile scope（デバッグビルドタイプの時のみ有効）
    releaseCompile "com.example.xxx:X.X.X"

    // compile scope（全ビルドタイプで有効）
    compile "com.example.xxx:X.X.X"
        :

    // 内製ライブラリで使用しているライブラリの記述
    compile "com.example.xxx:X.X.X"
        :
}

apply plugin: "com.google.gms.google-services"

repositories {
    mavenCentral()
    // dependencies のリポジトリURLを記述。ライブラリによって記述する必要がある場合がある
}
```

# ディレクトリ
- ビルドタイプごとに Application クラス、google-service.json、AndroidManifest.xml を作成（後述）

```
src
 ├ debug/kotlin
 |  |       └ com/example/myapplication/
 |  |                          └ DebugMyApplication.kt
 |  ├ AndroidManifest.xml
 |  └ google-services.json
 |
 ├ release/kotlin
 |   |       └ com/example/myapplication/
 |   |                          └ ReleaseMyApplication.kt
 |   ├ AndroidManifest.xml
 |   └ google-services.json
 |
 ├ develop/kotlin // 割愛
 |
 ├ staging/kotlin // 割愛
 |
 └ main/kotlin/
    |       └ com/example/myapplication/
    |                          ├ MyApplication.kt
    |                          |
    |                          ├ activities/
    |                          |     ├ XxxActivity.kt
    |                          |           :
    |                          ├ models/
    |                             :  ├ Xxxx.kt
    |                             :        :
    |                             :
    |
    ├ AndroidManifest.xml
    └ google-services.json
```

# ビルドタイプごとの AndroidManifest.xml

### Main
いつものように

```xml:AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.myapplication">

    <!-- Permissions -->

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- Activities -->
        <activity android:name=".MainActivity">

        <!-- Receivers -->
               :
        <!-- Services -->
               :
        <!-- Metadata -->
               :
    </application>


</manifest>
```

### Debug
- `android:name` に個別に作成した Application クラスを指定
- アプリ名の属性には `tools:replace` と指定

```xml:DebugAndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.myapplication">
    <application
        tools:replace="android:name"
        android:name=".DebugMyApplication">
    </application>
</manifest>
```

### Develop, Staging, Release
割愛

# Application クラス

## Main

```kotlin:MyApplication.kt
class MyApplication: Application() {
    override fun onCreate() {
        super.onCreate()
            :
    }

        :
```

## Debug
- MyApplication 継承

```kotlin:DebugMyApplication.kt
class DebugMyApplication: MyApplication() {
    override fun onCreate() {
        super.onCreate()
            :
    }

        :
```

### Develop, Staging, Release
割愛

# まとめ
いろんな記事を参考に思い思いにやってみた結果です。
ご指摘やアドバイスいただけるとありがたいです。

# 疑問
ビルドタイプごとにルートレベルから applicationId を変更する方法がわからない。
`com.example.myapplication` を `net.fuga.hogeapplication` に変更するみたいな

# 参考
- [Configure Build Variants | Android Studio](https://developer.android.com/studio/build/build-variants.html)
- [Shrink Your Code and Resources | Android Studio](https://developer.android.com/studio/build/shrink-code.html)
- [zipalign | Android Studio](https://developer.android.com/studio/command-line/zipalign.html)