techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

JackでDagger2が使えるようになった

先日、JackでDagger2が使えないという記事を書きましたが、なんとJackでもDagger2が使えるようになりました!
Dagger2だけじゃなくannotation processingが使えるようになりましたので、他のツールも動くようになりました。

なぜ動くようになったかというとGoogle I/O 2016にてAndroid Studio 2.2 preview 2の発表と合わせてJackで可能になったという発表がありました。
そこで早速試してみました。

Jack+APTを実行できるようにする

techium.hatenablog.com

こちらの記事のサンプルコードを利用して行いましょう。

今まではaptを実行しようとした場合にはandroid-aptというライブラリを導入しないとできませんでしたが、Android Studio 2.2 preview 2とgradle:2.2.0-alpha2を使うとライブラリを使わずにAndroidStudioだけでaptができるようになりました。
やり方は下記のページに記載があります。
しかし、Googleの下記のやり方では失敗したのでその対応方法についても説明します。

tools.android.com

まず上記のページ通りに変更します。
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が追加されましたががそれが入っていない状態になっています。

github.com

下記のように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がビルドでき実行もできました!

サンプルコード

github.com