Android 已签名apk中的ClassNotFoundException

Android 已签名apk中的ClassNotFoundException,android,android-studio,android-gradle-plugin,Android,Android Studio,Android Gradle Plugin,如果我在我的android设备上安装并运行签名的APK,就会出现这个错误。若我只是编译一个应用程序并直接在设备上运行,则不会出现此错误 似乎缺少的片段在我的项目代码中,而不是在任何外部库中 我怎样才能调查那个错误呢?我试图重新反驳、清理项目等。。如果在APK中创建了缺少的类,我是否可以在APK中找到它们 hier是错误消息: E/AndroidRuntime: FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start ac

如果我在我的android设备上安装并运行签名的APK,就会出现这个错误。若我只是编译一个应用程序并直接在设备上运行,则不会出现此错误

似乎缺少的片段在我的项目代码中,而不是在任何外部库中

我怎样才能调查那个错误呢?我试图重新反驳、清理项目等。。如果在APK中创建了缺少的类,我是否可以在APK中找到它们

hier是错误消息:

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:qlib@aar'
    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,并将
-dontobfuscate
添加到
proguard rules.pro
。但这样做是一种好的做法吗

proguard-rules.pro现在是:

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

更新2:petey回答了我的问题。

Proguard正在混淆您的重要应用程序类

将以下行添加到proguard配置文件中,以便proguard不会干扰扩展
活动
应用程序
广播接收器
内容提供者
首选项
,&
片段
(支持和正常)的应用程序类

(如果您不使用其中一些,请随意删除这些行)

然后拆下这条线

-dontobfuscate
现在有帮助的是禁用proguard,同时添加-dontobfuscate 转到proguard-rules.pro。但这样做是一种好的做法吗 路


只有当您不关心是否有人反编译您的应用程序时,这才是最佳实践。所以,没有。主要是因为您希望在生产/发布版本中尽可能地使这样的任务变得困难。特别是如果你有应用程序内购买(IAP)或处理敏感数据。

你能发布你的整个progaurd配置文件吗?我们需要告诉你的proguard配置,以方便某些类的使用。我会将其更新。。我排除了一些“警告”。这是你要的文件吗?很有用!但是更好。。告诉proguard忽略那个类,或者完全禁用它?糟糕。请查看编辑部分以获得问题的答案(非常感谢您的解释!)对不起,我的英语不好。在使用Jetpack的首选项设置时,我遇到了与OP(未找到类名)类似的问题。如本评论所述,如果为重要类添加了-keep,请检查proguard规则。立即修复了严重的碰撞。。
-dontobfuscate