カテゴリー: Android

Android Studioでエラーログを詳細表示する

はじめに

こんにちは。Android開発を久しぶりにやっているのですが、Data Binding関連のビルドエラーメッセージで解決に時間がかかったので、備忘録として今回はブログを書きたいと思います。

初期設定でのビルドエラーメッセージ

RealmとData Bindingの設定をした簡単なプログラムを実行したところ、Android StudioのMessagesに下記のエラーが発生したとします。この場合、「パッケージcom.re_engines.sample.databindingは存在しません」と表示されていることからData Bindingの設定などに問題があると考えて、Data Binding関連の調査を先ずはしようと考える方が多いのではないでしょうか。

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]を押します。

この設定をした上で再度ビルドすると、一部省略していますが、今度は下記のような詳細エラーが表示されます。

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の継承の仕方に問題がありました。

 

package com.re_engines.sample.model;

import io.realm.RealmObject;

abstract class BaseModel extends RealmObject {
}
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の設定を変更して、詳細なビルドエラーメッセージを出力させてみてはいかがでしょうか。

おすすめ書籍

    

原弘

twitter: @hir_hara

シェア
執筆者:
原弘
タグ: Android

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前