java - 如何避免 NoClassDefFoundError : android/os/PersistableBundle on pre-L?

标签 java android android-reflection

我使用 TinyBus在我的应用程序中调度事件的库。 MinSDK为15,编译SDK为23。

在 pre-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,但系统显然引用了。

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

最佳答案

好了,问题已经解决了。在检查了我所有的代码(我早就应该这样做了)之后,我发现我实际上引用了 PersistableBundle。这些位于我让 IDE 生成的方法中,例如 onPostCreate(PersistableBundle bundle) 并且没有引起注意。将所有 PersistableBundle 替换为 Bundle 解决了这个问题。

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

关于java - 如何避免 NoClassDefFoundError : android/os/PersistableBundle on pre-L?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34085681/

相关文章:

java - 终止线程似乎不起作用

android - 愤怒的小鸟喜欢Android上的 float 菜单

Android loopj + GCMIntentService 在死线程上向处理程序发送消息

android - 从服务器获取位图图像以在 ImageView 上设置

java - Android 6.0 上的 Android java.lang.OutOfMemoryError

java - 为什么我的文本区域不显示

java - 将 JpaRepository 注入(inject) Generic 类时出现 NoUniqueBeanDefinitionException

java - 通过反射从View中获取OnTouchListener对象

android kotlin - 函数引用是否由于反射而变慢?

java - 如何在android中使用反射创建回调?