深入理解 Android:系统初始化

系统初始化(init):

加载并解析配置文件:

  1. 调用 parse_config() 解析 init.rc;

  2. init.rc 中包含一个个 section,调用 parse_new_section() 逐个解析;

  3. parse_new_section() 内部调用 parse_service()parse_line_service();

创建 zygote:

  1. zygote 被放在一个 service section 中;

  2. zygote 完全解析结束后,得到 service_listsocketinfocommands 三个双向链表;

  3. zygote 最初名叫 app_process,在 main() 函数中:

    1. 先调用 set_process_name() 改名;

    2. 然后调用 AppRuntime.start() 创建虚拟机,开启 Java 世界;

    3. 最后创建系统服务驻留的 SystemServer 进程;

启动 PropertyService

  1. 调用 property_init 初始化属性相关的资源,内部先调用 init_property_area() 创建属性存储区域;

  2. 调用 property_start_service() 启动属性服务,内部调用 create_socket() 创建 socket;

  3. 调用 property_set() 发送请求,内部调用 send_prop_msg()

  4. 调用 handle_property_set_fd() 处理请求:

    1. 进入 for(;;) 循环:处理请求;

    2. 重启所有 flag 标志为 SVC_RESTARTING 的 service。

AppRuntime(App_main.cpp):

  • AppRuntime 继承 AndroidRuntime,重写了 onStarted()onZygoteInit()onExit() 三个函数;

  • AndroidRuntime::start()方法:

    1. 调用 startVM(&mJavaVM, &env) 启动虚拟机;内部先调用 property_get() 设置虚拟机的 heapSize,然后调用 JNI_CreateJavaVM() 创建;

    2. 调用 startReg(env) 注册 JNI 函数;内部先调用 androidSetCreateThreadFunc() 创建线程,然后调用 register_jni_procs()

    3. 调用 env.CallStaticVoidMethod() 函数,传的参数是 ZygoteInit.javamain() 方法,正式进入 Java 世界。

ZygoteInit.java:

建立 IPC 通信服务端:

  1. Zygote 及系统中其他程序的通信没有使用 Binder,而是 Socket;

  2. registerZygoteSocket() 方法内部创建了 LocalSocketServer 对象;

预加载类和资源:

  1. preloadClasses() 方法:

    • 内部通过 ClassLoader 和反射加载 preload_classes 文件中的 1000 多个系统类;

    • preload_classes 文件由 framework/base/tools/preload 工具生成,它需要判断每个类加载时间是否超过 1.25 毫秒,超过即被写入该文件;

    • 预加载类文件节约了 Zygote 在 fork 子进程时的启动时间(可以直接复制甚至和父进程共享);

  2. preloadResources() 方法主要是加载 framework_res.apk 中的资源;

启动系统服务驻留进程:

  1. startSystemServer() 方法内部先调用 Zygote.forkSystemServer() 方法 fork 出 system_server 进程;

  2. 然后调用 handleSystemServerProcess() 处理该进程的工作;

等待 Socket 请求:

  1. runSelectLoopMode() 方法中进行;

  2. 客户端请求由 ZygoteConnection 对象表示;

  3. 调用 ZygoteConnection的runcOnce() 方法处理请求;

Zygote 的分裂(启动 Activity 为例):

  1. ActivityManagerService 调用 Process 类的 start(),创建并连接和 Zygote 通信的 LocalSocket;

  2. ZygoteInitrunSelectLoopMode() 中接收到 ZygoteConnection 请求后,调用该对象的 runOnce() 方法;

  3. 根据 socket 传过来的参数 fork 新的子进程,并执行其 main() 方法;

SystemServer:

main() 方法:

  1. 调整系统时钟,从 1970 开始;

  2. 如果系统开启了性能统计,则启动 TimerTask,每隔 1 小时统计性能信息写入文件;

  3. 设置 Dalvik 的 Heap 利用率为 0.8f;

  4. 加载动态库 libandroid_servers.so,执行 native 函数 init1() 初始化 Binder、SurfaceFlinger 等;

  5. 回到 Java 层调用 init2(),创建 ServerThread 线程,启动 WindowManagerServiceActivityManagerServicePowerManagerService 等系统核心服务,初始化 Watchdog

创建(forkSystemServer 方法):

  1. 调用 forkAndSpecializeCommon() 函数创建子进程;

  2. 检查 system_server 进程是否退出,如果退出,则调用 kill() 杀掉 Zygote 自己;

处理(handleSystemServerProcess 方法):

  1. 调用 zygoteInitNative(); 创建 ThreadPool 用于 Binder 通信;

  2. 调用 invokeStaticMain(); 抛出异常,在捕获异常时用反射执行 SystemServer的main() 方法;

Watchdog:

主要是检查几个重要的系统 Service,一旦发现问题就杀掉 system_server,而 Zygote 也会自杀;

创建和初始化:

  1. 构造方法创建 HeartbeatHandler 对象和 GlobalPssCollected 对象(和内存信息有关);

  2. init() 方法获得系统当前时间,设置 AlarmManager;

启动:

隔一段时间给另一个线程发送 MONITOR 信息,该线程检查各 Service 状态,如果第二次仍然未返回则杀掉 system_server;

检查:

  1. 主要检查 PowerManagerServiceActivityManagerServiceWindowManagerService;

  2. 要想被 Watchdog 检查,必须实现 monitor 接口,并调用 WatchdogaddMonitor() 方法将自己加入检查队列;

  3. HeartbeatHandler 会在 handleMessage 方法中调用 monitor() 方法检查;

  4. Service的motinor() 方法主要是检查是否发生死锁。


参考:

《深入理解 Android: 卷 I》