我从我的应用程序收到了几个(4个)错误报告,这些报告是在Android系统使用BackupAgent将备份存储到Google云时出现的。我正在使用SharedPreferencesBackupHelper。以下是堆栈跟踪(我的真实包名已被替换为com.xxx.yyy):
java.lang.RuntimeException: Unable to create BackupAgent com.xxx.yyy.MyBackupAgent: java.lang.ClassNotFoundException: com.xxx.yyy.MyBackupAgent in loader dalvik.system.PathClassLoader[/mnt/asec/com.xxx.yyy-1/pkg.apk]
at android.app.ActivityThread.handleCreateBackupAgent(ActivityThread.java:2114)
at android.app.ActivityThread.access$3200(ActivityThread.java:132)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1138)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4196)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.xxx.yyy.MyBackupAgent in loader dalvik.system.PathClassLoader[/mnt/asec/com.xxx.yyy-1/pkg.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at android.app.ActivityThread.handleCreateBackupAgent(ActivityThread.java:2064)
... 10 more
我甚至曾经在自己的运行Android 2.3.3的手机上遇到了程序崩溃。这个程序崩溃让我感到困惑的是,我确定类“MyBackupAgent”确实存在于包中。我也确定在同一部手机上备份到云端是可以正常工作的。
我在网上搜索了很多关于这个问题的解决方案。所有我找到的相似问题,即使该类存在于apk中,都会抛出一个ClassNotFoundException异常,但它们都有一个共同点。它们在apk安装目录的包名称目录末尾都带有“-1”或“-2”。
在我的错误报告中,dalvik.system.PathClassLoader搜索我的备份类的位置有不同的名称:
/mnt/asec/com.xxx.yyy-1/pkg.apk
/data/app/com.xxx.yyy-1.apk
/mnt/asec/com.xxx.yyy-2/pkg.apk
也许我在错误的地方寻找解决方案,但是这些附加的“-1”和“-2”在包名称目录末尾代表什么意思?这个问题是否与此有关?我怀疑问题不在我的代码中,因为我只是告诉系统安排备份我的sharedpreferences。然后,Android系统会在将来的适当时间启动备份操作,这就是崩溃发生的地方。查看堆栈跟踪,我的代码甚至没有被提到。所有的系统例程最终都会在apk中搜索我的备份类,但由于某些未知原因找不到它。
我没有在Manifest中的application标签中设置android:name属性,我读到这可能会导致类似的错误。
有人知道这是什么原因吗?或者更好的是,如何避免发生这种情况。