ClassNotFoundException: 没有找到 class "android.os.PersistableBundle" 奥托 Android 5.0
ClassNotFoundException: Didn't find class "android.os.PersistableBundle" Otto Android 5.0
我有一个奇怪的问题。
我有一个部署在 Android 4.4 设备上并使用 Otto 库的应用程序。
我在 Android 5.0 设备上部署了该应用程序。它仍然有效。
我在 4.4 上重试,应用程序无法启动。
显然,它试图使用 PersistableBundle.class 其中一个 API 21 class。
这是我的日志:
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.os.PersistableBundle" on path: DexPathList[[zip file "/data/app/fr.myapp.apk"],nativeLibraryDirectories=[/data/app-lib/fr.myapp, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at java.lang.Class.getDeclaredMethods(Native Method)
at java.lang.Class.getDeclaredMethods(Class.java:656)
at com.squareup.otto.AnnotatedHandlerFinder.loadAnnotatedMethods(AnnotatedHandlerFinder.java:52)
at com.squareup.otto.AnnotatedHandlerFinder.findAllProducers(AnnotatedHandlerFinder.java:126)
at com.squareup.otto.HandlerFinder.findAllProducers(HandlerFinder.java:33)
at com.squareup.otto.Bus.register(Bus.java:191)
我找到了 "solution"。
只需从 activity 中删除此功能即可:
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
将 targetVersion 更改为您 运行.
设备的 API 版本
当我的设备有 4.4 (API 19) 时,我有 targetVersion = 21,将值更改为 19 解决了问题。
我在 Samsung Galaxy 3mini 和本地运营商上遇到了同样的问题 phones.But 我用覆盖修复了 activity method.i 希望它对你有用。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
try {
BusApplication.getInstance().register(this);
} catch (Exception e) {
e.printStackTrace();
}
}
基于 FAG
Some Android versions seem to have a bug with reflection when calling getDeclaredMethods or getMethods
在这种情况下,PersistableBundle
被添加到 API 级别 21 中,当我们在 onCreate 或 onSaveInstanceState 等生命周期方法中使用它时 发生此错误。
如果您在代码中使用任何以下方法
@Override
public void onCreate(Bundle savedInstanceState,PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
}
@Override
public void onPostCreate(Bundle savedInstanceState,PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
改用以下方法(如果没有用,则删除上面的方法)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
在我的例子中,我在 baseActivity 中使用了这个方法并造成了崩溃
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
}
只是我将其替换为
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
问题解决了。
我有一个奇怪的问题。 我有一个部署在 Android 4.4 设备上并使用 Otto 库的应用程序。 我在 Android 5.0 设备上部署了该应用程序。它仍然有效。 我在 4.4 上重试,应用程序无法启动。
显然,它试图使用 PersistableBundle.class 其中一个 API 21 class。 这是我的日志:
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.os.PersistableBundle" on path: DexPathList[[zip file "/data/app/fr.myapp.apk"],nativeLibraryDirectories=[/data/app-lib/fr.myapp, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at java.lang.Class.getDeclaredMethods(Native Method)
at java.lang.Class.getDeclaredMethods(Class.java:656)
at com.squareup.otto.AnnotatedHandlerFinder.loadAnnotatedMethods(AnnotatedHandlerFinder.java:52)
at com.squareup.otto.AnnotatedHandlerFinder.findAllProducers(AnnotatedHandlerFinder.java:126)
at com.squareup.otto.HandlerFinder.findAllProducers(HandlerFinder.java:33)
at com.squareup.otto.Bus.register(Bus.java:191)
我找到了 "solution"。 只需从 activity 中删除此功能即可:
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
将 targetVersion 更改为您 运行.
设备的 API 版本当我的设备有 4.4 (API 19) 时,我有 targetVersion = 21,将值更改为 19 解决了问题。
我在 Samsung Galaxy 3mini 和本地运营商上遇到了同样的问题 phones.But 我用覆盖修复了 activity method.i 希望它对你有用。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
try {
BusApplication.getInstance().register(this);
} catch (Exception e) {
e.printStackTrace();
}
}
基于 FAG
Some Android versions seem to have a bug with reflection when calling getDeclaredMethods or getMethods
在这种情况下,PersistableBundle
被添加到 API 级别 21 中,当我们在 onCreate 或 onSaveInstanceState 等生命周期方法中使用它时 发生此错误。
如果您在代码中使用任何以下方法
@Override
public void onCreate(Bundle savedInstanceState,PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
}
@Override
public void onPostCreate(Bundle savedInstanceState,PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
改用以下方法(如果没有用,则删除上面的方法)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
在我的例子中,我在 baseActivity 中使用了这个方法并造成了崩溃
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
}
只是我将其替换为
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
问题解决了。