2015-04-12 14 views
11

So che sembra una domanda pigra .. ma non ho davvero idea di come sia successo questo scenario, né posso trovare molte informazioni su di esso su Google.Che cos'è la morte spuria in Android?

Background:

E 'un app con IPC: Ho un servizio in esecuzione nel processo separato. A volte, il servizio viene ucciso .. ma in realtà non "muore ufficialmente", Invece, ho ricevuto un termine dallo ActivityManager chiamato "Morte spuria". Quando ciò accade, i servizi si comportano come uno zombi. È vivo ma non funziona davvero.

04-12 10: 03: 37,935 728 830 I ActivityManager: finitura Forza attività ActivityRecord {11eee41f u0 com.android.staging/com.android.activities.MainActivity t8210} 04-12 10:03 : 37.937 728 830 I ActivityManager: servizio di arresto forzato ServiceRecord {291a4c9b u0 com.android.staging/com.android.services.CallService} 04-12 10: 03: 37,969 728 2563 W ActivityManager: Morte spuria per ProcessRecord {27ecf545 11057 : com.android.staging/u0a268}, curProc per 11057: null

+0

Penso che abbia qualcosa a che fare con il kernel e con poca memoria ... –

risposta

2

La linea incriminata può essere trovato qui: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/com/android/server/am/ActivityManagerService.java/#4858 (linea diversa per le diverse versioni di Android L)

presumo che si sta utilizzando una qualche forma di Android L, dal momento che il messaggio di errore particolare, non è stato aggiunto fino ad allora.

Se si esegue un ContentProvider nel vostro processo, questi due commenti nel ActivityManagerService potrebbero essere di aiuto:

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. 

e poi ...

9317       appDiedLocked(cpr.proc); 

appDiedLocked può essere chiamato da un po ' anche altri file di origine: ActiveServices.java e ActivityStackSupervisor.java, uno dipende dall'esecuzione di DeadObjectException, l'altro su RemoteException.

appDiedLocked assomiglia a questo

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   } 

Per qualche ragione, la curProc non è la stessa come l'applicazione ProcessRecord, e il metodo appDiedLocked è tagliato corto. Nel tuo caso, curProc è nullo, ancora per qualche motivo.

Per farla breve: il processo è morto o è stato interrotto e alcuni stati o condizioni impediscono a appDiedLocked di continuare a eseguire i comandi killProcess. Hai ancora qualche ricerca/registrazione da fare per scoprire perché è successo.

Se si dispone di un servizio che si desidera mantenere attivo, a meno che non lo si stia già facendo, si consiglia di allegare una notifica della barra di stato ad esso, in tal modo la probabilità che venga uccisa viene ridotta.

Problemi correlati