本文的分析基于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