簡體   English   中英

Android:NoClassDefFoundError 僅在發布版本中

[英]Android: NoClassDefFoundError only on release build

我在Android Studio並嘗試在發布模式下構建我的項目。
在調試模式下一切正常,但在發布模式下出現以下錯誤......

08-26 17:59:05.599  31696-31931/? W/System.err﹕ java.lang.NoClassDefFoundError: a.a.b.l
08-26 17:59:05.599  31696-31931/? W/System.err﹕ at java.lang.Class.classForName(Native Method)
08-26 17:59:05.599  31696-31931/? W/System.err﹕ at java.lang.Class.forName(Class.java:308)
08-26 17:59:05.599  31696-31931/? W/System.err﹕ at java.lang.Class.forName(Class.java:272)
08-26 17:59:05.599  31696-31931/? W/System.err﹕ at com.a.a.a.a(Unknown Source)
08-26 17:59:05.599  31696-31931/? W/System.err﹕ at com.a.a.a.a(Unknown Source)
08-26 17:59:05.599  31696-31931/? W/System.err﹕ at com.a.a.e.b(Unknown Source)
08-26 17:59:05.599  31696-31931/? W/System.err﹕ at com.a.a.e.a(Unknown Source)
08-26 17:59:05.599  31696-31931/? W/System.err﹕ at com.a.e.a.uncaughtException(Unknown Source)
08-26 17:59:05.599  31696-31931/? W/System.err﹕ at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
08-26 17:59:05.599  31696-31931/? W/System.err﹕ at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
08-26 17:59:05.600  31696-31931/? E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
    Process: com.soonoo.mobilecampus, PID: 31696
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.ExceptionInInitializerError
            at a.a.b.l.a(Unknown Source)
            at a.a.b.m.<clinit>(Unknown Source)
            at a.a.b.f.<init>(Unknown Source)
            at a.a.b.e.<init>(Unknown Source)
            at a.a.c.di.b(Unknown Source)
            at a.a.c.di.a(Unknown Source)
            at a.a.c.b.a(Unknown Source)
            at a.a.c.ae.b(Unknown Source)
            at a.a.a.a(Unknown Source)
            at com.soonoo.mobilecampus.mainlist.h.a(Unknown Source)
            at com.soonoo.mobilecampus.mainlist.h.doInBackground(Unknown Source)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.NullPointerException: in == null
            at java.util.Properties.load(Properties.java:246)
            at a.a.b.l.d(Unknown Source)
            at a.a.b.l.<clinit>(Unknown Source)
            at a.a.b.l.a(Unknown Source)
            at a.a.b.m.<clinit>(Unknown Source)
            at a.a.b.f.<init>(Unknown Source)
            at a.a.b.e.<init>(Unknown Source)
            at a.a.c.di.b(Unknown Source)
            at a.a.c.di.a(Unknown Source)
            at a.a.c.b.a(Unknown Source)
            at a.a.c.ae.b(Unknown Source)
            at a.a.a.a(Unknown Source)
            at com.soonoo.mobilecampus.mainlist.h.a(Unknown Source)
            at com.soonoo.mobilecampus.mainlist.h.doInBackground(Unknown Source)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

問題是異常消息不顯示類的名稱,發生錯誤的方法。
我在項目中使用的所有第三方庫都在build.gradle中指定。
我怎樣才能解決這個問題?

問題基本上如下:

buildTypes {
        release {
            **minifyEnabled false**
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

如果您將 minifyEnabled 設置為 false,它應該可以解決您的問題。 如果你想使用 minify 功能,那么你可以在 build.gradle 中添加 progaurd 規則。 例如,對於 Butterknife 庫,您必須添加以下內容:

-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

很高興我能幫助你

在我的情況下,它適用於所有數據庫表,除了在 UI 導航中作為參數專門傳遞的表因此,如果您使用帶有可序列化參數類型的UI 導航作為 roomdb 表之一,請確保您沒有提到類名它在 XML 文件中(因為這將在發布 DEX/縮小過程中更改。)

XML 文件:Navigation.xml 包含

<navigation>
        <fragment> 
            <argument android:name="questionObj" app:argType="roomdb.db.question" /> // removed for Fixing
            <action
            android:id="@+id/action_q1_to_q2">
        </fragment> 
    </navigation>

<argument ..... /> 行作為修復被刪除。

bundle!!.getSerializable("questionObj") as Question?

應該用於傳遞

錯誤很有幫助且准確

W/System.err: Caused by: java.lang.RuntimeException: Exception inflating navigation/navigation line 83
W/System.err: Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: database.db.Question
W/System.err: Caused by: java.lang.ClassNotFoundException: database.db.Question
W/System.err: Caused by: java.lang.ClassNotFoundException: Didn't find class "database.db.Question" on path: DexPathList[[zip file "/data/app/appname-zu2-cBYoT7e345HeXbjQsgtpA==/base.apk"],nativeLibraryDirectories=[/data/app/appname-zu2-cBYoT7e345HeXbjQsgtpA==/lib/arm64, /system/lib64, /product/lib64]]
I/PackageManager.DexOptimizer: Running dexopt (dexoptNeeded=-3) on: /data/app/appname-zu2-cBYoT7e345HeXbjQsgtpA==/base.apk pkg=appname isa=arm64 dexoptFlags=boot_complete,profile_guided,enable_hidden_api_checks targetFilter=speed-prof

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM