4

안드로이드 시스템이 BackupAgent를 사용하여 Google 클라우드로 백업을 결정할 때부터 몇 가지 (4) 가지 오류 보고서가 있습니다. SharedPreferencesBackupHelper를 사용하고 있습니다. 이 (내 실제 패키지 이름이 com.xxx.yyy 아래 교체)처럼 스택 추적 같습니다안드로이드 시스템이 BackupAgent와 결합 할 때 ClassNotFoundException이 발생했습니다

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 

내가 자신도 일단 프로그램이 다운을 가지고, 안드로이드 2.3를 실행하는 내 자신의 전화에. 삼. 이 프로그램 충돌로 나를 괴롭히는 이유는 패키지에 "MyBackupAgent"클래스가 있다는 것을 확실히 알고 있기 때문입니다. 클라우드로의 백업이 충돌이 발생한 동일한 전화에서 작동하는지도 확실합니다.

나는이 문제에 대한 이유가 무엇인지에 대한 해결책을 찾기 위해 인터넷에서 많은 것을 수색했다. 비슷한 문제에서 발견 된 모든 사례, 즉 클래스가 apk에 존재하더라도 ClassClassLoader에서 ClassNotFoundException이 던져 지는데 공통점이 하나 있습니다. 그들은 모두 "-1"또는 "-2"와 apk가 설치된 패키지 이름 디렉토리의 끝이 있습니다. 내 오류 보고서에서

, 이들에 대한 다른 이름은 어디에 내 백업 클래스의 dalvik.system.PathClassLoader 검색 :

/mnt/asec/com.xxx.yyy-1/pkg.apk

/mnt/asec/com.xxx.yyy-2/pkg.apk

/data/app/com.xxx.yyy-1.apk

어쩌면 내가 여기에 잘못된 호수에서 낚시를하고 있지만, 패키지 이름 디렉토리의 끝에 "-1"과 "-2"가 붙은 것은 무엇을 의미합니까? 그리고 이것과 관련된 문제가있을 수 있습니까? 내 sharedpreferences의 백업 일정을 시스템에 알려주기 때문에 문제가 내 코드에있는 것은 아닌지 의심 스럽다. 그런 다음 안드로이드 시스템은 미래의 적절한 시점에 백업 작업을 수행합니다. 여기서 충돌이 발생합니다. 스택 추적을 보면 제 코드는 언급되지 않았습니다. 그것은 apk에서 나의 백업 클래스를 찾는 것을 끝내고 어떤 알려지지 않은 이유로 찾을 수없는 모든 시스템 루틴이다.

Manifest의 application 태그에 android : name 속성을 설정하지 않았습니다.이 태그는 비슷한 오류를 일으킬 수 있습니다.

누구에게이 문제의 원인이 될 수있는 단서가 있습니까? 또는 더 나은 방법은 이러한 일이 발생하지 않도록하는 것입니다.

+0

인 텐트는 어떻게 등록됩니까? 당신의 명단을 볼 수 있을까요? – Ian

+0

... Anders

답변

0

"/ mnt/asec"접두어는 휴대 전화가 PC에 마운트되어 있고 앱이 실행을 시도하거나 백업 에이전트가 실행을 시도하고있는 동안 (앱이 이미 사용되지 않음) 충돌 함을 의미합니다. 전화가 장착 된 이후로 예상됩니다.

+0

예상 되나요? 정말? 나에게 이것은 BackupAgent의 버그 인 것 같습니다. 아니면 내 응용 프로그램의 코드에 무언가를 추가하여이 충돌을 피할 수 있습니까? – Anders

+0

그것은 실패 할 것으로 예상됩니다. 물론 그것은 버그입니다. 바이너리를 업데이트 할 때 응용 프로그램 업그레이드시에도 BTW가 발생합니다. 이것이 접미어의 의미입니다. 나는 해결책을 찾고 있는데, 이것이 문제의 근원이다. –

+1

내 자신의 질문을 검토하면, 실제로 이것에 대한 답입니다. 고맙습니다! "정상적인"개발자가 할 수있는 일은 없다고 생각합니다. 이 버그를 수정하는 것은 BackupAgent를 책임지는 개발자 (들)의 책임입니다. – Anders

0

동일한 오류가 발생합니다. 필자가 궁금해하는 한 가지 이론은 상대적인 패키지 이름 또는 절대 패키지 이름을 지정하는 것이 중요한지 여부입니다.

내 응용 프로그램이 응용 프로그램을 확장하기 때문에 내 경우 "안드로이드 : 이름 ="을 사용하고있었습니다. android.name = "com.foo.bar.myapp"대신 을 : 그래서 나는 사용했다 android.name = "MyApp를."

차이를해서는 안 같이 보인다,하지만 난 로더가 "-1"또는 "-2"접미어와 같은 다른 패키지 이름을 사용하고 있는지 궁금해 할 것입니다.

관련 문제