LoginSignup
3
0

More than 5 years have passed since last update.

DataBinderMapperImplのNoClassDefFoundError

Last updated at Posted at 2018-08-07

Androidの実装でDetaBindingを導入しようとした際の試行錯誤の備忘録。
些細なミスでした。

TL;DR

  1. module側でDataBindingする時でも、module/build.gradleだけではなく、app/build.gradleにもdataBinding.enabled=trueの記載は必要
  2. 公式ドキュメントをよく読もう

    データ バインディングを使うライブラリに依存するアプリ モジュールがある場合は、そのアプリの build.gradle 内でもデータ バイディングの設定をする必要があります。

環境

  • Android Studio 3.1.3

構成

  • app(アプリモジュール)
  • moduel(ライブラリモジュール)

事の成り行き

1. DataBindingを実装してみる

DataBindingが使って見たかったのでググると、build.gradleにdataBinding.enabled=trueを追加すれば良いとある。
実装するのはmodule側なので、module/build.gradleにその通りに追加。

module/build.gradle
android{
  ...
  dataBinding {
    enabled = true
  }
}

Sync Gradleも問題なく完了したので意気揚々とDataBindingを実装して、エミュレーター上で走らせてみる。

2. NoClassDefFoundErrorエラー

エミュレーター上で問題なくアプリが立ち上がったので「よっしゃ行けた!」とDataBindingを実装したページを開くとアプリが落ちた。
エラーログを確認すると

Logcat
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/databinding/DataBinderMapper;

と出ている。なんでや。

3. ググって色々やってみる

同じ症状が出ている人の質問に対する回答に「build.gradleの依存関係にcom.android.databinding:compiler:3.0.1突っ込めば行けたよ」ってあったので、下記のように突っ込んでみる。

module/build.gradle
dependencies {
    compileOnly 'com.android.databinding:compiler:3.1.3'
    annotationProcessor 'com.android.databinding:compiler:3.0.1'
}

駄目でした。
その後も調べては試しを繰り返して時間を浪費。

4. 公式ドキュメントを読む

この辺りでようやく「公式ではなんて書いてあるんだろう」と思い至り、読んでみる。

データ バインディングを使うライブラリに依存するアプリ モジュールがある場合は、そのアプリの build.gradle 内でもデータ バイディングの設定をする必要があります。

はい。
素直に従って、app/build.gradleにも同様にbuild.gradleにdataBinding.enabled=trueを記載。

app/build.gradle
android{
  ...
  dataBinding {
    enabled = true
  }
}
module/build.gradle
android{
  ...
  dataBinding {
    enabled = true
  }
}

アプリを走らせて該当ページを開く。行けた。

まとめ

公式ドキュメントは偉大である。

3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0