问题描述
我知道,有人问过类似的问题,但我认为我的情况有所不同.请不要删除.
I know, similar questions have been asked, but I think, my situation is different. Please don't delete.
与其他许多人一样,在迁移到API 28之后,我已经开始收到NoClassDefFoundError错误.我已经看到其他人遇到了这个问题,因为Google已经弃用了org.apache类,这需要更改清单,但是我不在项目中使用apache类.
I've started getting NoClassDefFoundError error after migrating to API 28, just like many other folks. I've seen others experienced this issue because Google has deprecated org.apache classes, which required changing manifest, but I don't use apache classes in my project.
使得调查困难的是,下面的堆栈跟踪中没有自定义类,并且甚至不清楚未找到哪个类.最糟糕的部分是我无法在模拟器或真实设备上重现该错误,并且只能在Google Play商店报告中看到该错误,该报告表明所有崩溃均发生在Android 9设备上.
What makes investigation difficult is that there is no custom classes in the stack trace below, and it's not even clear what class was not found. The worst part of it is that I can't reproduce the bug in an emulator, or on a real device, and could see it only in Google Play Store reports, which showed that all crashes have happened on Android 9 devices.
对此我有两个问题:
- 堆栈跟踪中没有自定义类的事实是否意味着这是Google的内部问题,我无法真正解决?
- 如何更改项目以获取更多信息,例如看看没有找到什么班级?
我认为,保持不相关是非常困难的,维护较新的Android版本变得非常困难,而且根本不存在对它们的支持,因此stackoverflow是我最后的希望.
On unrelated note, I think, maintaining newer Android's versions become very difficult and their support simply doesn't exist, so stackoverflow is my last hope.
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)
下面也是我在该项目中使用的所有依赖项:
Below are also all dependencies that I use in this project:
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')
}
这是一个Kotlin项目,而Kotlin版本是1.3.10
It's a Kotlin project, and Kotlin version is 1.3.10
更新:使用API 27重新编译了相同的代码,再次将应用程序发布到Play商店,此后再也没有看到任何崩溃,因此它肯定是API 28特有的.
Update:Recompiled the same code with API 27, posted the app to Play Store again, and didn't see any crashes since then, so it's definitely specific to API 28.
推荐答案
奥秘得以解决.毕竟,它与org.apache类有关,并且我敢肯定,它将为许多迁移到API 28的人们带来一个隐藏的问题.
The mystery is solved. After all, it was related to org.apache classes and I'm sure, it will create a hidden problem for many folks migrating to API 28.
虽然我的项目对Apache类没有任何依赖关系,但Google自己的API(在我的情况下为许可库)确实具有这种依赖关系.
While my project doesn't have any dependency on Apache classes, Google own API (licensing library in my case) does have such a dependency.
因此,即使您不直接在项目中使用Apache,也永远都不知道依赖项是什么,这就是为什么在处理API 28时,清单的application标记中始终应包含以下行:
So, even if you don't use Apache in your project directly, you never know what's in dependencies and that's why you should always have the below line in your manifest's application tag when deal with API 28:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
最后,由于Google Play商店在提供有意义的堆栈跟踪方面做得很糟糕,因此我不得不注入 ACRA 对该应用程序的Beta版代码进行编码,并要求用户向我发送崩溃报告.幸运的是,我有一位同意帮助的用户.以下是我通过电子邮件获得的信息.
Lastly, since Google Play Store did lousy job in providing a meaningful stack trace, I had to inject ACRA code to the app's beta code and to ask users to send a crash report to me. Fortunately, I had one user who has agreed to help with this. Below is what I've got through email.
随着他们发布的每个新版本,我对Android平台质量的看法都越来越差.
My opinion about quality of Android platform gets worse with every new version they release.
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)
这篇关于迁移到Android API 28后出现NoClassDefFoundError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!