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库。
- Android启动分析
- Android启动过程分析
- Android 启动过程分析
- Android启动分析
- android启动过程分析
- android 启动分析
- android 启动过程分析
- Android启动过程分析
- Android启动过程分析
- android 启动过程分析
- Android启动模式分析
- android dalvik启动分析
- android 启动过程分析
- android启动流程分析
- android 蓝牙启动分析
- Android启动过程分析
- Android DHCP 启动分析
- Android启动分析
- ueditor 的java实现粘贴微信文章时 反微信反盗链
- 2017 最新的 cocoaPods 安装方法
- 在线编程四
- https 安全验证问题
- jQuery的ajax学习(一)表单序列化
- Android启动分析
- Mysql—实现批量插入,存在就更新,不存在就插入
- duplicate symbol
- redis集群搭建测试-2
- java 求数组中重复元素的个数
- C语言---计算机中小数存储
- 给RecyclerView添加头布局和底部布局(参考了网络代码)
- mac下卸载mysql
- iOS更新公有CocoaPods库的版本