如何避免NoClassDefFoundError:pre-L上的android/os/PersistableBundle? [英] How to avoid a NoClassDefFoundError: android/os/PersistableBundle on pre-L?

查看:61
本文介绍了如何避免NoClassDefFoundError:pre-L上的android/os/PersistableBundle?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