深入理解 Android:系统初始化
系统初始化(init):
加载并解析配置文件:
调用
parse_config()
解析 init.rc;init.rc 中包含一个个 section,调用
parse_new_section()
逐个解析;parse_new_section()
内部调用parse_service()
和parse_line_service()
;
创建 zygote:
zygote 被放在一个 service section 中;
zygote 完全解析结束后,得到
service_list
、socketinfo
、commands
三个双向链表;zygote 最初名叫
app_process
,在main()
函数中:先调用
set_process_name()
改名;然后调用
AppRuntime.start()
创建虚拟机,开启 Java 世界;最后创建系统服务驻留的
SystemServer
进程;
启动 PropertyService:
调用
property_init
初始化属性相关的资源,内部先调用init_property_area()
创建属性存储区域;调用
property_start_service()
启动属性服务,内部调用create_socket()
创建 socket;调用
property_set()
发送请求,内部调用send_prop_msg()
;调用
handle_property_set_fd()
处理请求:进入
for(;;)
循环:处理请求;重启所有
flag
标志为SVC_RESTARTING
的 service。
AppRuntime(App_main.cpp):
AppRuntime
继承AndroidRuntime
,重写了onStarted()
、onZygoteInit()
、onExit()
三个函数;AndroidRuntime::start()
方法:调用
startVM(&mJavaVM, &env)
启动虚拟机;内部先调用property_get()
设置虚拟机的heapSize
,然后调用JNI_CreateJavaVM()
创建;调用
startReg(env)
注册 JNI 函数;内部先调用androidSetCreateThreadFunc()
创建线程,然后调用register_jni_procs()
;调用
env.CallStaticVoidMethod()
函数,传的参数是ZygoteInit.java
的main()
方法,正式进入 Java 世界。
ZygoteInit.java:
建立 IPC 通信服务端:
Zygote
及系统中其他程序的通信没有使用Binder
,而是Socket
;registerZygoteSocket()
方法内部创建了LocalSocketServer
对象;
预加载类和资源:
preloadClasses()
方法:内部通过
ClassLoader
和反射加载 preload_classes 文件中的 1000 多个系统类;preload_classes 文件由 framework/base/tools/preload 工具生成,它需要判断每个类加载时间是否超过 1.25 毫秒,超过即被写入该文件;
预加载类文件节约了
Zygote
在 fork 子进程时的启动时间(可以直接复制甚至和父进程共享);
preloadResources()
方法主要是加载 framework_res.apk 中的资源;
启动系统服务驻留进程:
startSystemServer()
方法内部先调用Zygote.forkSystemServer()
方法 fork 出 system_server 进程;然后调用
handleSystemServerProcess()
处理该进程的工作;
等待 Socket 请求:
在
runSelectLoopMode()
方法中进行;客户端请求由
ZygoteConnection
对象表示;调用
ZygoteConnection的runcOnce()
方法处理请求;
Zygote 的分裂(启动 Activity 为例):
ActivityManagerService
调用Process
类的start()
,创建并连接和Zygote
通信的LocalSocket
;ZygoteInit
在runSelectLoopMode()
中接收到ZygoteConnection
请求后,调用该对象的runOnce()
方法;根据 socket 传过来的参数 fork 新的子进程,并执行其
main()
方法;
SystemServer:
main() 方法:
调整系统时钟,从 1970 开始;
如果系统开启了性能统计,则启动
TimerTask
,每隔 1 小时统计性能信息写入文件;设置 Dalvik 的 Heap 利用率为 0.8f;
加载动态库 libandroid_servers.so,执行 native 函数
init1()
初始化 Binder、SurfaceFlinger
等;回到 Java 层调用
init2()
,创建ServerThread
线程,启动WindowManagerService
、ActivityManagerService
、PowerManagerService
等系统核心服务,初始化Watchdog
;
创建(forkSystemServer 方法):
调用
forkAndSpecializeCommon()
函数创建子进程;检查 system_server 进程是否退出,如果退出,则调用
kill()
杀掉 Zygote 自己;
处理(handleSystemServerProcess 方法):
调用
zygoteInitNative()
; 创建 ThreadPool 用于 Binder 通信;调用
invokeStaticMain()
; 抛出异常,在捕获异常时用反射执行SystemServer的main()
方法;
Watchdog:
主要是检查几个重要的系统 Service,一旦发现问题就杀掉 system_server,而 Zygote 也会自杀;
创建和初始化:
构造方法创建
HeartbeatHandler
对象和GlobalPssCollected
对象(和内存信息有关);init()
方法获得系统当前时间,设置AlarmManager
;
启动:
隔一段时间给另一个线程发送 MONITOR
信息,该线程检查各 Service 状态,如果第二次仍然未返回则杀掉 system_server
;
检查:
主要检查
PowerManagerService
、ActivityManagerService
、WindowManagerService
;要想被
Watchdog
检查,必须实现monitor
接口,并调用Watchdog
的addMonitor()
方法将自己加入检查队列;HeartbeatHandler
会在handleMessage
方法中调用monitor()
方法检查;Service的motinor()
方法主要是检查是否发生死锁。
参考: