Что такое ложная смерть в Android?

Я знаю, что это звучит ленивый вопрос.. но я действительно не очень понимаю, как это произошло, и я не могу найти много информации об этом в Google.

Фон:

Это приложение с IPC: у меня есть служба, работающая в отдельном процессе. Иногда служба убивается.. но она на самом деле не "официально умирает". Вместо этого я получил термин от ActivityManager, называемый " ложная смерть". Когда это произошло, службы ведут себя как зомби. Это живое, но оно действительно не функционирует.

04-12 10: 03: 37.935 728 830 я ActivityManager: принудительное завершение активность ActivityRecord {11eee41f u0 com.android.staging/com.android.activities.MainActivity t8210}     04-12 10: 03: 37.937 728 830 я ActivityManager: принудительное прекращение обслуживания ServiceRecord {291a4c9b u0 com.android.staging/com.android.services.CallService}     04-12 10: 03: 37.969 728 2563 W ActivityManager: ложная смерть для ProcessRecord {27ecf545 11057: com.android.staging/u0a268}, curProc для 11057: null

Ответ 1

Оскорбительную строку можно найти здесь: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/com/android/server/am/ActivityManagerService.java/#4858 (Разная строка для разных версий Android L)

Я предполагаю, что вы используете какую-то форму Android L, так как это конкретное сообщение об ошибке не было добавлено до тех пор.

Если вы используете ContentProvider в своем процессе, эти два комментария в ActivityManagerService могут помочь:

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 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.

а затем...

9317                         appDiedLocked(cpr.proc);

appDiedLocked также может быть вызван из некоторых других исходных файлов: ActiveServices.java и ActivityStackSupervisor.java, одно зависит от того, что DeadObjectException выбрано, а другое - в RemoteException.

appDiedLocked выглядит следующим образом

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         }

По какой-то причине curProc не совпадает с приложением ProcessRecord, а метод appDiedLocked прерван. В вашем случае curProc имеет значение null, по какой-то причине снова.

Короче говоря: ваш процесс умер или был убит, а какое-то состояние или состояние препятствуют тому, чтобы appDiedLocked продолжал работать, чтобы запустить команды killProcess. У вас есть еще несколько исследований/протоколов, чтобы выяснить, почему это произошло.

Если у вас есть служба, которую вы хотите сохранить в живых, если вы этого не сделаете, я бы рекомендовал вам добавить к ней уведомление о статусной строке, таким образом снижается вероятность его убийства.