如何避免java上的java.lang.NoClassDefFoundError:android / os / PersistableBundle?

时间:2015-12-04 10:04:22

标签: java android android-reflection

我使用TinyBus库在我的应用中发送事件。 MinSDK是15,编译SDK是23.

在21之前的设备上,我面临的问题似乎影响了许多使用反射的应用。一旦我尝试在我的基础Activity类(继承自AppCompatActivity)的总线上注册,我就会收到以下崩溃日志:

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,但系统显然会这样做。

还有其他已知问题的解决方法吗?

2 个答案:

答案 0 :(得分:6)

嗯,问题现在已经解决了。在完成我的所有代码(我应该在很久以前完成)之后,我发现我实际上已经引用了PersistableBundle。那些位于我让IDE生成的方法onPostCreate(PersistableBundle bundle)并且没有注意到的方法中。用PersistableBundle替换所有Bundle解决了问题。

对于有类似问题的人,我只能建议在使用较新的API时仔细查看生成的内容。

答案 1 :(得分:0)

如果您使用Android Studio进行创建项目,请尝试将以下方法添加到Application类:

protected void attachBaseContext(Context base){
    super.attachBaseContext(base);
    MultiDex.install(this);
}

请注意,不要忘记将multiDexEnabled true添加到gradle文件中。 帮助它。 祝你好运!。