はじめに
こんにちは。Android開発を久しぶりにやっているのですが、Data Binding関連のビルドエラーメッセージで解決に時間がかかったので、備忘録として今回はブログを書きたいと思います。
初期設定でのビルドエラーメッセージ
RealmとData Bindingの設定をした簡単なプログラムを実行したところ、Android StudioのMessagesに下記のエラーが発生したとします。この場合、「パッケージcom.re_engines.sample.databindingは存在しません」と表示されていることからData Bindingの設定などに問題があると考えて、Data Binding関連の調査を先ずはしようと考える方が多いのではないでしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 | Information:Gradle tasks [clean, :app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:compileDebugSources, :app:compileDebugAndroidTestSources, :app:compileDebugUnitTestSources] /Users/hiroshihara/Desktop/CompactCalendarView-master/Sample/app/src/main/java/com/re_engines/sample/MainActivity.java Error:(7, 41) エラー: パッケージcom.re_engines.sample.databindingは存在しません Error:(10, 5) エラー: シンボルを見つけられません シンボル: クラス ActivityMainBinding 場所: クラス MainActivity Error:Execution failed for task ':app:compileDebugJavaWithJavac'. > Compilation failed; see the compiler error output for details. Information:BUILD FAILED Information:Total time: 7.025 secs Information:3 errors Information:0 warnings Information:See complete output in console |
ただ、Data Bindingのクラスは自動作成されるため、別の場所でビルドエラーが発生した場合、クラスが作成されずに、上記のエラーとなる場合もあります。そのため、Data Bindingだけの設定などを見直しているだけでは、原因が特定できないことがあります。
詳細なビルドエラーメッセージを出力
上部のメニューの[Preferences]から[Compiler]を選択し、[Command-line Options]に[–debug]を追記し、[OK]を押します。
この設定をした上で再度ビルドすると、一部省略していますが、今度は下記のような詳細エラーが表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | Information:Gradle tasks [clean, :app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:compileDebugSources, :app:compileDebugAndroidTestSources, :app:compileDebugUnitTestSources] Error:14:37:22.776 [ERROR] [system.err] /Users/reengines/Desktop/CompactCalendarView-master/Sample/app/src/main/java/com/re_engines/sample/MainActivity.java:7: エラー: パッケージcom.re_engines.sample.databindingは存在しません 14:37:22.776 [ERROR] [system.err] import com.re_engines.sample.databinding.ActivityMainBinding; 14:37:22.776 [ERROR] [system.err] ^ 14:37:22.777 [ERROR] [system.err] /Users/reengines/Desktop/CompactCalendarView-master/Sample/app/src/main/java/com/re_engines/sample/MainActivity.java:10: エラー: シンボルを見つけられません 14:37:22.777 [ERROR] [system.err] ActivityMainBinding mainBinding; 14:37:22.777 [ERROR] [system.err] ^ 14:37:22.778 [ERROR] [system.err] シンボル: クラス ActivityMainBinding 14:37:22.778 [ERROR] [system.err] 場所: クラス MainActivity ... ... 省略 ... ... 14:37:22.792 [ERROR] [system.err] 注意:writing file com.re_engines.sample.databinding.ActivityMainBinding 14:37:22.792 [ERROR] [system.err] 注意:writing file android.databinding.DynamicUtil 14:37:22.792 [ERROR] [system.err] 注意:wrote intermediate bindable file com.re_engines.sample com.re_engines.sample-br.bin 14:37:22.792 [ERROR] [system.err] 注意:************* Generating BR file com.re_engines.sample. use final: APPLICATION 14:37:22.792 [ERROR] [system.err] 注意:writing file com.re_engines.sample.BR 14:37:22.792 [ERROR] [system.err] 注意:writing file com.android.databinding.library.baseAdapters.BR 14:37:22.792 [ERROR] [system.err] 注意:writing file android.databinding.DataBinderMapper 14:37:22.792 [ERROR] [system.err] 注意:Version 3.1.4 of Realm is now available: http://static.realm.io/downloads/java/latest 14:37:22.792 [ERROR] [system.err] 注意:Processing class BaseModel 14:37:22.793 [ERROR] [system.err] エラー: Class "BaseModel" must contain at least 1 persistable field. 14:37:22.793 [ERROR] [system.err] エラー: Class "BaseModel" must declare a public constructor with no arguments if it contains custom constructors. 14:37:22.812 [ERROR] [system.err] エラー4個 14:37:22.818 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 14:37:22.818 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] FAILURE: Build failed with an exception. 14:37:22.818 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 14:37:22.818 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * What went wrong: 14:37:22.818 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Execution failed for task ':app:compileDebugJavaWithJavac'. 14:37:22.818 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] > Compilation failed; see the compiler error output for details. 14:37:22.818 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 14:37:22.819 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Try: 14:37:22.819 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Run with --stacktrace option to get the stack trace. Information:1 error Information:0 warnings Information:See complete output in console |
上記をみるとData Bindingとは別にRealm関連でBaseModelにおいてエラーが発生していることがわかります。最終的にはこちらを解消することでビルドが成功するようになります。
おまけ
今回はエラーメッセージから諸々修正を進めましたが、最終的には下記のようなRealmObjectの継承の仕方に問題がありました。
1 2 3 4 5 6 | package com.re_engines.sample.model; import io.realm.RealmObject; abstract class BaseModel extends RealmObject { } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package com.re_engines.sample.model; import io.realm.annotations.PrimaryKey; public class User extends BaseModel { @PrimaryKey private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
すべてのRealmのモデルクラスの親クラスとして、BaseModelクラスを作り、そこに共通処理などを実装していこうと考えたのですが、これがRealmの場合はできないことがわかりました。
Userクラスなどが直接RealmObjectを継承する必要があるようです。これは、GitHub上でも議論されているので、今後に期待ですね。
さいごに
ビルドエラーメッセージが表示されていても、それが直接的な原因ではない場合、解決ができずに無駄に悩むことになりますよね。そんな時は、ちょっと冗長なエラーメッセージが出力されますが、Android Studioの設定を変更して、詳細なビルドエラーメッセージを出力させてみてはいかがでしょうか。