AndroidStudioでGradleを使う際のメモ


## 追記 2014-12-24
これを書いた時のAndroid Studioのバージョンを書いていなかったので追記
Android Studio 0.8.9
Gradle Plugin 0.12.2

また、Android Studioが1.0が公開され、それに伴っていくつかGradleのビルドプロパティが変更になっています。
runProguardがminifyEnabledになったりしているので注意。
詳細は以下のリンクを参照

Migrating Gradle Projects to version 1.0.0 – Android Tools Project Site
http://tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0

##前置き
ちょいちょいAndroidアプリの開発を始めて、幾度と無くGradleでハマったのでアバウトなところをメモ。
Gradle自体よりもAndroid Studioよりなので注意。


## Androidアプリプロジェクトとファイルの構成
Android Studioでプロジェクトを作成すると、以下の様なGradle関係のファイルが作成される。
この中の太文字のファイルについて、それらの役割と記述の意味について簡単に解説する。

project root
-app
--libs
--<b>build.gradle</b>
-gradle
--wrapper
-modules
--module
---build.gradle
-<b>build.gradle</b>
-<b>settings.gradle</b>


## project root直下のbuild.gradle
プロジェクト名で表記されるbuild.gradle
プロジェクト全体での共通するビルド設定を記述する

### ビルドスクリプトでの依存関係の記述

ビルドスクリプトで外部ライブラリを使いたい場合は、そのライブラリをスクリプトのクラスパスに追加する必要がある。
これは`buildscript`中で依存関係を記述する`dependencies`で行う。
ここに使用するライブラリやバージョンを記述する事で、ビルド時に必要なライブラリを自動的にDLする。

以下がそのサンプル

```
dependencies {
		  classpath 'com.android.tools.build:gradle:0.12.+'
		  classpath 'org.robolectric:robolectric-gradle-plugin:0.11.+'
	}
```


また、ここで記述した外部ライブラリは`repositories`でDL先を指定できる。

```
repositories {
		  mavenCentral()
	}
```
見ての通り、これは`dependencies`で宣言した2つのライブラリを、Mavenのセントラルから拾ってくる。

以下はサンプルのスクリプト全体

``` 
buildscript { 
	repositories {
	//Mavenセントラルから拾ってくる
		  mavenCentral()
	}
	dependencies {
		  classpath 'com.android.tools.build:gradle:0.12.+'
		  classpath 'org.robolectric:robolectric-gradle-plugin:0.11.+'
	}
}
allprojects {
	repositories {
		  mavenCentral()
	}
 } 
```

また、Gradleではライブラリのバージョンを記述する際に、

```
classpath 'com.android.tools.build:gradle:0.12.+'
```

のように「＋」を用いて使用するバージョンを固定しない事が出来る。
だが、Android GradleプラグインとAndroid SDK、Gradleのバージョンの関係がシビアで、何もしていないのにビルドに失敗するといった現象が起きるらしい。
その原因がこの曖昧なバージョン指定によるものらしいので、むしろ固定的に宣言したほうが無難との意見もある。

###`allproject`について
このサンプルでは設定していないが、各種プロジェクトで分けたい場合は、`project(':<project name>') `を付けて設定することも可能。
本来ならプロジェクト毎のbuild.gradleに書くべき。
なのだけど、Gitのサブモジュールとしてプロジェクトを追加していて、そちらの編集を行いたくない場合になどに使う。


## settings.gradle

ビルド対象となるプロジェクトの基本設定を行う。
Androidでは主にプロジェクト全体で必要なサブプロジェクトを記述。

外部ライブラリを使用する場合に、適当なディレクトリに配置したあと、そのディレクトリを`include`することで使えるようになる。
たとえばvolleyをmodules/volleyみたいな感じで引っ張ってきたとすれば、

```
include ':app',':modules:volley'
```

とする。



##アプリケーション内のbuild.gradle
appと表記される
アプリケーション固有の設定を行う

幾つかのブロックに分かれているので、それぞれにどういった内容を記述するかを簡単に書く。
基本的にこれらのブロックに記述の順序は無いが、signingConfigブロックとbuildTypesブロックだけは例外で、signingConfigブロックを先に記述する必要がある。


- androidブロック(Android DSLとも)
 - defaultConfigブロック
 - signingConfigブロック
 - buildTypeブロック
 - productFlavorsブロック
- dependenciesブロック

#### androidブロック(Android DSL)
compileSdkVersionやbuildToolsVsersionの記述
この中に他のブロックが含まれる

