Android FrameWork(二)

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中 newinstace

  • Zygote是通过什么进行通信的?
    通过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函数

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容