update OS/Android/启动过程.md : 添加zygote启动过程
This commit is contained in:
parent
d95f2d43f9
commit
59333672a2
|
@ -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方法。
|
||||
|
|
|
@ -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] # 分屏左下上右切换
|
||||
```
|
||||
|
||||
##### 移动光标
|
||||
|
|
Loading…
Reference in New Issue