update OS/Android/启动过程.md : 添加zygote启动过程

This commit is contained in:
shzhxh 2019-06-21 17:19:27 +08:00
parent d95f2d43f9
commit 59333672a2
2 changed files with 51 additions and 6 deletions

View File

@ -1,3 +1,5 @@
参考了:[foxleezh/AOSP](https://github.com/foxleezh/AOSP)
#### step1: boot rom
执行固化在rom中的指令把boot loader加载到内存跳转到boot loader继续执行。
@ -202,6 +204,47 @@ Zygote是一个虚拟机进程由init进程启动。Zygote预加载以及初
##### Zygote进程之参数解析
app_main.cpp里的main函数主要做的就是参数解析。此函数有两种启动模式一是作为Zygote进程进行初始化一是作为普通应用程序启动。两者最终都是调用AppRuntime对象的start函数加载对应的java类(ZygoteInit或RuntimeInit),并将之前整理的参数传入进去。
1. 将参数argv[]放入字符串argv_string
2. 创建AppRuntime对象runtime并传入除argv[0]的所有参数
3. '--'之前或以非'-'开头的参数都将传入vm(即/system/bin)vm参数后的第一个参数(即Xzygote)不再使用。--zygote的意思是开启zygote模式--start-system-server的意思是开启系统服务--socket-name指定socket的名称。必须复制参数字符串但进入vm的spaced commands是个例外。
4. spaced_commands里定义的两个参数是Java程序需要依赖的Jar包
5. 使用runtime.addOption方法加入参数要加入的都是'--'开头的参数但若包含spaced_commands里的参数则直接加入
6. 判断zygote, niceName, startSystemServer, application, niceName.setTo, className.setTo的值它们主要决定了启动模式。
7. 如果className非空表明不是zygote模式只需传送程序参数即可。否则就是zygote模式则创建Dalvik缓存加入start-system-server参数加入abiFlag参数加入剩下的参数。
8. 如果niceName非空则设置进程别名。
9. 如果是zygote模式则加载ZygoteInit如果是application模式则加载RuntimeInit否则打印错误。
##### 创建虚拟机
frameworks/base/core/jni/AndroidRuntime.cpp里的start方法
1. 打印一些日志设置环境变量ANDROID_ROOT。
2. jni_invocation.Init初始化JNI
首先通过dlopen加载libart.so获得其句柄然后调用dlsym从libart.so中找到相关函数用于后续的虚拟机创建。
3. startVm创建虚拟机
一是从各种系统属性中读取一些参数然后通过addOption设置到AndroidRuntime的mOptions数组二是使用libart.so中的JNI_CreateJavaVM将这些参数传入。
4. onVmCreated表示创建完成
5. startReg注册JNI函数
首先设置了Android创建线程的处理函数然后创建了一个局部引用作用域最后调用refister_jni_procs进行JNI注册
6. JNI方式调用ZygoteInit类的main函数
##### JNI反射调用Java
frameworks/base/core/jni/AndroidRuntime.cpp里的start方法
1. 首先把参数保存在strArray里
2. 启动VM此线程将成为VM的主线程此线程不会返回除非VM退出。
#### step6: System Servers
Zygote启动系统服务即ZygoteInit类里的startSystemServer方法。

View File

@ -1,18 +1,19 @@
可以通过命令vimtutor学习。
可以通过命令**vimtutor**学习。
#### 语法
```
vim [options] [file ..]
vim [options] -
vim [options] -t tag
vim [options] -q [errorfile]
vim [options] [file ..] # 编辑指定文件
vim [options] - # 从标准输入读取文本
vim [options] -t tag # 编辑tag所在文件
vim [options] -q [errorfile] # 编辑首先出错的文件
```
#### 选项
```
-d # 比较多个文件的差异。就像vimdiff那样工作。
-d # 比较多个文件的差异。等价于vimdiff。
-R # 只读模式。等价于view。
```
#### 使用示例
@ -98,6 +99,7 @@ V # 选择,以行为单位
```
:vsp filename # 纵向分屏并打开文件filename
:sp filename # 横向分屏并打开文件filename
ctrl+w+[hjkl] # 分屏左下上右切换
```
##### 移动光标