type
status
date
slug
summary
tags
category
icon
password
zygote是通过app_process或者app_process64命令行程序启动的.
先来看下app_process的流程:

app_process

strdup():返回一个字符串指针,指向新复制的字符串
int strncmp ( const char * str1, const char * str2, size_t n ): 比较两个字符串的前n个字符,如果相等,则返回0
app_process 根据传入参数不同分为两种模式:
  • zygote模式,用于启动zygote进程 传入--zygote
  • 非zygote模式,用于启动普通的java程序 比如常用的adb shell 下的命令,如am,monkey,appwidget等:
    系统启动的时候,我们分析zygote模式.
    实际上不管哪个模式,都会执行AndroidRuntime::start()方法,区别是传入的启动类不同:

    AndroidRuntime

    AndroidRuntime启动过程主要做了三件事:
    • 启动Android虚拟机,即ART Runtime
    • 注册一些内置的Native方法(JNI)
    • 通过JNI调用执行ZygoteInitmain()方法
    虚拟机是如何启动的,Native方法是如何注册的,这里暂时不分析,重点关注Zygote进程的启动.

    ZygoteInit#main()

    这里主要做以下几件事:
    • 创建ZygoteServer,利用local socket + file descriptor 机制响应应用的fork请求
    • 预加载一些jar包中的class,classloader,一诶Android资源,共享库,图形驱动等
    • 启动完之后运行几次GC清理下资源
    • 从Zygote进程中使用fork方式创建system server进程
    Local socket + fd 这一套机制暂时还不熟悉,后面再总结一下.
    预加载的有以下内容:
    • /system/etc/preloaded-classes 文件中记录的类
      • 包括Android Framework中的类,通过Class.forName(className,true,null)加载
    • 缓存一些非启动类的classloader
      • 比如HIDL和Android test相关的
    • 公共资源,让所有进程可以共享
      • com.android.internal.R.array.preloaded_drawables 中的内容
      • com.android.internal.R.array.preloaded_color_state_lists
      • com.android.internal.R.bool.config_freeformWindowManagement
    • HAL库
    • 图像库驱动,比如OpenGL 或者 Vulkan驱动
    • TextView的字体资源
    • WebView相关的so库,libwebviewchromium_loader.so

    创建system_server进程

    在ZygoteInit##forSystemServer方法中:
    可以看到首先会初始化一些参数,比如uid,gid等.然后从Zygote进程利用fork方式创建system_server进程:
    其中的native方式是一个JNI调用,源码在frameworks/base/core/jni/com_android_internal_os_Zygote.cpp中,所使用的还是localsocket + fd的那一套机制.
    在system_server 创建成功之后,会执行handleSystemServerProcess方法:
    这里会设置进程的名字,dex opt 一些system_server相关的jar,并设置PathClassLoader,最终会执行到RuntimeInit中,并找到 SystemServer.java的main方法,并执行:
    到这个时候system_server进程已经创建完毕,后面开始执行SystemServer中的一序列操作了.

    总结

    1. Zygote进程的入口其实在ZygoteInit中;
    1. Zygote进程是通过app_process进程启动的
    1. zygote fork出其他进程依赖了localsocket + fd的机制
    1. 在启动Zygote进程之前,会先启动虚拟机,然后注册一些Native/JNI方法
    1. Android中每个进程都只有一个虚拟机,每个线程代表了着一个JNIEnv
    1. Zygote可以说是第一个Java进程
    1. system_server进程严格意义上并不是zygote主动启动的,而是创建zygote进程的过程中,一起fork出来的,只不过是zygote fork的.
    Android系统启动流程分析Android系统启动流程-SystemServer分析
    Loading...