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に存在していても、PathClassLoaderからClassNotFoundExceptionがスローされるという、共通点が1つあります。それらはすべて、末尾に「-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でバックアップクラスを検索するのはすべてのシステムルーチンであり、何らかの理由でそれを見つけることができません。
マニフェストのアプリケーションタグにandroid:name属性を設定していません。これを読み取ると、同様のエラーが発生する可能性があります。
誰かがこれを引き起こす可能性のある手がかりを持っていますか?またはさらに良いことに、これが発生するのを回避する方法。