java - startforeground - stop service android
El servicio de primer plano fijo no se reinicia con un error de "el proceso es malo" (1)
Tengo un servicio de primer plano iniciado Me he encargado de devolver START_STICKY desde onStartCommand. He observado que los servicios de primer plano no se ejecutan de forma indefinida, sino que se terminan periódicamente por un módulo interno de Android llamado RestartProcessManager
. Esencialmente, se mantiene una LRU de proceso y el servicio recién terminado se programa nuevamente si está configurado para hacerlo (fijo o no). El problema al que me enfrento es cómo se está manejando el reinicio. Logcat indica que la intención del servicio se estaba entregando, pero falló porque "el proceso es malo"
Después de revisar otras fuentes, me hicieron creer que hay una pérdida de memoria dentro de mi servicio. Para validar esta afirmación, creé un servicio de vainilla en primer plano que no hizo nada más que registrar una declaración durante onStartCommand
dentro de la misma aplicación. Esto también observó el mismo problema.
Intenté exactamente lo mismo en un nuevo proyecto (con un nuevo nombre de paquete, obviamente) y los reinicios del servicio funcionaron perfectamente bien. Además, simulo un reinicio haciendo clic en el botón de cruz roja debajo de studio-> logcat (que esencialmente destruye el proceso). De todos modos, la intención del servicio se entregó con éxito esta vez y el servicio estuvo en funcionamiento nuevamente. Supuse que podrían ser algunas dependencias en mi proyecto las que podrían estar jugando de alguna manera. Repliqué las dependencias en el nuevo proyecto y siguió funcionando como se esperaba.
Ahora aquí es donde se vuelve absurdo. Cambio el nombre del paquete en el proyecto con errores y ya no encuentro el problema. Me conformé con esto como una solución porque pasé cerca de 2 días diagnosticando esto, pero cambiar el nombre del paquete no es factible para mí ya que mi aplicación ya está publicada.
Edit-1: debo mencionar que he observado esto actualmente en mi dispositivo con Oreo (uno más 5)
Edit-2: el servicio se ejecuta en el mismo proceso que la aplicación. Y he incluido el volcado logcat también.
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
Impulsando el comentario de KR_Android: de acuerdo con este blog y esta otra pregunta : una Intención de servicio se declara "mala" después de fallar al menos dos veces.
Por favor intenta
- Encapsule todos los métodos en
try { method(..); } catch(..) { log(..) }
try { method(..); } catch(..) { log(..) }
cinturones de seguridad - Desinstalar y reinstalar la aplicación
Háganos saber y actualizaremos nuestras respuestas después de seguir investigando.