概要
Retrolambdaをプロジェクトに導入してlambda式を使用した場合、Android Lintで以下のようなExceptionが発生しました。
Failed converting ECJ parse tree to Lombok for file /path/to/lambda式使用したファイル
java.lang.UnsupportedOperationException: Unknown ASTNode child: LambdaExpression
ビルド自体は通るのですが、Lintの実行時間にも影響ができるので解決策を調べてみました。
解決方法
解決方法としては、https://github.com/evant/android-retrolambda-lombokを利用します。具体的にはbuild.gradleを以下のように変更します。
buildscript {
repositories {
jcenter()
...
}
dependencies {
classpath 'com.android.tools.build:gradle:<version>'
classpath "me.tatarka:gradle-retrolambda:<version>"
classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
}
// Exclude the version that the android plugin depends on.
configurations.classpath.exclude group: 'com.android.tools.external.lombok'
}
gradle-retrolambdaのissues#96を読んでみたのですが、Android Lintが依存しているlombok.astがJava8の構文に対応していないのが原因のようです(JackをEnableにしても同じ問題が起きる?)。https://github.com/evant/android-retrolambda-lombokはlombok-astをforkしてJava8の構文を追加したもので、それをLintが依存しているものと置き換えています。