2015-12-16 61 views
3

如果我在我的Android設備上安裝並運行簽名的APK,我得到了此錯誤。如果我只編譯一個應用程序並直接在設備上運行,則不會出現此錯誤。已簽名的apk中的ClassNotFoundException

片段,似乎缺少的是在我的代碼中的項目,而不是在任何外部庫。

我該如何調查該錯誤?我試圖rebuld,乾淨的項目等..我可以不知何故在APK中找到如果在那裏創建缺少的類?

票數是錯誤消息:

E/AndroidRuntime: FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity 

ComponentInfo{qua.com.bix/qua.com.bix.main.MainActivity}: 
android.support.v4.app.q: Unable to instantiate fragment 
qua.com.bix.main.MainLoadingFragment: 
make sure class name exists, is public, and has an empty constructor that is public at Android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295) 
    .... 
    .... 
    Caused by: android.support.v4.app.q: Unable to instantiate fragment qua.com.bix.main.MainLoadingFragment: make sure class name exists, is public, and has an empty constructor that is public 
    .... 
    .... 
    Caused by: java.lang.ClassNotFoundException: Didn't find class "qua.com.bix.main.MainLoadingFragment" on path: /data/app/qua.com.bix-1.apk 
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:64) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
    at android.support.v4.app.o.a(Unknown Source)  
    at android.support.v4.app.o.a(Unknown Source)  

這裏是我的build.gradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 

    defaultConfig { 
     applicationId "qua.com.bix" 
     minSdkVersion 15 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
     multiDexEnabled true 
    } 
    buildTypes { 
     release { 
      minifyEnabled true 
      shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    packagingOptions { 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/NOTICE' 
    } 
    dexOptions{ 
     incremental true 
     javaMaxHeapSize "4g" 
    } 
    useLibrary 'org.apache.http.legacy' 
} 

dependencies { 
    compile 'com.android.support:multidex:1.0.1' 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.1.1' 
    compile 'com.android.support:design:23.1.1' 
    compile 'com.quadriq.qlib:[email protected]' 
    compile 'com.google.code.gson:gson:2.4' 
    compile 'com.google.guava:guava:18.0' 
    compile 'com.google.code.findbugs:jsr305:2.0.2' 
    compile 'com.google.android.gms:play-services:8.3.0' 
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' 
    compile 'com.koushikdutta.ion:ion:2.+' 
    compile 'joda-time:joda-time:2.9.1' 
    compile 'com.github.michaelye.easydialog:easydialog:1.1' 
} 

更新:什麼幫助,現在,被禁用的ProGuard,還加入-dontobfuscateproguard-rules.pro。但是以這種方式做這件事是否是一個好習慣?

的proguard-rules.pro現在是:

-dontobfuscate 
-dontwarn org.apache.lang.** 
-dontwarn com.google.common.** 
-dontwarn org.joda.** 

更新2:皮特回答我的問題。

+0

你可以發佈你的整個progaurd配置文件嗎? – petey

+0

我們需要告訴你的proguard配置,以保持一些類的容易 –

+0

我把它放在更新中..我在那裏排除一些「警告」。這是你要求的文件嗎? – user1908375

回答

3

Proguard混淆你的重要應用程序類。

以下行添加到您的ProGuard配置文件,這樣的ProGuard不會有延伸ActivityApplicationBroadcastReceiverContentProviderPreference,& Fragment(支持和正常的)應用程序的類一塌糊塗。

# Base Android exclusions, required for proper function of various components 
-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.preference.Preference 
-keep public class * extends android.support.v4.app.Fragment 
-keep public class * extends android.app.Fragment 

(如果你的arent使用其中的一些隨意刪除這些行)

,然後刪除此行

-dontobfuscate 

什麼幫助,現在,被禁用的ProGuard,也向proguard-rules.pro添加-dontobfuscate 。但是,以這種方式做到這一點很好嗎?

這只是最好的做法,如果你不關心是否有人反編譯你的應用程序。所以不行。主要是因爲你想在生產/發佈版本上儘可能地完成這樣的任務。特別是如果您有In App Purchasing(IAP)或處理敏感數據。

+1

它幫助!但是更好.. tot告訴proguard忽略這些類,或者完全禁用它嗎? – user1908375

+0

oops。請參閱編輯問題的答案 – petey

+0

非常感謝您的解答! :)併爲我的英語感到抱歉。 – user1908375