Android 为什么备份代理尝试启动时会出现ClassNotFoundException

Android 为什么备份代理尝试启动时会出现ClassNotFoundException,android,classnotfoundexception,android-backup-service,Android,Classnotfoundexception,Android Backup Service,我使用BackupAgentHelper在我的Android应用程序中备份SharedReferences。我已经在模拟器(Android1.6和2.2)和我自己的手机(Android2.3.3)上进行了测试,效果都很好。然而,今天我在开发人员控制台中得到了一个崩溃报告,如下所示: java.lang.RuntimeException: Unable to create BackupAgent com.xxx.yyy.MyBackupAgent: java.lang.ClassNotFoundE

我使用
BackupAgentHelper
在我的Android应用程序中备份
SharedReferences
。我已经在模拟器(Android1.6和2.2)和我自己的手机(Android2.3.3)上进行了测试,效果都很好。然而,今天我在开发人员控制台中得到了一个崩溃报告,如下所示:

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-2/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-2/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:backupAgent="com.xxx.yyy.MyBackupAgent"
显然,类
MyBackupAgent
是存在的,因为我可以构建
.apk
,并且它可以在多个设备上正常运行。那么,它怎么会在这里找不到类呢?我在上面的消息中注意到的一点是,该应用程序似乎安装在一个路径中,该路径包含我的包名,并在末尾附加“-2”。由于我在
android:backupAgent
中指定了完整的包名和类,这会不会导致类加载器看不到我包中的类,或者该部分不相关?有人能理解找不到该类的原因吗

值得一提的是,我的应用程序可以安装在SD卡上


请原谅,在上面的消息中将我的真实软件包名称替换为com.xxx.yyy。

对我来说,设备上似乎安装了一个重复的软件包。如果我是你,我会测试:

  • 是否无意中更改了包名
  • 您是否尝试过清理项目、从测试设备卸载应用程序、重新构建并重新安装它

我知道这些问题对您来说似乎很明显,但我无法告诉您这两件事救了我多少次。

包名没有更改。我自己无法重现错误,尝试时效果很好。上面的错误消息来自一位用户,他从Android Market下载了我的应用程序,并在应用程序崩溃时上传了错误报告。所以这个消息来自Android Market的开发者控制台。我只能假设用户是从Android Market下载的。它很可能来自另一个地方。它是一款付费应用程序,在文件共享网站中相对流行。也许这可以解释安装路径末尾附加的“-2”?但是“-2”是否就是找不到该类的原因?假设用户确实从非法下载站点下载了我的应用程序。Android中的错误报告还会进入Android Market中的开发者控制台吗?仅仅因为您可以使用清单中列出的备份代理构建APK并不意味着它存在。您可以将任何需要的垃圾放在那里,在BackupManager尝试创建之前,它不会被实例化。