Android FATAL EXCEPTION: main 无法初始化 DAOConfig

Posted

技术标签:

【中文标题】Android FATAL EXCEPTION: main 无法初始化 DAOConfig【英文标题】:Android FATAL EXCEPTION: main Could not init DAOConfig 【发布时间】:2021-12-17 16:45:15 【问题描述】:

我的项目在 kotlin 和 java 中,在设置 minifyEnabled false 时可以找到,但在设置 true 时出现错误:

2021-11-03 17:21:33.770 9089-9089/? E/androidRuntime: FATAL EXCEPTION: main
yb.d: Could not init DAOConfig
        at bc.a.<init>(:94)
        at yb.b.a(:44)
        at x2.d.<init>(:56)
        at b3.h.<init>(:62)
        at b3.i.d(:39)
        at b3.i.b(:30)
        at b3.i.c(:9)
        at t8.a.c(:47)
        at b3.d0.b(:58)
        at b3.d0.c(:14)
        at n5.n.b(:31)
        at n5.n.c(:10)
at com.xxx.xxx.login.LoginFragment.B0(:71)
        at androidx.fragment.app.Fragment.e1(:2963)
        at androidx.fragment.app.t.f(:518)
        at androidx.fragment.app.t.m(:282)
        at androidx.fragment.app.m.d0(:2189)
        at androidx.fragment.app.m.e1(:2106)
        at androidx.fragment.app.m.a0(:2002)
        at androidx.fragment.app.m$g.run(:524)
Caused by: java.lang.NoSuchFieldException: TABLENAME
at java.lang.Class.getField

2021-11-03 17:21:33.797 1693-2221/? E/InputDispatcher: channel '8bcfc29 com.xxx.xxx/com.xxx.xxx.activity.AppActivity (server)' ~ Channel is unrecoverably broken and will be disposed!

我搜索了解决方案,基本上改变了proguard-rules.pro 现在:

-keep class org.greenrobot.greendao.***;
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao 
public static java.lang.String TABLENAME;

-keep class **$Properties  *; 
-keep class com.xxx.domain.model.** *; 
-keep class com.xxx.data.dao.** *; 
# If you DO use SQLCipher:
-keep class org.greenrobot.greendao.database.SqlCipherEncryptedHelper  *; 
-keepclassmembers class **$Properties 
    public static <fields>;

# If you do NOT use SQLCipher:
-dontwarn net.sqlcipher.database.**
# If you do NOT use RxJava:
-dontwarn rx.**

这是我的 GreeDao 版本:

implementation 'org.greenrobot:greendao:3.3.0'

项目级别:

dependencies 
        classpath 'com.android.tools.build:gradle:7.0.3'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0'
        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5")
    

我不太确定出了什么问题,在它起作用之前的主要变化主要是添加导航组件。 感谢您的帮助!

编辑: 添加此以忽略可序列化,但仍然没有运气。

-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable 
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();

【问题讨论】:

【参考方案1】:

有点傻,

debug 
     minifyEnabled false
     xxx

开启false后,这条线还在release 块下:

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 无论如何希望这对其他人也有帮助。

【讨论】:

以上是关于Android FATAL EXCEPTION: main 无法初始化 DAOConfig的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 标准列表视图:E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1

FATAL EXCEPTION 的问题:开始执行时 Android 应用程序中的 main

Android Wear 应用程序因 FATAL EXCEPTION 崩溃:IntentService[CalendarQueryService]

E/AndroidRuntime: FATAL EXCEPTION: main [重复]

Android之Fatal Exception: org.greenrobot.greendao.DaoException: Could not init DAOConfig

fatal exception occurred program will exit错误原因之一。