3

Моя активность «использовала», когда при запуске Service ставится пользовательский (сериализуемый) класс. Но пару версия назад я удалил (и удалил класс) и прямо поместил примитивы в пакет.Служба Android не может запускаться из-за исключения ClassNotFoundException из класса, который больше не существует.

А теперь ... мой журнал ACRA полностью забит этой ошибкой аварии в onStartCommand, когда на линии читается расслоение.

java.lang.RuntimeException: Unable to start service [email protected] with Intent { act=ACTION_START flg=0x4 cmp=com.xxx/.MyService (has extras) }: java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object (name = com.xxx.MyBundle) 
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3045) 
at android.app.ActivityThread.access$2200(ActivityThread.java:157) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1454) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5551) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
Caused by: java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object (name = com.xxx.MyBundle) 
at android.os.Parcel.readSerializable(Parcel.java:2491) 
at android.os.Parcel.readValue(Parcel.java:2294) 
at android.os.Parcel.readArrayMapInternal(Parcel.java:2592) 
at android.os.BaseBundle.unparcel(BaseBundle.java:221) 
at android.os.BaseBundle.get(BaseBundle.java:281) 
at com.xxx.MyService.onStartCommand(MyService.java:190) 
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3028) 
.... 
... 14 more 
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.xxx.MyBundle" on path: DexPathList[[zip file "/data/app/com.xxx-2/base.apk"],nativeLibraryDirectories=[/data/app/com.xxx-2/lib/arm, /data/app/com.xxx-2/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]] 
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 

Я не понимаю, что я получаю ошибку, зная, что com.xxx.MyBundle даже не существует больше в проекте!

Обратите внимание, что я вижу эту ошибку в моих журналах сбоев. Я не могу воспроизвести это локально, вероятно, потому, что я удалил и повторно установил приложение много раз, и это, вероятно, устраняет проблему.

Проблема здесь в том, что тысячи людей, которые, вероятно, работают с ошибкой, не могут просто сказать всем «удалить-переустановить». Я хотел бы найти причину этого и possibily исправить это с новым обновлением без необходимости вручную удалить приложение и переустановить ..

EDIT

Это история события

  • v1: Я помещал сериализуемую класс в пачке при запуске службы (я забыл установить serialVersionUID), и я видел много ошибок сериализации при запуске службы, как несовпадения версий, когда desializing .. типичная ошибка при забытии s .

  • v3: Я отказался и удалил com.xx.MyBundle и не создал com.xx.MyBundle2 (без кости .. и это, когда я начал видеть в журнале, что ClassNotFoundException)

  • v4: I Удалить com.xx.MyBundle2 и вместо того, чтобы помещать сериализуемый класс в пакет, я прямо ставил свои примитивы

Итак, вы видите, что это не вопрос обслуживания или нет. Даже когда мои пользователи обновляют с v3 до v4, я бы ожидал, что эта ошибка исчезнет, ​​но нет ... Я все еще вижу ClassNotFoundExcpetionn in v4

ответ

2

Как вы думаете, из вашего вопроса, возможно, вы запустили Service с предыдущей версией приложения, которая была удалена в последнее время вместе с используемыми классами. Это вызывает ClassNotFoundException.

Итак, в этом конкретном случае вы можете рассмотреть возможность обнаружения обновления приложения и обновления приложения, которое необходимо проверить, работает ли Service в фоновом режиме, который необходимо остановить.

Чтобы проверить, установлена ​​ли ваша новая версия приложения, вы получите широковещательное событие под названием ACTION_MY_PACKAGE_REPLACED, а затем остановите работу Service.

Чтобы проверить, хотите ли вы, Service, вы можете рассмотреть возможность проверки этого.

private boolean isMyServiceRunning(Class<?> serviceClass) { 
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if (serviceClass.getName().equals(service.service.getClassName())) { 
      return true; 
     } 
    } 
    return false; 
} 

А затем вызвать его с помощью

if(isMyServiceRunning(MyService.class)) 
    stopMyService(); 

Update

Я думаю, что я правильно понял вашу проблему и мысль о решении выше уже. Я предполагаю, что Service, который вы начали уже в вашем v1 или v2, работает и ожидает набор сериализованного класса. Поэтому вам нужно остановить службу и запустить ее снова, чтобы она соответствовала текущему поведению, которое вы ожидаете.

+0

Но .. когда пользователь обновляет apk от v1, v2, v3 до v4 ... служба автоматически убивается Android no? Служба полностью уничтожена, когда андроид обновляет apk, поэтому он не может работать правильно? – Johny19

+1

Big up for you Reaz ..! в «сомнении» я установил v1 и начал службу. И я тогда оставил службу запущенной и обновляющейся до версии v4 ... сервис действительно убит ... но угадайте, что? когда я запускаю службу при сбое B4 BAM, точно такая же ошибка имеет в моем сообщении – Johny19

+0

Рад узнать, что помогло. Ура !! –