深入理解 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()方法主要是检查是否发生死锁。
参考: