AndroidコマンドでGradleプロジェクトを作る

## はじめに

最近好きなのは`Gradle`。AndroidツールはGradleをサポートしている。
サクッとプロジェクトを作ってテストアプリとか作れるのはいい。

[IntelliJ IDEA](https://www.jetbrains.com/idea/download/)や[Android Studio](https://developer.android.com/sdk/index.html)から作ったほうが楽だと思うのだが、コマンドからでも作れることをメモしておきたい。それにGradleを理解するのに役に立った。実験的な要素も含んだメモ。

ちなみに自分はIntelliJを使っているのだが、それでプロジェクト作るとマルチプロジェクトになるからIDEから作るのはちょっと好きではないのだ。

- ubuntu 14.04

## Gradleの導入

Wrapperがあるが、Gradleを使うなら自身のPCにインストールしておいて損はない。

### GVMのインストール

様々な方法があるが、自分の場合はバージョン管理も楽だし[GVM](http://gvmtool.net/)から。
サイトにあるインストールスクリプトをコピペで終わり。超簡単。

```sh
$ curl -s get.gvmtool.net | bash
```

### Gradleのインストール

GradleインストールするならGroovyもインストールしておこうじゃないか。
GroovyってのはjavaライクなGradleで使われている言語。

```sh
$ gvm install groovy	# groovyをインストール
$ gvm install gradle	# gradleをインストール
```

## Project作成

Android SDKのパスが通っているものとする。
で、Androidツールコマンドを使ってGradleのAndroidプロジェクトを作成する。

```sh
$ android create project
    -gradle -v 1.1.3	# gradleを使用する (バージョン番号指定する)
	--target 7			# ターゲット番号(`$ android list target`で確認)
	--name hoge			# project name
	--path hoge			# プロジェクトディレクトリ名
	-- package com.caad1229.hoge	# パッケージ名
	--activity MainActivity			# アクティビティ名

# Gitでローカルブランチにコミットしておく。後半にちょっと確認したい部分があるので。
$ cd ./hoge
$ git init; git add -A; git commit -a -m "init";
```

Gradle Android Pluginのバージョン指定は[ここ](http://tools.android.com/tech-docs/new-build-system)から。2015年4月現在、ベータを抜かした最新バージョンは`1.1.3`。
現在も頻繁にバージョンが変わっている模様。

## wrapperでビルド

で、せっかく生成してWrapperによりGradleもはいっているので`gradlew`でビルドしたところエラー orz

```sh
$ cd ./hoge
$ ./gradlew build
    FAILURE: Build failed with an exception.

    * Where:
    Build file '/home/hoge/temp/hoge/build.gradle' line: 9

    * What went wrong:
    A problem occurred evaluating root project 'hoge'.
    > Could not create plugin of type 'AppPlugin'.

    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

    BUILD FAILED

    Total time: 1.703 secs
```

WrapperされたGradleのバージョンを確認してみると、`1.12`のようだ。古い。

```sh
$ cat ./gradle/wrapper/gradle-wrapper.properties
	#Wed Apr 10 15:27:10 PDT 2013
	distributionBase=GRADLE_USER_HOME
	distributionPath=wrapper/dists
	zipStoreBase=GRADLE_USER_HOME
	zipStorePath=wrapper/dists
	distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip
```

## 自分のGradleでビルド

Wrapperを使わずに自分のGradleでビルドする。がこれも失敗する。

```sh
$ gradle build
    FAILURE: Build failed with an exception.

    * Where:
    Build file '/home/sasaki/temp/hoge/build.gradle' line: 17

    * What went wrong:
    A problem occurred evaluating root project 'hoge'.
    > Could not find method runProguard() for arguments [false] on BuildType_Decorated{name=release, debuggable=false, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscriptDebuggable=false, renderscriptOptimLevel=3, applicationIdSuffix=null, versionNameSuffix=null, minifyEnabled=false, zipAlignEnabled=true, signingConfig=null, embedMicroApp=true, mBuildConfigFields={}, mResValues={}, mProguardFiles=[], mConsumerProguardFiles=[], mManifestPlaceholders={}}.

    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

    BUILD FAILED

    Total time: 2.536 secs
```

理由は`runProguard`の名前が`1.0.0`以降変わっているのだ([参考](http://tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0))。
なので以下のように修正する。

```sh
$ vim ./build.gradle
-            runProguard true
+            minifyEnabled true
```

で、再度挑戦すると成功した。

```sh
$ gradle build
    : # 省略
    check
    :build

    BUILD SUCCESSFUL

    Total time: 3.928 secs
```

## 自分のGradleでWrapperしなおす

もし、このプロジェクトを他の人に渡す場合、他の人にもGraleインストールしてくださいという必要がある。が、そんなことしたらGradleのいいところを半分以上捨てているようなもの。環境が変わってもプロジェクト単位で開発環境を保持できる`wrapper`があるのがGraldeのすごい魅力的なところだと思う。

#### Gralde Wrapper

早速wrapperをやってみる。

```sh
$ gradle wrapper
    :wrapper

    BUILD SUCCESSFUL

    Total time: 2.826 secs
```

### Wrapperでビルド

今度は`gradlew`スクリプトでビルド実行すると成功する。

```sh
$ gradle build
    : # 省略
    check
    :build

    BUILD SUCCESSFUL

    Total time: 3.928 secs
```

### なにがどうなったのか

`git`で最初のソースをコミットしているので差分を確認してみる。

```sh
$ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)

    	modified:   build.gradle
    	modified:   gradle/wrapper/gradle-wrapper.jar
    	modified:   gradle/wrapper/gradle-wrapper.properties

    Untracked files:
      (use "git add <file>..." to include in what will be committed)

    	.gradle/
    	build/

    no changes added to commit (use "git add" and/or "git commit -a")
```

注目したいのは`wrapper`の中身が変わっていること。`diff`で確認。

```sh
$ git diff gradle/wrapper/gradle-wrapper.properties
        :   # 省略
    -distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip
    +distributionUrl=https\://services.gradle.org/distributions/gradle-2.3-bin.zip
```

gradleのバージョンが変わっている。これで他の人が他の環境で`gradlew`を実行したら自分と同じ`2.3`を使ってビルドしてくれるはず。


##おしまい

すごい初歩的なことだけど、こういったこと確認して納得できると楽しい。