gpt4 book ai didi

android - 签名 apk 中的 ClassNotFoundException

转载 作者:太空宇宙 更新时间:2023-11-03 13:17:06 26 4
gpt4 key购买 nike

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

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

我该如何调查该错误?我尝试重建、清理项目等。如果在那里创建了缺失的类,我能以某种方式在 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: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'
}

更新:目前有帮助的是禁用混淆器,同时将 -dontobfuscate 添加到 proguard-rules.pro。但这样做是一种好习惯吗?

proguard-rules.pro 现在是:

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

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

最佳答案

Proguard 混淆了您重要的应用类。

将以下行添加到您的混淆器配置文件中,这样混淆器就不会混淆您的应用程序的扩展ActivityApplicationBroadcastReceiver 的类, ContentProvider, Preference, & 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

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

然后删除这一行

-dontobfuscate

What helped for now, is disabling proguard, also adding -dontobfuscate to proguard-rules.pro. But is it a good practice to do this in that way?

如果您不关心是否有人反编译您的应用程序,这只是最佳实践。所以不行。主要是因为您想在生产/发布版本中尽可能地完成这样的任务。特别是如果您有应用内购买 (IAP) 或处理敏感数据。

关于android - 签名 apk 中的 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34321595/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com