AndroidStudio0.6.1とGroovy2.4-beta-1で、とりあえずGroovyでAndroidアプリを作ってみた。


# はじめに
すでにAndrodStudioとGroovyでAndroidアプリを作る投稿はいくつかありますが(2014年6月17日時点で)、先日Groovy2.4-beta-1がリリースされ、以前よりちょっと簡単に開発を始められるようになったことを確認したので、それを簡単にまとめました。

* あくまで暫定版です。
* バージョンアップ・正式リリースで書き方が大きく変わる可能性が高いです。公式の最新版の情報を確認してください。
* もっと良い書き方、おかしい点ががありましたら、編集リクエストやコメントをしていただけるとありがたいです。

【追記】2014年6月18日(水) gradle-groovy-android-pluginを使う方法に変更。@pside さん、ありがとうございます。

# 動かしてみた
Qiita上でも(2014年6月17日時点で)既に、@epy0n0ff さんが[こちら](
http://qiita.com/epy0n0ff/items/76a18a3e99041bf75e6f)の記事や、@hotchemi さんの[こちら](http://qiita.com/hotchemi/items/b29c70168911b793394b)の記事で、AndroidStudioでGroovyを用いたAndroidアプリ開発の投稿をされていいます。

お二人が上記の投稿をされた時点では、Groovy2.4-beta-1リリースされておらず、SNAPSHOTのGroovyのコードをクローンして来て、ビルドする必要がありました。

その後、Groovy2.4-beta-1がリリースされ、Groovyのコードをクローンしたり、ビルドしなくても、build.gradleを編集するだけでとりあえず動かすごとができるようになりました。
いい方法かはわかりませんが、Android0.6.1とGroovy2.4-beta-1でAndroidアプリを開発する方法を簡単にまとめます。

## PROJECT_ROOT/build.gradleを編集する
【追記】2014年6月18日(水) 追記

buildscriptのrepositoriesに`jcenter`を、そしてdependenciesに`classpath 'me.champeau.gradle:gradle-groovy-android-plugin:0.2.+'`を追加します。

```groovy:PROJECT_ROOT/build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.11.+'
        classpath 'me.champeau.gradle:gradle-groovy-android-plugin:0.2.+'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        mavenCentral()
    }
}
```


## PROJECT_ROOT/app/build.gradleを編集する
[ここ](http://melix.github.io/blog/2014/06/grooid.html)を参考に、PROJECT_ROOT/app/build.gradleを編集します。


### packagingOptionsの追加
まず、次を追加


```groovy:
android {
	// ...
	// 省略
	// ...
    packagingOptions {
        // workaround for http://stackoverflow.com/questions/20673625/android-gradle-plugin-0-7-0-duplicate-files-during-packaging-of-apk
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/groovy-release-info.properties'
    }
}
```

### repositriesの追加

次にrepositriesを追記。([ここ](http://melix.github.io/blog/2014/06/grooid.html)では、mavenLocalも追加してましたが、ローカルでビルドしたGroovy-2.4-SNAPSHOTは使わないためいらないと思います。)

```groovy:
repositories {
    jcenter()
}
```

### dependenciesの追加

次はdependencies。([ここ](http://melix.github.io/blog/2014/06/grooid.html)では、2.4.0-SNAPSHOTを使っていましたが、2.4.0-beta-1を使います。)

```groovy:
dependencies {
	// ...
	// 省略
	// ...
    compile 'org.codehaus.groovy:groovy:2.4.0-beta-1:grooid'
    // the following dependency is necessary if you want JSON support
    compile ('org.codehaus.groovy:groovy-json:2.4.0-beta-1') {
        transitive = false
    }
}
```

### applicationVariantsを編集【削除】

【追記】2014年6月18日(水)に削除しました。
PROJECT_ROOT/build.gradleに【追記】での記述内容により、不要になったためです。
過去の内容が気になった方は、編集履歴からごらん下さい。

## build.gradle全文

以下、PROJECT_ROOT/app/build.gradle全文


```groovy:build.gradle
apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"

    defaultConfig {
        applicationId "com.mrstar.hello_android_groovy"
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    packagingOptions {
        // workaround for http://stackoverflow.com/questions/20673625/android-gradle-plugin-0-7-0-duplicate-files-during-packaging-of-apk
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/groovy-release-info.properties'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'org.codehaus.groovy:groovy:2.4.0-beta-1:grooid'
    // the following dependency is necessary if you want JSON support
    compile ('org.codehaus.groovy:groovy-json:2.4.0-beta-1') {
        transitive = false
    }
}

repositories {
    jcenter()
}
```

# まとめと補足

正しい書き方・良い書き方かは分かりませんが、とりあえずAndroid0.6.1とGroovy2.4-beta-1でAndroidアプリを開発することができました。
おかしい点・もっと良い書き方など何かありましたら、編集リクエスト・コメントをお願いします。

GroovyのソースコードはPROJECT_ROOT/app/src/main/java以下においているけれど、gradle的には、PROJECT_ROOT/app/src/main/groovy以下に置くようだった気もします．．．?

sourceあたりをfileTreeを使って書き換えたり、追加すればいいのでしょうか？

```
source = javaCompile.source + fileTree('src/main/java').include('**/*.groovy')
```

あたりが怪しい気がします。



# [蛇足]せっかくなのでちょっとだけ、Groovyっぽいことをやってみた

蛇足。あまりGroovy経験が多くはありませんが、ちょっとだけそれっぽいGroovyで書いてみます。

## Java版

```java:Javaで簡単なリストのサンプル
// ...
// 省略
// ...

public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        List<String> items = new ArrayList<String>(Arrays.asList("Android", "Java", "Groovy", "Gradle"));

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this, android.R.layout.simple_list_item_1, items);

        setListAdapter(adapter);

        getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String message = ((ArrayAdapter<String>) parent.getAdapter()).getItem(position);
                Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
            }
        });
    }
}

```

## Groovy版
Groovyで書き換えてみます。

```java:Groovyで簡単なListのサンプル
// ...
// 省略
// ...

public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState)

        def items = ["Android", "Java", "Groovy", "Gradle"]
        def adapter = new ArrayAdapter<String>(
                this, android.R.layout.simple_list_item_1, items)

        listAdapter = adapter

        listView.setOnItemClickListener { parent, view, position, id ->
            def message = parent.adapter.getItem(position)
            Toast.makeText(this, message, Toast.LENGTH_LONG).show()
        }
    }
}

```

## 変更点まとめ

変更点は

* `;`(セミコロン)をとりました。
* リストを`[]`で作成。
* defを使いました。
* `getXXX()`を`xxx`で呼び出せるので、`getAdapter`を`adapter`にしました。
* `setXXX(a)`を`xxx = a`で呼び出せるので、`setListAdapter(adapter)`を`listAdapter = adapter`にしました。
* AdapterView.OnItemClickListenerインターフェースの匿名クラスのインスタンス生成をクロージャーで書き換えました。


AndroidレベルもGroovyレベルもGradleレベルもJavaレベルも、もっとレベルアップが必要です。頑張ります。