Android FrameWork(二)
Zygote
知识回顾:
源码分析:
app_main.cpp: 创建AppRuntime extents AndroidRunTime
ZygoteInit.java: 创建ZygoteServer
preload() 预加载
拓展知识:
- 为什么在zygote中进行预加载资源呢?
Zygote 会fork我们的应用进程 而我们的fork的原理:读时共享 写时复制的机制来进行内存共享
Fork出来的子进程是共享的
然后调用gcAndFinalize()
- System.gc 和 Runtime.gc区别?
System.gc :java层函数 无法保证gc回收期调用,回收不一定立马执行,具体执行需要看虚拟机
Runtime.gc:native层函数
preloadClass :
加载的不同方式的区别?
Class.forName() class—>jvm中 class解释操作 static代码块
loadClass() class--> jvm中 newinstaceZygote是通过什么进行通信的?
通过socket进行通信并没有通过binder,因为这个过程binder还没有建立
Zygote 初始化native state
关闭线程限制
创建服务端new ZygoteServer:
forkSystemServer
循环等待,等待客户端请求链接进行处理
倒序方式,优先处理已经建立的连接请求,后处理新建立的连接
forkAndSpecialize :
pid=0 子线程
ProcessState 进程信息
创建进程信息 开启线程池 打开binder
总结:
app_main.cpp中
1,执行Main
2,创建AppRuntime
3,调用runtime.start
(com.android.internal.os.zygoteinit)
AndroidRuntime_AppRuntime.cpp中
4,startVim 创建java虚拟机
5,startReg注册JNI环境
6,通过jni调用唤起zygoteInit.main
zygoteInit.main中
7,forkSystemServer 创建systemserver
8,preload 预加载资源文件 包括activity fragment drawable 等
9,runSelectLoop 循环等待客户端请求链接
10,客户端连接的时候调用processOneCommand
Zygoteconnection.java中
11, native层。forkAndSpecialize fork子进程
12,handleChildProc 处理子进程 关闭socket
13,ProcessState 进程信息
创建进程信息 开启线程池 打开binder
14,RuntimeInit.applicaitonInit 对函数进行包装 然后进行一个返回
15,调用main函数