JackでDagger2が使えるようになった
先日、JackでDagger2が使えないという記事を書きましたが、なんとJackでもDagger2が使えるようになりました!
Dagger2だけじゃなくannotation processingが使えるようになりましたので、他のツールも動くようになりました。
なぜ動くようになったかというとGoogle I/O 2016にてAndroid Studio 2.2 preview 2の発表と合わせてJackで可能になったという発表がありました。
そこで早速試してみました。
Jack+APTを実行できるようにする
こちらの記事のサンプルコードを利用して行いましょう。
今まではaptを実行しようとした場合にはandroid-aptというライブラリを導入しないとできませんでしたが、Android Studio 2.2 preview 2とgradle:2.2.0-alpha2を使うとライブラリを使わずにAndroidStudioだけでaptができるようになりました。
やり方は下記のページに記載があります。
しかし、Googleの下記のやり方では失敗したのでその対応方法についても説明します。
まず上記のページ通りに変更します。
build.gradleを下記のように変更します。
[build.gradle]
dependencies { classpath 'com.android.tools.build:gradle:2.1.0' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' }
これを下記に変更します。
dependencies { classpath 'com.android.tools.build:gradle:2.2.0-alpha2' }
これでandroid-aptを使わずにAndroidStudioに新しく入ったaptを利用することができます。
次にapp/build.gradleを変更します。
[app/build.gradle]
apply plugin: 'com.android.application' apply plugin: 'android-apt' android { <省略> } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.google.dagger:dagger:2.0.2' apt 'com.google.dagger:dagger-compiler:2.0.2' provided 'org.glassfish:javax.annotation:10.0-b28' }
上記のものを下記に変更します。
apply plugin: 'com.android.application' android { <省略> } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.google.dagger:dagger:2.0.2' annotationProcessor 'com.google.dagger:dagger-compiler:2.0.2' provided 'org.glassfish:javax.annotation:10.0-b28' }
変更点は「apply plugin: 'android-apt'」を削除し、「apt 'com.google.dagger:dagger-compiler:2.0.2'」のaptをannotationProcessorを変更します。
この状態でjackOptionsをtrueにしてビルドすると下記のようなエラーが表示されます。
:app:transformJackWithJackForDebug FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:transformJackWithJackForDebug'. > com.android.jack.ir.JNodeInternalError: java.lang.Exception: java.lang.NoSuchMethodError: com.google.common.collect.FluentIterable.append(Ljava/lang/Iterable;)Lcom/google/common/collect/FluentIterable; * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
エラーを取り除く
内容としてはJackを使ってビルドするときにFluentIterableを使っており、FluentIterableのappendメソッドがないというエラーになります。
これはGoogleのguavaというOSSのjava core libraryの中のクラスがv18.0からappendが追加されましたががそれが入っていない状態になっています。
下記のようにbuild.gradleでguavaをv18.0以上にすることでビルドができるようになります。
[build.gradle]
dependencies { classpath 'com.google.guava:guava:18.0' classpath 'com.android.tools.build:gradle:2.2.0-alpha2' }
これでDagger2がビルドでき実行もできました!