こんなエラーが吐かれた。
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
みたいにコード量を減らす目的みたい。
ちなみに関係ないんだけど、Javaコード生成部分にはKotlinが使われてた。面白い。
なるほど、たしかにJavaコードそのまんまで書くにはちょっとつらそう。
Kotlinスタートブック -新しいAndroidプログラミング