Android 分析:Process xxxxx (pid 30262) has died .

有时候经常遇到:\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;
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值