Android Studio 1.1で変わった

Android Studioがすでに先週にアップデートされていたみたいですが気がつくのが遅れました。

今回のアップデートで地味に嬉しいのはOSX版の利用JDKが、従来の「1.6*」だけでなく「1.7+」も加わったこと。Apple配布のJDK1.6がOSと密着してたうえにYosemiteからは外されるなどの紆余曲折がなされた結果様々なところでコンフリクトしてしまいストレスだったので私は1.6をインストールせずにOracle配布の1.7が常用だったため、対応していないAndroid Studio 1.0ではアプリケーションパッケージを開いてplist.infoを「1.6*」から「1.6+」と一文字書き換えて使ってました。特に手元では問題なく動いてましたが、提供側のGoogleがそうしない理由はなんかあるのだろうと思っていたので、対応バージョンが広がってトリッキーなことをしなくても動くのは嬉しい。

さらにはリリースノートで「Improved unit testing support! 」と一番頭で言うように、ユニットテストの操作がIDEから行い易いようになりました。これまではまあ大変な苦労をしていたものです。早速Robolectricの環境を移行してみてみたら、たくさんハマりましたが、きちんと動くと感動的な様子を見せてくれました(大げさかな?)。

f:id:masataka_k:20150228050359p:plain

コンソール起動に変わってIDEから起動できるようになったために、テストでもインクリメンタルデバッグが手軽にできる。IDEでブレイクポイント貼って止められるようになったのが素敵。無駄にログ書き出したりしなくてもよくなるので捗る。

Unit testing support - Android Tools Project Site

設定方法は1.0から1.1で変わってるところもあるので、上記見ながら直していきました。注意点は以下かな。

  • 1.0のプロジェクト生成ウィザードで「androidTest」というフォルダが標準的につくられていたのを1.1では「test」にリネーム
  • 続いてGradleスクリプトのdependenciesクロージャに書いた、androidTestCompileを全部testCompileに書き直して上と合わせる
  • 上記リンク先ドキュメント中の「3.Enable the unit testing feature in Settings > Gradle > Experimental.」というのは、メニューの”Android Studio" > "Preferences..."で出てくる大きな設定ダイアログの左項目から"▼Gradle" > "Experimental"です(OSX版での表記。他OS版はちがうかもしれない)。これ見つけるのに時間食った。
  • 上記リンク先ドキュメントに他にも書かれてることをきちんとなぞる

その上でもRobolectricは動かない。追加で以下のブログの言うとおりにするとRobolectricも動く。現時点でおそらくウソの無い良記事です。

Android App Development: Android Studio 1.1.0 (Beta 4) and Robolectric 2.4

でも、書かれているとおりに@Config(emulateSdk = 18)を書き込むところまでやって、めんどくさくなっちゃった。プロジェクト中のリソースを読みだすところを対策していないのでActivityをガッツリとテストするには至ってません。まあ、たぶんここ数日のうちに世界のどっかで誰かがスマートに解決するでしょう。アプリ本体とそのテストを書くのは私にとっても大事なんだけど、それの動かし方の発明&発見は他力本願です。

今日時点までで動いたGradleファイルは以下のとおり。前にはあったRobolectricプラグイン導入&設定など一切がバッサリ無くなりました。AndroidのApplicationを利用するところまでは大丈夫ですがActivityを用いるところから先は前述通りにダルくなってしまったので、新たな問題があるかもしれません。いや、たぶんあるな。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.1.0'
    }
}
allprojects {
    repositories {
        jcenter()
    }
}
// ここまでプロジェクト、以下はモジュール
apply plugin: 'com.android.application'
android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 18
        versionCode 1
        versionName "1.0"
        applicationId "com.glabio.hello"
    }
}
dependencies {
    testCompile 'junit:junit:4.12'
    testCompile 'org.robolectric:robolectric:2.4'
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'org.jsoup:jsoup:1.8.1'
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'com.squareup.picasso:picasso:2.4.0'
    compile 'com.jakewharton:butterknife:6.0.0'
    compile 'de.greenrobot:eventbus:2.4.0'
}