Android Framework之Activity启动流程(二)

本文是Android Framework系列的第二篇,详细阐述了Activity启动过程中ActivityManagerService的startProcessLocked()方法,以及ActivityThread和ApplicationThread的角色。从Zygote fork新进程,到ActivityThread的main()方法启动,再到ApplicationThread与AMS的交互,逐步解析Activity启动的关键步骤。
摘要由CSDN通过智能技术生成

各位看官好,本文是Android Framework之Activity启动流程的第二篇,接下来将为大家带来开启Activity进程的流程。
第一篇:Android Framework之Activity启动流程(一)
第三篇:Android Framework之Activity启动流程(三)

ActivityManagerService

这里又回到了ActivityManagerService。
我们先来看一下ActivityManagerService# startProcessLocked()
在ActivityStackSupervisor里调用的其实是另外一个startProcessLocked()方法,在这个方法里又调用了它的重载方法。所以我们直接来看看它的重载方法做了什么事。

final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,
                                       boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge, String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) {
    long startTime = SystemClock.elapsedRealtime();
    ProcessRecord app;
    if (!isolated) {
        //根据进程名和UID查找相应的ProcessRecord,
        //当第一次启动app时这里返回值为null
        app = getProcessRecordLocked(processName, info.uid, keepIfLarge);
        checkTime(startTime, "startProcess: after getProcessRecord");

        if ((intentFlags & Intent.FLAG_FROM_BACKGROUND) != 0) {
            //如果当前进程处于后台进程,检查当前进程是否为bad进程
            if (mAppErrors.isBadProcessLocked(info)) {
                return null;
            }
        } else {
            //当用户明确要启动一个进程时,则清空它的crash次数
            //在看见crash对话框之前它才不会成为一个bad进程
            mAppErrors.resetProcessCrashTimeLocked(info);
            if (mAppErrors.isBadProcessLocked(info)) {
                EventLog.writeEvent(EventLogTags.AM_PROC_GOOD,
                        UserHandle.getUserId(info.uid), info.uid,
                        info.processName);
                mAppErrors.clearBadProcessLocked(info);
                if (app != null) {
                    app.bad = false;
                }
            }
        }
    } else {
        //如果它是一个孤立的进程,则它无法使用现存的进程
        app = null;
    }

    //当已经存在ProcessRecord且其pid大于0(app早已经运行或者正在启动)
    //则不会清理该进程
    if (app != null && app.pid > 0) {
        if ((!knownToBeDead && !app.killed) || app.thread == null) {
            // 如果它是新的包,则将其添加到列表中
            app.addPackage(info.packageName, info.versionCode, mProcessStats);
            return app;
        }

        //当ProcessRecord被attach到之前的进程,就清理它
        killProcessGroup(app.uid, app.pid);
        handleAppDiedLocked(app, true, true);
    }

    String hostingNameStr = hostingName != null
            ? hostingName.flattenToShortString() : null;
    if (app == null) {
        checkTime(startTime, "startProcess: creating new process record");
        //根据ApplicationInfo、processName、UID创建一个ProcessRecord对象
        app = newProcessRecordLocked(info, processName, isolated, isolatedUid);
        if (app == null) {
            return null;
        }
        app.crashHandler = crashHandler;
        checkTime(startTime, "startProcess: done creating new process record");
    } else {
        //如果在进程中它是新的一个包,则添加它到列表里
        app.addPackage(info.packageName, info.versionCode, mProcessStats);
        checkTime(startTime, "startProcess: added package to existing proc");
    }

    //如果系统仍未准备好,则推迟启动它,将app加入hold列表
    if (!mProcessesReady
            && !isAllowedWhileBooting(info)
            && !allowWhileBooting) {
        if (!mProcessesOnHold.contains(app)) {
            mProcessesOnHold.add(app);
        }
        checkTime(startTime, "startProcess: returning with proc on hold");
        return app;
    }

    checkTime(startTime, "startProcess: stepping in to startProcess");
    //======== 注释2 ========调用重载方法启动进程
    startProcessLocked(app, hostingType, hostingNameStr, abiOverride, entryPoint, entryPointArgs);
    return (app.pid != 0) ? app : null;
}

这个方法主要是处理一些情况下ProcessRecord中的数据,创建新进程的代码在它的重载方法里,继续分析。

ActivityManagerService# startProcessLocked()
见注释2处

private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {
    //如果ProcessRecord的pid>0且不为当前进程的pid
    //就从mPidsSelfLocked移除该pid
    //当进程不存在时,pid=0
    if (app.pid > 0 && app.pid != MY_PID) {
        synchronized (mPidsSelfLocked) {
            mPidsSelfLocked.remove(app.pid)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值