如何避免NoClassDefFoundError:pre-L上的android/os/PersistableBundle? [英] How to avoid a NoClassDefFoundError: android/os/PersistableBundle on pre-L?
问题描述
我使用 TinyBus 库在我的应用程序中调度事件.MinSDK是15,编译SDK是23.
I use the TinyBus library to dispatch events in my app. MinSDK is 15, compile SDK is 23.
在21之前的设备上,我面临的问题似乎会影响许多使用反射的应用程序.尝试在基础 Activity
类(从 AppCompatActivity
继承)中在总线上注册后,我得到以下崩溃日志:
On pre-21 devices, I'm facing the issue which seems to affect many apps that use reflection. As soon as I try to register on the bus in my base Activity
class (which inherits from the AppCompatActivity
), I get the following crash log:
E/AndroidRuntime: java.lang.NoClassDefFoundError: android/os/PersistableBundle
E/AndroidRuntime: at java.lang.Class.getDeclaredMethods(Native Method)
E/AndroidRuntime: at java.lang.Class.getPublicMethodsRecursive(Class.java:955)
E/AndroidRuntime: at java.lang.Class.getMethods(Class.java:938)
E/AndroidRuntime: at de.halfbit.tinybus.impl.ObjectsMeta.<init>(ObjectsMeta.java:58)
E/AndroidRuntime: at de.halfbit.tinybus.TinyBus.processQueue(TinyBus.java:346)
E/AndroidRuntime: at de.halfbit.tinybus.TinyBus.register(TinyBus.java:178)
E/AndroidRuntime: at com.package.name.activities.InitializedActivity.onStart(InitializedActivity.java:62)
E/AndroidRuntime: at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1166)
E/AndroidRuntime: at android.app.Activity.performStart(Activity.java:5264)
E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2047)
E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2099)
E/AndroidRuntime: at android.app.ActivityThread.access$600(ActivityThread.java:138)
E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4929)
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
我知道此错误是由dalvik未能初始化在 dex
文件中找不到的类引起的.有很多与此问题相关的信息和问题(因为它也会影响到Otto和其他人),但是到目前为止,我只看到一个解决方法:从应用程序中删除 PersistableBundle
的用法.但是, 我没有在我的代码中的任何地方引用 PersistableBundle
,但是系统显然会引用.
I know that this error is caused by dalvik failing to initialize a class it can't find in the dex
file. There is a lot of info and questions related to this issue (since it also affects Otto and others), but so far I have only seen one fix: remove the usage of PersistableBundle
from the app. However, I do not reference PersistableBundle
anywhere in my code, but the system apparently does.
是否有其他已知的解决方法?
Is there any other known fix to the problem?
推荐答案
好,此问题现已解决.浏览完我所有的代码(应该已经很久了)之后,我发现实际上我有 对 PersistableBundle
的引用.这些位于我让IDE生成的方法,例如 onPostCreate(PersistableBundle bundle)
,并且没有引起注意.用 Bundle
替换所有 PersistableBundle
可以解决此问题.
Well, the issue is resolved now. After going through all of my code (which I should have done ages ago) I found out that I actually had references to the PersistableBundle
. Those were located in methods I let the IDE generate like onPostCreate(PersistableBundle bundle)
and wasn't paying attention to. Replacing all PersistableBundle
with Bundle
fixed the problem.
对于遇到类似问题的人们,我只能建议在使用更新的API时仔细查看生成的内容.
To folks having similar issue I can only suggest looking closely at the generated stuff when using newer API.
这篇关于如何避免NoClassDefFoundError:pre-L上的android/os/PersistableBundle?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!