Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

はじめに

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

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

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

動かしてみた

Qiita上でも(2014年6月17日時点で)既に、@epy0n0ff さんがこちらの記事や、@hotchemi さんのこちらの記事で、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.+'を追加します。

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を編集する

ここを参考に、PROJECT_ROOT/app/build.gradleを編集します。

packagingOptionsの追加

まず、次を追加

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を追記。(ここでは、mavenLocalも追加してましたが、ローカルでビルドしたGroovy-2.4-SNAPSHOTは使わないためいらないと思います。)

repositories {
    jcenter()
}

dependenciesの追加

次はdependencies。(ここでは、2.4.0-SNAPSHOTを使っていましたが、2.4.0-beta-1を使います。)

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全文

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で簡単なリストのサンプル
// ...
// 省略
// ...

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で書き換えてみます。

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で呼び出せるので、getAdapteradapterにしました。
  • setXXX(a)xxx = aで呼び出せるので、setListAdapter(adapter)listAdapter = adapterにしました。
  • AdapterView.OnItemClickListenerインターフェースの匿名クラスのインスタンス生成をクロージャーで書き換えました。

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

RyotaMurohoshi
プログラミングが大好きで、 C#が大好きで、 .NETが大好きで、 LINQが大好きで、 JVM言語が大好きで、 ゲームで遊ぶことが大好きで、 ゲーム開発が大好きで、 頑張るのが大好きで、 Unityが大好きだったから...!
http://mrstar-memo.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした