android 崩溃流程,理解 Android Crash处理流程(2)

9.2.1 app.kill

[-> ProcessRecord.java]

void kill(String reason, boolean noisy) {

if (!killedByAm) {

Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "kill");

if (noisy) {

Slog.i(TAG, "Killing " + toShortString() + " (adj " + setAdj + "): " + reason);

}

EventLog.writeEvent(EventLogTags.AM_KILL, userId, pid, processName, setAdj, reason);

Process.killProcessQuiet(pid); //杀进程

Process.killProcessGroup(info.uid, pid); //杀进程组,包括native进程

if (!persistent) {

killed = true;

killedByAm = true;

}

Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

}

}

此处reason为“crash”,关于杀进程的过程见我的另一篇文章 理解杀进程的实现原理.

9.2.2 handleAppDiedLocked

[-> ActivityManagerService.java]

private final void handleAppDiedLocked(ProcessRecordapp,

boolean restarting, boolean allowRestart) {

int pid = app.pid;

//清除应用中service/receiver/ContentProvider信息

boolean kept = cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1);

if (!kept && !restarting) {

removeLruProcessLocked(app);

if (pid > 0) {

ProcessList.remove(pid);

}

}

if (mProfileProc == app) {

clearProfilerLocked();

}

//清除应用中activity相关信息

boolean hasVisibleActivities = mStackSupervisor.handleAppDiedLocked(app);

app.activities.clear();

...

if (!restarting && hasVisibleActivities && !mStackSupervisor.resumeTopActivitiesLocked()) {

mStackSupervisor.ensureActivitiesVisibleLocked(null, 0);

}

}

9.3 ASS.resumeTopActivitiesLocked

[-> ActivityStackSupervisor.java]

boolean resumeTopActivitiesLocked() {

return resumeTopActivitiesLocked(null, null, null);

}

boolean resumeTopActivitiesLocked(ActivityStacktargetStack, ActivityRecordtarget,

BundletargetOptions) {

if (targetStack == null) {

targetStack = mFocusedStack;

}

boolean result = false;

if (isFrontStack(targetStack)) {

//【见小节9.3.1】

result = targetStack.resumeTopActivityLocked(target, targetOptions);

}

for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {

final ArrayList stacks = mActivityDisplays.valueAt(displayNdx).mStacks;

for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {

final ActivityStackstack = stacks.get(stackNdx);

if (stack == targetStack) {

continue; //已经启动

}

if (isFrontStack(stack)) {

stack.resumeTopActivityLocked(null);

}

}

}

return result;

}

此处 mFocusedStack 是当前正在等待接收input事件或者正在启动下一个activity的 ActivityStack 。

9.3.1 AS.resumeTopActivityLocked

[-> ActivityStack.java]

final boolean .resumeTopActivityLocked(ActivityRecordprev, Bundleoptions) {

...

result = resumeTopActivityInnerLocked(prev, options);//【见小节9.3.2】

return result;

}

9.3.2 AS.resumeTopActivityInnerLocked

[-> ActivityStack.java]

private boolean resumeTopActivityInnerLocked(ActivityRecordprev, Bundleoptions) {

//找到mTaskHistory栈中第一个未处于finishing状态的Activity

final ActivityRecordnext = topRunningActivityLocked(null);

if (mResumedActivity == next && next.state == ActivityState.RESUMED &&

mStackSupervisor.allResumedActivitiesComplete()) {

//当top activity已经处于resume,则无需操作;

return false;

}

if (mService.isSleepingOrShuttingDown()

&& mLastPausedActivity == next

&& mStackSupervisor.allPausedActivitiesComplete()) {

//当正处于sleeping状态,top activity处于paused,则无需操作

return false;

}

//正在启动app的activity,确保app不会被设置为stopped

AppGlobals.getPackageManager().setPackageStoppedState(

next.packageName, false, next.use

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值