はじめに
すでに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.+'
を追加します。
// 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全文
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版
// ...
// 省略
// ...
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で書き換えてみます。
// ...
// 省略
// ...
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レベルも、もっとレベルアップが必要です。頑張ります。