2017-03-03T16:40:46.000+09:00

AndroidのDataBindingはGuavaを含んでいる (あとKotlinとかも)

こんなエラーが吐かれた。

E/UncaughtException: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/databinding/repacked/google/common/collect/ImmutableList;

Android Studioの補完を信頼し切って、間違ったimportしていただけです。が、android.databindingということは期待していたGuavaのImmutableListと全く同じI/FがDataBindingに含まれるということ。

ちょっとだけ調査。
おそらく当該のpackageは以下のcommitから追加されてる。

Diff - 294f39d5404d2c0b0146cabfcd3e589039b164a9^! - platform/frameworks/data-binding - Git at Google

project.tasks.create(name: 'jarJarFile') {
    dependsOn 'proguard'
    dependsOn project.jar
    def inputLibrary = proguardJar
    def outputLibrary = jarJar
    inputs.file(inputLibrary)
    outputs.file(outputLibrary)
    doLast {
        def jarJarLibrary = new File(dataBindingConfig.externalPrebuiltsBase,
                'tools/common/m2/repository/com/googlecode/jarjar/jarjar/1.3/jarjar-1.3.jar').
                getCanonicalPath()
        // in Ant
        ant.taskdef(name: "jarjarIt",
                classname: 'com.tonicsystems.jarjar.JarJarTask',
                classpath: jarJarLibrary)
        // start jarjar task
        ant.jarjarIt(jarfile: outputLibrary) {
            // input is our inputLibrary
            zipfileset(src: inputLibrary)
            // rule to repackage antlr to new package
            rule pattern: 'org.antlr.**', result: 'com.google.repacked.antlr.@1'
            rule pattern: 'com.tunnelvisionlabs.**', result: 'com.google.repacked.tunnelvision.@1'
            rule pattern: 'org.abego.treelayout.**', result: 'com.google.repacked.treelayout.@1'
            // rule to repackage commons
            rule pattern: 'org.apache.**', result: 'com.google.repacked.apache.@1'
            rule pattern: 'kotlin.**', result: 'com.google.repacked.kotlin.@1'
        }
    }
}

ant.jarjarItというタスクがあって、これはjarのパッケージ名を変更したり、複数のjarをまるっとまとめられる。Fatjarみたいな感じ。

Google Code Archive - Long-term storage for Google Code Project Hosting.

ちなみにどういうところでGuavaを使っているのかというとコンパイラ部分。ただしべつにImmutableListなんかを使っているわけではなくって、Lists.newArrayListみたいにコード量を減らす目的みたい。

compiler/src/main/java/android/databinding/tool/expr/IdentifierExpr.java - platform/frameworks/data-binding - Git at Google


ちなみに関係ないんだけど、Javaコード生成部分にはKotlinが使われてた。面白い。

compiler/src/main/kotlin/android/databinding/tool/writer/DataBinderWriter.kt - platform/frameworks/data-binding - Git at Google

なるほど、たしかにJavaコードそのまんまで書くにはちょっとつらそう。


Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング