Android 分析:Process xxxxx (pid 30262) has died .
16lz
2021-01-23
有时候经常遇到:\06-09 13:30:49.662 I/ActivityManager( 797): Process xxxxx (pid 30262) has died .
打印该log所在文件处:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
final void appDiedLocked(ProcessRecord app, int pid, IApplicationThread thread) {// First check if this ProcessRecord is actually active for the pid. synchronized (mPidsSelfLocked) { ProcessRecord curProc = mPidsSelfLocked.get(pid); if (curProc != app) { Slog.w(TAG, "Spurious death for " + app + ", curProc for " + pid + ": " + curProc); return; } } BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics(); synchronized (stats) { stats.noteProcessDiedLocked(app.info.uid, pid); } if (!app.killed) { Process.killProcessQuiet(pid); Process.killProcessGroup(app.uid, pid); app.killed = true; }// Clean up already done if the process has been re-started. if (app.pid == pid && app.thread != null && app.thread.asBinder() == thread.asBinder()) { boolean doLowMem = app.instrumentationClass == null; boolean doOomAdj = doLowMem; if (!app.killedByAm) { Slog.i(TAG, "Process " + app.processName + " (pid " + pid + ") has died"); mAllowLowerMemLevel = true; } else { // Note that we always want to do oom adj to update our state with the new number of procs. mAllowLowerMemLevel = false; doLowMem = false; } EventLog.writeEvent(EventLogTags.AM_PROC_DIED, app.userId, app.pid, app.processName); if (DEBUG_CLEANUP) Slog.v(TAG, "Dying app: " + app + ", pid: " + pid + ", thread: " + thread.asBinder()); handleAppDiedLocked(app, false, true); if (doOomAdj) { updateOomAdjLocked(); } if(doLowMem) { doLowMemReportIfNeededLocked(app); } } else if (app.pid != pid) { // A new process has already been started. Slog.i(TAG, "Process " + app.processName + " (pid " + pid+ ") has died and restarted (pid " + app.pid + ")."); EventLog.writeEvent(EventLogTags.AM_PROC_DIED, app.userId, app.pid, app.processName); } else if (DEBUG_PROCESSES) { Slog.d(TAG, "Received spurious death notification for thread " + thread.asBinder()); } }
从代码中发现,当app.killedByAm = false,就会出现died的log。
IBinder所对应的Service进程异常退出(被杀)造成的。
那么service被杀除了service本身代码逻辑的问题,很多情况就是系统内存不足时引起的
简单讲不是ActivityManager主动kill该应用,而是LowMemory的原因(for RAM)。
如果想过滤掉具体特定应用可在此操作:
if (!app.killed) { Process.killProcessQuiet(pid); Process.killProcessGroup(app.uid, pid); app.killed = true; }
修改为:
if (!app.killed) { if(!"包名".equals(app.processName)){ Process.killProcessQuiet(pid); Process.killProcessGroup(app.uid, pid); } app.killed = true; }
更多相关文章
- Button代码小写,运行时大写
- android 365手机秘书源代码
- android studio调试c/c++代码
- Android开发者实用代码片段 与大家分享
- 【Android】使用LiveData KTX Builder让代码更简洁
- 一个简单的iPhone项目及代码
- android studio调试c++代码