我的wapp正在被编译并定位为api 27,并使用了较早版本的firebase广告。现在,在更新应用程序并编译并定位api 28并使用每个sdk的最新版本(包括firebase广告(与admob相同),也使用R8而不是proguard进行编译之后,我遇到了很多异常,例如这在Google Play控制台的“崩溃”部分中:
java.lang.NoClassDefFoundError:
at gk.b (gk.java:3)
at gl.a (gl.java:3)
at gn.a (gn.java:18)
at com.google.android.gms.ads.internal.util.ar.a (ar.java:5)
at fo.a (fo.java:19)
at fo.run (fo.java:8)
Caused by: java.lang.ClassNotFoundException:
at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:171)
at java.lang.ClassLoader.loadClass (ClassLoader.java:379)
at ab.loadClass (ab.java:4)
at java.lang.ClassLoader.loadClass (ClassLoader.java:312)
at gk.b (gk.java:3)
at gl.a (gl.java:3)
at gn.a (gn.java:18)
at com.google.android.gms.ads.internal.util.ar.a (ar.java:5)
at fo.a (fo.java:19)
at fo.run (fo.java:8)
我不知道为什么会混淆,因为我上传了映射文件,也许是因为较新的android studio版本使用R8而不是proguard。
某些用户之所以评价不佳,是因为他们看到自应用更新以来的崩溃。我无法在任何设备上使应用程序崩溃。
报告了小米MI 8和OnePlus 5T设备的崩溃,但肯定还会更多。
怎么了?
谢谢
一种解决方案是在build.gardle配置中同时禁用minifyEnabled
(代码收缩,混淆和优化)和shrinkResources
字段。
buildTypes {
release {
minifyEnabled false
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
我认为这是由于minifyEnabled代码缩小导致对类名进行重命名而发生的。
由于删除未使用的资源需要打开未使用的代码收缩功能,因此您也必须禁用rinkeResources。