¿Qué es la muerte espuria en Android?

Sé que suena una pregunta perezosa .. pero realmente no tengo mucha pista sobre cómo ocurrió este escenario, tampoco puedo encontrar mucha información sobre él en Google.

Fondo:

Es una aplicación con IPC: Tengo un servicio ejecutándose en un proceso separado. A veces, el servicio es asesinado .. pero en realidad no "oficialmente mueren", En su lugar, tengo un término del ActivityManager llamado " muerte espuria ". Cuando esto sucedió, los servicios se comportan como un zombi. Está vivo pero no está funcionando realmente.

04-12 10: 03: 37.935 728 830 I ActivityManager: Actividad de finalización de la fuerza ActivityRecord {11eee41f u0 com.android.staging / com.android.activities.MainActivity t8210} 04-12 10: 03: 37.937 728 830 I ActivityManager: Servicio ServiceRecord {291a4c9b u0 com.android.staging / com.android.services.CallService} 04-12 10: 03: 37.969 728 2563 W ActivityManager: muerte espuria para ProcessRecord {27ecf545 11057: com.android.staging / u0a268}, curProc Para 11057: null

La línea ofensiva se puede encontrar aquí: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/com/android/server/am/ActivityManagerService. Java / # 4858 (Diferente línea para diferentes versiones de Android L)

Supongo que estás usando alguna forma de Android L, ya que ese mensaje de error en particular no se agregó hasta entonces.

Si está ejecutando un ContentProvider en su proceso, estos dos comentarios en ActivityManagerService pueden ser de ayuda:

 9303 // NOTE: there is still a race here where a signal could be 9304 // pending on the process even though we managed to update its 9305 // adj level. Not sure what to do about this, but at least 9306 // the race is now smaller. 9307 if (!success) { 9308 // Uh oh... it looks like the provider's process 9309 // has been killed on us. We need to wait for a new 9310 // process to be started, and make sure its death 9311 // doesn't kill our process. 

y entonces …

 9317 appDiedLocked(cpr.proc); 

AppDiedLocked se puede llamar desde algunos otros archivos de origen también: ActiveServices.java y ActivityStackSupervisor.java, uno depende de DeadObjectException que se está lanzando, y el otro en RemoteException.

AppDiedLocked se parece a esto

 4853 final void appDiedLocked(ProcessRecord app, int pid, IApplicationThread thread) { 4854 // First check if this ProcessRecord is actually active for the pid. 4855 synchronized (mPidsSelfLocked) { 4856 ProcessRecord curProc = mPidsSelfLocked.get(pid); 4857 if (curProc != app) { 4858 Slog.w(TAG, "Spurious death for " + app + ", curProc for " + pid + ": " + curProc); 4859 return; 4860 } 4861 } 

Por alguna razón, el curProc no es igual que la aplicación ProcessRecord, y el método appDiedLocked se interrumpe. En su caso curProc es nulo, de nuevo por alguna razón.

Larga historia corta: Su proceso murió, o fue asesinado, y algún estado o condición está impidiendo que appDiedLocked siga hacia abajo para ejecutar los comandos killProcess. Usted tiene más investigación / registro para hacer para averiguar por qué sucedió.

Si usted tiene un servicio que desea mantener vivo, a menos que lo esté haciendo ya, le recomendaría que adjunte una notificación de barra de estado a ella, de esa manera la probabilidad de que sea asesinado se reduce.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.