Android Framework之Activity启动流程(一)

本文的分析基于Android 8.1源码。

本文章将分三篇为大家讲解。
第二篇:Android Framework之Activity启动流程(二)
第三篇:Android Framework之Activity启动流程(三)

在文章的起始,插张时序图,先看结论再看过程。
这里写图片描述

Zygote

在Android系统中,是由ActivityManagerService负责为应用程序创建新进程的。至于ActivityManagerService本身进程,则是由Zygote负责启动。
Zygote翻译成中文,是受精卵。至于为啥叫这个名字,问设计Android系统的攻城狮去……
哈哈哈,开个玩笑。。。这里写图片描述
在Android中,大部分的应用进程都是由zygote来创建的,是不是跟受精卵的职责有点类似, emmm……
我们来看看Zygote是如何创建ActivityManagerService进程的。

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

public static void main(String argv[]) {
    ……
    //这句话大概可以猜出zygote和其他进程是通过Socket来通信的
zygoteServer.registerServerSocket(socketName);
……
boolean startSystemServer = false;
    for (int i = 1; i < argv.length; i++) {
        if ("start-system-server".equals(argv[i])) {
          startSystemServer = true;
          ……
        }else if {
}
     }
……

if (startSystemServer) {
    //在forkSystemServer中fork system server进程
    Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
……
}
}

/**
 * Prepare the arguments and forks for the system server process.
 *
 * Returns an {@code Runnable} that provides an entrypoint into system_server code in the
 * child process, and {@code null} in the parent.
 */
private static Runnable forkSystemServer(String abiList, String socketName,
        ZygoteServer zygoteServer) {

// …… 我是可爱的省略号 (*╹▽╹*)
int pid;

try {
    parsedArgs = new ZygoteConnection.Arguments(args);
    ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
    ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);

/* Request to fork the system server process */
//重点来了,通过Zygote的静态方法来fork sytem server进程
    pid = Zygote.forkSystemServer(
            parsedArgs.uid, parsedArgs.gid,
            parsedArgs.gids,
            parsedArgs.debugFlags,
            null,
            parsedArgs.permittedCapabilities,
            parsedArgs.effectiveCapabilities);
} catch (IllegalArgumentException ex) {
    throw new RuntimeException(ex);
}

/* For child process */
if (pid == 0) {
    if (hasSecondZygote(abiList)) {
        waitForSecondaryZygote(socketName);
    }
    zygoteServer.closeServerSocket();
    return handleSystemServerProcess(parsedArgs);
}
return null;
}

接下来就不进去看了,贴个Zygote.forkSystemServer方法的注释吧

/**
     * Special method to start the system server process. In addition to the
     * common actions performed in forkAndSpecialize, the pid of the child
     * process is recorded such that the death of the child process will cause
     * zygote to exit.
*/

SystemServer进程启动时,会顺带初始化ActivityManagerService,代码这里就不贴了,大家自己去搜就行。
路径:frameworks/base/services/java/com/android/server/SystemServer.java
搜索关键字: ActivityManagerService


Context.startActivity()

当我们需要打开一个Activity时,是不是经常这样干。
这里的Context并不是Context类,真正干活的是ContextImpl。
我们来看看具体的代码

@Override
public void startActivity(Intent intent, Bundle options) {
    // ……我是省略号
    mMainThread.getInstrumentation().execStartActivity(
            getOuterContext(), mMainThread.getApplicationThread(), null,
            (Activity) null, intent, -1, options);
}


Instrumentation

ContextImpl又雇佣了Instrumentation来帮它干活。
来看看具体的细节:
frameworks/base/core/java/android/app/Instrumentation.java
看看官方对Instrumentation的解释:
https://developer.android.com/reference/android/app/Instrumentation.html
没有梯子的小伙伴们 请点我
简单来说,Instrumentation最主要的作用就是监控系统和应用的交互

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值