Ole*_*ryb 2 android proguard kotlin-android-extensions android-9.0-pie
我知道,也有人问过类似的问题,但我想,我的情况不同。请不要删除。
迁移到 API 28 后,我开始收到 NoClassDefFoundError 错误,就像许多其他人一样。我见过其他人遇到过这个问题,因为 Google 已弃用 org.apache 类,这需要更改清单,但我没有在我的项目中使用 apache 类。
使调查变得困难的是,下面的堆栈跟踪中没有自定义类,甚至不清楚没有找到什么类。最糟糕的是,我无法在模拟器或真实设备上重现该错误,只能在 Google Play 商店报告中看到它,该报告显示所有崩溃都发生在 Android 9 设备上。
我有两个问题:
在不相关的情况下,我认为维护较新的 Android 版本变得非常困难,而且它们的支持根本不存在,所以 stackoverflow 是我最后的希望。
java.lang.NoClassDefFoundError:
at com.google.android.a.a.m.d (m.java:266)
at com.google.android.a.a.m.a (m.java:113)
at com.google.android.a.a.g.a (g.java:206)
at com.google.android.a.a.g.a (g.java:166)
at com.google.android.a.a.e$a$2.run (e.java:242)
at android.os.Handler.handleCallback (Handler.java:873)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:214)
at android.os.HandlerThread.run (HandlerThread.java:65)
Caused by: java.lang.ClassNotFoundException:
at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass (ClassLoader.java:379)
at java.lang.ClassLoader.loadClass (ClassLoader.java:312)
at com.google.android.a.a.m.d (m.java:266)
at com.google.android.a.a.m.a (m.java:113)
at com.google.android.a.a.g.a (g.java:206)
at com.google.android.a.a.g.a (g.java:166)
at com.google.android.a.a.e$a$2.run (e.java:242)
at android.os.Handler.handleCallback (Handler.java:873)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:214)
at android.os.HandlerThread.run (HandlerThread.java:65)
Run Code Online (Sandbox Code Playgroud)
下面也是我在这个项目中使用的所有依赖项:
dependencies {
implementation fileTree(include: ['*.aar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:customtabs:28.0.0'
implementation 'com.android.support:animated-vector-drawable:28.0.0'
implementation 'com.android.support:mediarouter-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
implementation 'com.android.support:design:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.google.android.gms:play-services-vision:15.0.1'
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.google.android.gms:play-services-ads:15.0.1'
implementation 'com.google.android.gms:play-services-drive:15.0.1'
implementation 'com.google.android.gms:play-services-auth:15.0.1'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.google.code.gson:gson:2.8.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.google.android.gms:play-services-wearable:15.0.1'
implementation 'com.google.android.gms:play-services-tasks:15.0.1'
implementation files('libs/accessory-v2.5.3.jar')
implementation files('libs/sdk-v1.0.0.jar')
implementation files('libs/lvl.aar')
}
Run Code Online (Sandbox Code Playgroud)
这是一个 Kotlin 项目,Kotlin 版本是 1.3.10
更新: 使用 API 27 重新编译相同的代码,再次将应用发布到 Play 商店,从那以后没有看到任何崩溃,所以它绝对是 API 28 特有的。
谜底解开了。毕竟,它与 org.apache 类有关,我敢肯定,它会给许多迁移到 API 28 的人带来隐藏的问题。
虽然我的项目对 Apache 类没有任何依赖,但谷歌自己的 API(在我的例子中是许可库)确实有这样的依赖。
因此,即使您不直接在您的项目中使用 Apache,您也永远不知道依赖项中有什么,这就是为什么在处理 API 28 时您应该始终在清单的应用程序标记中包含以下行:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
Run Code Online (Sandbox Code Playgroud)
最后,由于 Google Play 商店在提供有意义的堆栈跟踪方面做得很糟糕,我不得不将ACRA代码注入应用程序的测试版代码,并要求用户向我发送崩溃报告。幸运的是,我有一个用户同意帮助解决这个问题。下面是我通过电子邮件得到的。
我对 Android 平台质量的看法随着他们发布的每个新版本而变得更糟。
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/client/utils/URLEncodedUtils;
at com.google.android.vending.licensing.ServerManagedPolicy.decodeExtras(ServerManagedPolicy.java:3)
at com.google.android.vending.licensing.ServerManagedPolicy.processServerResponse(ServerManagedPolicy.java:3)
at com.google.android.vending.licensing.LicenseValidator.handleResponse(LicenseValidator.java:1)
at com.google.android.vending.licensing.LicenseValidator.verify(LicenseValidator.java:37)
at com.google.android.vending.licensing.LicenseChecker$ResultListener$2.run(LicenseChecker.java:4)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.os.HandlerThread.run(HandlerThread.java:65)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.client.utils.URLEncodedUtils" on path: DexPathList[[zip file "/data/app/info.gryb.gacw-buYW6A5hesJP-wfcU6nnVg==/base.apk"],nativeLibraryDirectories=[/data/app/info.gryb.gacw-buYW6A5hesJP-wfcU6nnVg==/lib/arm64, /system/lib64, /system/vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 9 more
java.lang.ClassNotFoundException: Didn't find class "org.apache.http.client.utils.URLEncodedUtils" on path: DexPathList[[zip file "/data/app/info.gryb.gacw-buYW6A5hesJP-wfcU6nnVg==/base.apk"],nativeLibraryDirectories=[/data/app/info.gryb.gacw-buYW6A5hesJP-wfcU6nnVg==/lib/arm64, /system/lib64, /system/vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.google.android.vending.licensing.ServerManagedPolicy.decodeExtras(ServerManagedPolicy.java:3)
at com.google.android.vending.licensing.ServerManagedPolicy.processServerResponse(ServerManagedPolicy.java:3)
at com.google.android.vending.licensing.LicenseValidator.handleResponse(LicenseValidator.java:1)
at com.google.android.vending.licensing.LicenseValidator.verify(LicenseValidator.java:37)
at com.google.android.vending.licensing.LicenseChecker$ResultListener$2.run(LicenseChecker.java:4)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.os.HandlerThread.run(HandlerThread.java:65)
Run Code Online (Sandbox Code Playgroud)