#### defaultConfigブロック
マニュフェストエントリなどを記述
プロダクトフレーバーの一種
ここで設定した項目は、Android StudioのProject Structureダイアログ(Flavorsタブ)に表示される
Project Structureからも直接ビルドスクリプトを編集できる

####  signingConfigブロック
署名付きAPKファイルを生成する際に使用する
このブロック内にreleaseConfigといったコンフィグを作成し、使用するキーストアや鍵の設定を行う
<b>パスワードなどは直接記述しないこと</b>
環境変数からキーストアの情報を参照する場合は次のようにする。

```
System.getenv("KEYS")
```

#### buildTypeブロック
Debug版やRelease版など、複数のバージョンをビルドする際に使用する
デフォルトでdebugとreleaseが用意されている
もちろん、任意のビルドタイプを追加することが可能

#### productFlavorsブロック
buildTypeと同じようでちょっと違う。
有料版と無料版や同じアプリの別デバイス対応など、同じプロジェクトから複数のアプリをビルドする際に使用する
また、buildType同様、使用するソースセットや依存関係の記述が可能
buildTypeとproductFlavorの組合せには、ビルドバリアント(build variant)と呼ばれる(Android Studioに表示されているアレ)


#### dependenciesブロック
依存関係の記述を行う


###プラグインの宣言 
`apply plugin` でAndroidプラグインの宣言を行う。

アプリケーションに対する設定

```
apply plugin: 'com.android.application'
```
Androidのライブラリプロジェクトに対しては

```
apply plugin: 'com.android.library'
```
になる。
注意点としては、AndroidプラグインとJavaプラグインは共存できない。
このため、Javaプラグインと依存関係にあるプラグインの利用もできないので注意されたし。

以下はスクリプト全体のサンプル抜粋

```
apply plugin: 'android'
//AndroidでGradleを使うときの記述。最近フルパスで書けって言われる
//com.android.application

//androidのビルド設定のメイン
android {
	//signingConfigsブロック
	signingConfigs {
		release_config {
			keyPassword System.getenv("KEYS")
		}
	}
	//アプリをビルドするSDKとかその辺りの設定
	compileSdkVersion 20
	buildToolsVersion '20'
	defaultConfig {
		  minSdkVersion 10 //インスコ出来る最小
		  targetSdkVersion 20 //インスコ対象端末
		//アプリのバージョン識別子
		//これを上げないとGoogle PlayでVerUP出来ない  
		versionCode 1 
		versionName '1.0'
	}

	//ビルドタイプブロック
	//ReleaseとDebugでそれぞれのタスクとか書ける
	buildTypes {
		  release {
				//難読化のProGuard設定
				//ProGuardファイルは難読化の除外設定とかを記述する
				runProguard true
				proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
				signingConfig signingConfigs.release_config
		  }
		debug{
				runProguard false
		}
	}
	//プロダクトフレーバーブロック
    productFlavors {
		//ステージングとリリースで切り替える
        staging {
            applicationId "sample.test.applicationname.staging"
        }
        product {
            applicationId "sample.test.applicationname"
        }
    }

}
//依存関係
dependencies {
	repositories {
		  mavenCentral()
	}
	//外部ライブラリ関係
	//lib配下のjar郡
	compile fileTree(dir: 'libs', include: ['*.jar'])
	//サブモジュールとして追加した連中
	compile project(':modules:volley')

	androidTestCompile 'com.google.dexmaker:dexmaker:1.1'
	//external に追加するやつら
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.android.support:appcompat-v7:20.0.0'
} 
```
それぞれの意味は中身に記載


## あとがき
だいぶ長くなったのでこのへんで。
もっとGradleよりだとか、実用的な話は別に上げるかもしれません。


## その他、参考になったサイト
- 第5回　Android StudioとGradle［前編］：Android Studio最速入門～効率的にコーディングするための使い方｜gihyo.jp … 技術評論社 
http://gihyo.jp/dev/serial/01/android_studio/0005

- AndroidStudioのbuild.gradle、setting.gradleについて - Qiita 
http://qiita.com/lastcat_/items/ba7510f0c25cfdfd325a

- 意外とつまづく、Android Studioでサンプルを開く - Qiita 
http://qiita.com/dokubeko/items/d3f1bdf07c2c1dbd9835

- 第 4 回・新 IDE : Android Studio を使ってみよう！-Part2- | ピックアップ | ギャップロ 
http://www.gaprot.jp/pickup/android-ide/vol4/

- Tips : Android Studio でGradleビルド - [séns] 
http://tomoyukim.hatenablog.com/entry/2014/07/10/101227

など