読者です 読者をやめる 読者になる 読者になる

sumioの技術メモ

Androidについての記事が多くなると思います。

Androidのテスト実行も含めてEclipseとGradleを共存させてみる

Androidの新しいビルドシステムで使われているgradleのプラグインは、同じ機能を持つけど少しだけソースが異なるアプリ(フレーバー)を一度にビルド・テストできるなど、Eclipse+ADTやantには無かった素晴しい機能を持っています。

ただ、その機能を享受するためには、従来のAndroid開発とはかけ離れたディレクトリ構成にしなければならず、Eclipse+ADTで開発をしつつ、gradleも使ってみるためには工夫が必要です。

アプリケーションの開発に限って言えば、Eclipse+ADTと共存する方法は、本家のドキュメントや、日経ソフトウェア2013年6月号の「特集4  Androidに新ビルド ・ ツール現る」などに載っているのですが、テストも共存させるための情報は見付けられませんでした。

後者の記事をヒントに、色々と試行錯誤した結果、うまく行く方法を見付けたので、紹介したいと思います。

Eclipseでプロジェクトを作る

まず、Eclipseのウィザードで、アプリケーションプロジェクトと、そのアプリケーションに対するテストプロジェクトを作ります。こんな感じになると思います。
f:id:sumio_tym:20130623220104p:plain

ここでは、アプリケーションプロジェクトの名前を「MyApplication」に、テストプロジェクトの名前を「MyApplicationTest」にしてみました。

もちろん、既に開発中のプロジェクトを利用することもできます。その時は「MyApplication」「MyApplicationTest」を、実際のプロジェクト名に読み替えてください。

作ったら、とりあえずワークスペースから削除してしまいます(ファイルは削除してはいけません)。

ディレクトリ構成をgradle対応にする

適当な場所に

MyApplicationGradle/src

ディレクトリを作成してから、今作成したsrcディレクトリの下に、Eclipseで作成した2つのプロジェクトをコピーします。
この状態で、アプリケーションプロジェクトのディレクトリ名を「main」に、テストプロジェクトのディレクトリ名を「instrumentTest」に変更します。

f:id:sumio_tym:20130623220747p:plain

ここまで出来たら、srcディレクトリ配下をEclipseでインポートしてください。MyApplicationプロジェクトとMyApplicationTestプロジェクトが復活したはずです。これで、Eclipse側ではいつも通り開発することができます。もちろんテスト結果もEcliseのGUIで確認できます。

f:id:sumio_tym:20130623223500p:plain

build.gradleを作る

MyApplicationGradleディレクトリの直下に、以下のようなbuild.graldeファイルを作って保存します。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4.2'
    }
}
apply plugin: 'android'

android {
    compileSdkVersion 17
    buildToolsVersion "17.0"
}

android.sourceSets.each {
    it.java.srcDirs = [ "src/${it.name}/src" ]
}

これで、gradleでもビルドすることができるようになりました。以下のコマンドで、アプリケーションのビルドとテストを実行できます。複数個の端末が接続されている場合は、全端末でテストが実行されますのでとても便利です。

gradle connectedCheck

なお、テストの実行結果は以下のディレクトリにHTMLとして保存されます。

build/reports/instrumentTests/connected/

まとめと課題

この方法を使えば、少なくとも「main」と「instrumentTest」のソースセットについては、Eclipseで開発とテストを継続することができそうです。

もちろん、フレーバーを追加しはじめると色々と課題がでてきますが、上記構成はAndroid Studioへもそのままインポートできますので、別のフレーバーについて開発する時だけはAndroidStudioを使う、というのも手かもしれません。

しかしながら、Eclipseからはフレーバーを認識しませんので、「main」や「instrumentTest」のソースセットだけでコンパイルエラーが出ないように注意する必要があります。たとえば、フレーバーごとに差し替えたいクラスが有る場合は「片方のフレーバーだけlinked sourceとしてEclipseに登録しておく」という手が使えそうです。

ただ、まだ試していないことも多いので、どこまでこの構成で耐えられるのかは分かりません。たとえば、

  • リソースをフレーバーごとに変えたい場合
  • マニフェストをフレーバーごとに変えたい場合

など、です。これから色々なパターンを試してみたいと思います。

追記

上記build.gradleの末尾に、以下のようなコードを追加することで、プロジェクト名を変更しなくても良いことが分かりました。コメント下さった id:kimukou_26 さん、どうもありがとうございました。

// 'MyApplication' や 'MyApplicationTest' は正しいディレクトリ名にしてください。
[main:'MyApplication', instrumentTest:'MyApplicationTest'].each { key, value ->
    android.sourceSets[key].setRoot("src/${value}")
}