Android Studio の Gradle の備忘録


# 前置き

ビルドやバージョン管理をするのに便利らしい Gradle ですが難しくて本当に便利なのか分かりません。
以前 Ant や Maven を使っていた方々にとっては、とても素晴らしい機能らしいのですが…。

Android Studio でプロジェクトを作ると、Gradle が~~勝手に~~自動的に付いてきます。
どうしても使わせたいみたいですね。

ならばせめて何が書かれているのかくらいは理解したい。
なので Gradle について簡単に調べた事について書き留めて行きます。


# 環境情報

Android studio 2.0
Gradle 2.10

gradle は Android Studio をインストールすると勝手に同梱されてついてきます。

![gradle-path.png](https://qiita-image-store.s3.amazonaws.com/0/112253/ab7590ba-e0cd-165f-efd8-2fd5e52ef60a.png)

# 事前準備

「Start a new Android Studio project」 から新しい Android Project(Empty Activity) を作っておきます。

# Androidアプリプロジェクトとファイルの構成

![project-conf.PNG](https://qiita-image-store.s3.amazonaws.com/0/112253/2d2f28bf-0a15-3132-c379-c71115f24a84.png)


<!-- コメント化
```
MyApplication
├ .gradle/
├ .idea/
├ app/
│	├ build/
│	├ libs/
│	├ src/
│	├ .gitignore
│	├ app.iml
│	├ build.gradle
│	└ proguard-rules.pro
│
├ build/
├ gradle/
├ .gitignore
├ build.gradle
├ gradle.properties
├ gradlew
├ gradlew.bat
├ local.properties
├ MyApplication3.iml
└ settings.gradle
```
-->

Eclipseとは比べ物にならないくらい構成が複雑です。
あと gradle と表示された拡張子(?)ファイルが至る所にあります。


# アプリケーション内の build.gradle

ソースコードをビルドしてアプリケーションを作る時に使われる gradle です。
gradle は色々ありますが基本的にここを変更します。

![app-build.gradle.png](https://qiita-image-store.s3.amazonaws.com/0/112253/43988fe0-c64d-9079-7139-9b2452baa538.png)


中を見るとこんな感じになっています。

```
app/build.gradle

// プラグインの宣言
apply plugin: 'com.android.application'

// androidのビルド設定のメイン
android {
	// コードを コンパイル -> ビルド するのに必要なSDKやbuild-toolのバージョン指定
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

	// マニュフェストエントリ
    defaultConfig {
        applicationId "example.com.myapplication"
        minSdkVersion 19
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

	//ビルド定義
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

// ライブラリ依存関係
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
}
```

各項目の詳細は以下のとおりです。

## プラグインの宣言

Android アプリケーション や ライブラリ をビルドする場合は必ず下記の様に宣言する必要があります。
よくわかりませんが取り合えずおまじないと思っておきましょう。

アプリケーションの場合
`apply plugin: 'com.android.application'`

android ライブラリの場合
`apply plugin: 'com.android.library'`


## androidのビルド設定のメイン

Android Gradle Pluginでは、android {} ブロック内にビルド時の設定などを記述していきます。
コードを コンパイル -> ビルド する時に必要な Android SDK 及び Build-Tools の API Level が指定されています。

```
android {
    //アプリをビルドする際のSDKの設定
    compileSdkVersion 24 		// コンパイルするのに必要(SDK Platform)
    buildToolsVersion "24.0.0"	// ビルドするのに必要(SDK Build-tools)
}
```
SDK Platform のバージョンが分からない場合は `<sdk>/platforms/` のディレクトリを確認してください。
![platform.JPG](https://qiita-image-store.s3.amazonaws.com/0/112253/204debe1-8212-f13e-d2d8-ffbf8c664e3b.jpeg)


SDK Build-tools のバージョンが分からない場合は `<sdk>/build-tools/` のディレクトリを確認してください。
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/112253/caa6c13e-70d2-941c-fdf0-725f9c8496dd.jpeg)

### defaultConfig

Eclipse ADTの場合は、AndroidManifesf.xml に直接記述していましたが、build.gradle に記述しておくことでビルド時に自動で AndroidManifesf.xml に追加(上書き)してくれます。


```
defaultConfig {
    applicationId "example.com.myapplication"	// パッケージ名
    minSdkVersion 19		// アプリを実行するのに必要な最小APIレベル
    targetSdkVersion 22		// アプリの動作を保障しているAPIレベル
    versionCode 1			// 内部バージョン番号として使用する整数(最大値 2100000000)
    versionName "1.0"		// ユーザーに表示するバージョン番号として使用される文字列
}
```

targetSdkVersion の API Level は、デフォルトの画面や動作が指定したバージョンになります。
例を出すとtargetSdkVersion 22 ならば Android 5.1.1( Lollipop ) の画面や動作になります。

### buildTypes

アプリファイル(.apk)を作成するときに必要となる設定値の定義。

「デバッグ用(debug)」と「リリース用(release)」のビルドという感じで、複数のビルドの種類を記述することができます。
自分で新たにビルドの種類を追加することもできます。

```
buildTypes {
    release {
        minifyEnabled false		// コード(apkのサイズ)を縮めるかどうか
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'	// Proguard の設定ファイルを指定します
    }
}
```

ProGuard と言うのは、圧縮、最適化、難読化、事前検証の4つの機能を持ったツールでオプションとして動作させるか指定出来るみたいですね。
Google側は適応を強く勧めている様です。

詳しい内容は、[AndroidでのProGuard 使い方][2]を見るのをお勧めします。

### その他のブロックたち

android {} の中に設定できるブロック( Configuration blocks )はまだまだあるよ。

aaptOptions { }
adbOptions { }
compileOptions { }
dataBinding { }
dexOptions { }
externalNativeBuild { }
jacoco { }
lintOptions { }
packagingOptions { }
productFlavors { }
signingConfigs { }
sourceSets { }
splits { }
testOptions { }

## dependencies

コード上で依存関係にあるライブラリを定義します。
依存関係の種類にはいくつかの種類があります。

```
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])	// libs フォルダ直下の jar ファイルをコンパイル
    testCompile 'junit:junit:4.12'						// プロジェクトのテストコードをコンパイルするのに必要な依存関係(src/test)
    compile 'com.android.support:appcompat-v7:23.3.0'	// プロジェクトのプロダクトコードをコンパイルするのに必要な依存関係(必須)
}
```

# 最後に

とりあえずここまで。
デフォルトのプロジェクトで作られた app.gradle 中身について簡単にまとめました。


この内容をまとめるにあたり以下のエントリーを参考にしました。
[Android studioにおけるbuild.gradleの設定について][1]
ここよりも深い部分(apkを作る際のセキュリティキーのgradle設定とか)に触れられていてとても分かりやすいです。

<!-- リンク -->
[1]: http://qiita.com/kazuhiro1128/items/9279ca432e7a900acdcc
<!-- ProGuardの説明 -->
[2]: http://www.andr0o0id.com/?p=5340
<!-- ProGuardの公式解説 -->
[3]: http://developer.android.com/intl/ja/tools/help/proguard.html