Android启动分析

来源:互联网 发布:淘宝的钻石和皇冠 编辑:程序博客网 时间:2024/06/07 19:16

--------------------------------------

启动脚本init.rc分析:

system/core/init/init.cpp/main()    init_parse_config_file("/init.rc")    action_for_each_trigger("early-init", action_add_queue_tail)    action_for_each_trigger("init", action_add_queue_tail)    while (true) {        execute_one_command()        restart_processes()    }

system/core/init/readme.txt


import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /init.usb.configfs.rc
import /init.${ro.zygote}.rc
import /init.trace.rc


getprop/setprop, getevent


init.rc有两种语句块:Action语句块(on <trigger> + <commands>),service语句块(service <name> <path> [args] + <option>)

trigger:

boot = 当init程序执行并载入/init.conf时触发。


command:

write <path> <string> =向文件中写入字符串。

trigger <event> =触发事件

setkey =

setprop <name> <value> =


option:

class <name> = 给服务指定一个类属,方便多个服务同时启动或停止。

socket <name> <type> <perm> ... = 在/dev/socket/下创建一个unix domain socket。

onrestart <cmd> = 当服务重启时执行cmd


service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server    class main    socket zygote stream 660 root system    onrestart write /sys/android_power/request_state wake    onrestart write /sys/power/state on    onrestart restart media    onrestart restart netd    writepid /dev/cpuset/foreground/tasks

-------------------------------------------

zygote分析

frameworks/base/cmds/app_process/app_main.cpp

main()    runtime.start("com.android.internal.os.ZygoteInit", args, zygote)    AndroidRuntime::start() // frameworks/base/core/jni/AndroidRuntime.cpp        startVm()        startReg()        env->CallStaticVoidMethod()  // 调用com.android.internal.os.ZygoteInit的main函数   

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

main()    registerZygoteSocket(socketName)   // 创建unix套接字,监听ams发过来的fork请求    preload()    startSystemServer()        pid = Zygote.forkSystemServer()             nativeForkSystemServer()                 // frameworks/base/core/jni/com_android_internal_os_Zygote.cpp                 com_android_internal_os_Zygote_nativeForkSystemServer()                     ForkAndSpecializeCommon()                         fork()        if (pid == 0) {            // 子进程上下文            if (hasSecondZygote(abiList)) {                waitForSecondaryZygote(socketName);            }            handleSystemServerProcess(parsedArgs);        }    runSelectLoopMode()  // 循环监听外来请求

SystemServer子进程

handleSystemServerProcess()    


Native程序运行:

Android bionic提供的加载器/system/bin/linker相当于glibc的/lib/ld-linux-xx.so。Shell运行native程序时,通过系统调用(bionic->kernel)fork和exec进入kernel,kernel加载二进制文件及一些系统动态库,启动加载器/system/bin/linker/__linker_init(),分析二进制ELF文件格式,加载依赖的动态库,然后转入二进制映像的入口函数__start。__start调用C库的初始化函数__libc_init(),__libc_init()调用映像的main函数及exit()退出进程。

Java程序运行:

Zygote程序以natvie程序形式启动之后,再通过fork启动新的进程运行java程序。java进程没有执行exec调用,目的是共享java的核心库。通过System.loadLibrary()方法加载so库即dlopen加载so库,linker会分析处理so库的ELF信息,加载其他依赖的so库。