我的应用从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”类。我也确定云备份正在我曾经遇到崩溃的同一部手机上工作。
我在网上搜索了很多,找到了解决这个问题的原因。我在类似问题上发现的所有情况,即PathNlassFoader抛出ClassNotFoundException,即使该类存在于apk中,也有一个共同点。它们都有一个尾随的“-1”或“-2”以及安装apk的包名目录的末尾。
在我的错误报告中,这些是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”在包名称目录的末尾是什么意思,问题可能与此有关吗?我怀疑问题出在我的代码中,因为只需告诉系统安排我的共享首选项的备份。然后,Android系统将在适当的时间参与备份操作 - 这就是崩溃发生的地方。查看堆栈跟踪,我甚至没有提到我的代码。所有系统例程最终都会在apk中搜索我的备份类,并且由于某些未知原因而无法找到它。
我没有在Manifest的应用程序标记中设置android:name属性,我读到这可能会导致类似的错误。
有没有人知道可能导致这种情况的原因?或者更好的是,如何避免这种情况发生。
答案 0 :(得分:0)
我遇到了同样的崩溃。我想知道的一个理论是指定相对或绝对包名是否重要。
在我的情况下,我使用“android:name =”,因为我的应用确实扩展了应用程序。所以我用的是: android.name = “com.foo.bar.myapp” 代替: android.name = “MyApp的”
这似乎不应该有所作为,但我想知道加载器是否使用了不同的包名称,例如带有“-1”或“-2”后缀的包名称。
答案 1 :(得分:0)
“/ mnt / asec”前缀表示手机已安装到电脑上,在此期间,当应用程序尝试运行或者backupagent正在尝试运行时(应用程序尚未使用),它会崩溃。预计自手机上市以来。