35 votes

Le service de premier plan collant ne parvient pas à redémarrer avec l'erreur «le processus est incorrect»

J'ai commencé un premier plan de service. J'ai pris soin de retourner START_STICKY de onStartCommand. J'ai observé que le premier plan de services de ne pas exécuter indéfiniment, mais sont régulièrement dénoncé par un Androïde interne module appelé l' RestartProcessManager. Essentiellement un processus LRU est maintenu et le nouveau service suspendu obtient à nouveau prévues si il est configuré pour le faire(collant ou pas).

La question que je me pose est comment le redémarrage est en cours de traitement. Logcat indique le service de l'intention a été livré, mais a échoué parce que le "processus qui est mauvais"

Après avoir écumé par d'autres sources que j'ai été amené à croire qu'il y a une fuite de mémoire dans mon service. Pour valider cette affirmation, j'ai créé une vanille de premier plan de services qui n'ont rien fait d'autres que journal d'une déclaration lors d' onStartCommand sein de la même application. Cela aussi a observé le même problème.

Essayé exactement la même chose dans un nouveau projet (avec un nouveau nom de package évidemment) et le redémarrage du service fonctionnait parfaitement bien. Aussi, je simule un redémarrage en cliquant sur la croix rouge située en dessous de la studio->logcat (qui tue essentiellement le processus). De toute façon, le service d'intention a été livré avec succès cette fois, et le service est en place et fonctionne à nouveau. Je suppose qu'il pourrait être une des dépendances dans mon projet qui pourrait déconner, d'une certaine manière. J'ai répliqué les dépendances dans le nouveau projet et il a continué à fonctionner comme prévu.

Maintenant, c'est là que ça devient absurde. - Je changer le nom du package dans le buggy projet et je ne rencontre pas le problème de plus. J'aurais contenté de ce qu'un correctif parce que j'ai passé près de 2 jours, le diagnostic de cette, mais en changeant le nom du package n'est pas possible pour moi que mon application est déjà publiée.

Edit 1: je dois mentionner que j'ai déjà observé ce actuellement sur mon appareil équipé d'Oreo(plus de 5)

Edit-2: Le service s'exécutant dans le même processus que celui de l'application. Et j'ai inclus le logcat dump ainsi.

02-15 14:26:50.850  1395  1445 D RestartProcessManager: updateSelf :  com.ambee, size : 30
02-15 14:26:50.852  1395  1445 D RestartProcessManager: com.ambee got score 26.17240489145331 in DayDuration for duration : 525176
02-15 14:26:50.853  1395  1445 D RestartProcessManager: com.ambee got score 99.80218232889891 in DayLRU for LRU diff : 47707034
02-15 14:26:50.853  1395  1445 D RestartProcessManager: com.ambee got score 90.9090909090909 in DayLaunchTimes for launch times : 10
02-15 14:26:50.854  1395  1445 D RestartProcessManager: com.ambee : X : 2727.272727272727, Y : 785.1721467435993, Z : 2994.0654698669673
02-15 14:26:51.082  1395  1445 I ActivityManager: Killing 13839:com.ambee/u0a260 (adj 200): [BgDetect][RNK] kill com.ambee (uid 10260) usage 4
02-15 14:26:51.083  1395  1445 D ActivityManager: Process com.ambee has 1 services
02-15 14:26:51.083  1395  1445 W ActivityManager: Scheduling restart of crashed service com.ambee/.vson.LinkService in 10996ms
02-15 14:26:51.084  1395  1445 D EmbryoManager: prepare com.ambee user 0
02-15 14:26:51.099  3710  3710 D NotificationListener: onNotificationRemoved# hash: 68226270 sbn: StatusBarNotification(pkg=com.ambee user=UserHandle{0} id=903 tag=null key=0|com.ambee|903|null|10260: Notification(channel=default pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x72 color=0x00000000 actions=2 vis=PRIVATE))
02-15 14:26:54.121  1395  1444 I ActivityManager: Start proc 22570:com.ambee/u0a260 for embryo com.ambee
02-15 14:26:54.121  1395  1444 D Embryo_Uterus: Embryo created.com.ambee, pid=22570
02-15 14:26:54.796 22570 22570 D Embryo  : preload com.ambee, 10ms, hwui=true, layout=false, decor=false
02-15 14:27:02.084  1395  1445 W ActivityManager: Unable to launch app com.ambee/10260 for service Intent { cmp=com.ambee/.vson.LinkService }: process is bad
02-15 14:27:04.214  1395  1444 D Embryo_Uterus: rank:63, com.ambee, 35767806

2voto

Shift Delete Points 253

Pour votre vanille de la version de votre service, pensez à ce qui suit:

1 - désinstaller votre application 2 - redémarrer votre appareil 3 - la réinstallation de votre vanille de la version du service à juste journalisation.

Il devrait fonctionner.

Pour l'avant-plan de votre service à l'aide de stopSelf ou stopService méthodes et de ne pas stopForegroundService méthode. stopForegroundService juste arrêter le service de premier plan. Il ne cesse pas d'être un service d'arrière-plan. Il redémarre plus et plus et si votre service de crash ou de ne pas faire son travail dans un délai de 5 secondes, de sorte OS tuer votre service plus de et plus et éventuellement de votre service à la liste noire de l'OS.

0voto

Suricat Points 131

Poussant vers le haut le commentaire de KR_Android : selon ce blog et cette autre question : un service Intention est déclarée "mauvais" après avoir perdu au moins deux fois.

S'il vous plaît essayer à

  • Encapsuler toutes les méthodes en try { method(..); } catch(..) { log(..) } ceintures de sécurité
  • Désinstaller et réinstaller l'application

Laissez-nous savoir et nous allons mettre à jour nos réponses à l'issue de creuser plus loin

0voto

Allen Luce Points 4152

Cela m'ennuyait que le système ne redémarre pas mon service tant que je n'ai pas redémarré la boîte. Ensuite, j'ai trouvé cette astuce pour effacer le crash compte beaucoup plus rapidement:

 adb shell killall system_server
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X