keystore文件_安卓第一号进程分析|init.rc文件分析

b0f09e125b930af4af49d2e3fc6c32a2.png

简介

init进程是Android系统的第一个进程,主要任务是读取并解析rc文件。rc文件是Android系统的关键配置文件。

init源码

init模块大概有几十个文件,位于system目录里面。模块支持独立编译,通过模块内的Android.mk控制。模块编译生成可执行文件init,生成到$(PRODUCT_OUT)/root/。

Android/system/core/init/

Android/system/core/init/init.cpp

init进程的职责:设置文件属性、添加环境变量、安装基本文件系统、屏蔽标准输入输出、启动kernel日志(默认是level5)、安装selinux并加载selinux policy、创建epoll句柄、启动属性服务、解析init.rc文件、进入while无限循环处理command和等待属性事件。

a2682978b422498a0a5761f02fceb2d7.png
3eb100348a97398049728cd94dc5f5a5.png
b9643b96af5e63647a2a57bbc35710c8.png

init主流程图

init主流程在android/system/core/init/init.cpp的main()函数。下面详细分析几个关心的阶段。

添加环境变量

e03d66e8493036319ef11f9a3ee8defb.png
0d8a741b26ee011ae5dea0b2aab8a6ef.png

这个函数的逻辑很简单。就是向指针数组ENV中写入"PATH=${_PATH_DEFPATH}"。ENV是32长度的指针数组,文件前面有定义,最后一个保留,用于结束这个结构体,所以实际只能设置31个环境变量。for循环,从第一个开始检索,如果过这个变量没有用过或者这个变量保存的key和当前要设置的是同一个,就用这个变量来存放当前要设置的环境变量entry;否则,继续检索下一个。设置成功返回0;如果检索完ENV,没有找到一个合适的,就打印错误信息并返回-1。

_PATH_DEFPATH是在bionic/libc/include/paths.h中定义的。所以这里就是把"PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin"保存到数据结构ENV变量中。

2a850e8749bdbd9653f2e49041f0dd9a.png

关于运行阶段(is_first_stage)

在init进程中有部分代码块以is_first_stage标志进行区分,决定是否需要进行初始化,而is_first_stage的值,由init进程main函数的入口参数决定。 其原因在于,在引入selinux机制后,有些操作必须要在内核态才能完成;

但init进程作为android的第一个进程,又是运行在用户态的。

于是,最终设计为用is_first_stage进行区分init进程的运行状态。init进程在运行的过程中,会完成从内核态到用户态的切换。

开启属性服务

10282ba0ca43ad0d2eb768a2349c2368.png

逻辑也很简单,创建一个socket,然后监听,设置处理函数handle_property_set_fd()。PROP_SERVICE_NAME是在ndk的_system_properties.h文件中定义的。

c7d60c7c3a9828023e9f9ad5c746c6c3.png

handle_property_set_fd()函数会从property_service文件中读取其它进程的输入请求,然后调用property_set()(此处的property_set不是经常调用的,而是在本文件中定义的)函数设置系统属性,然后会调用__system_property_add()函数,这个函数在libc.so里面。

selinux policy文件及里面的规则

后面也会通过一篇专门的文章来分享。

rc文件及里面的规则

安卓初始化语言AIL:Android Initial Language

init.rc文件

rc文件是Android系统的关键配置文件,使用AIL编写。除了进行文件系统创建、目录和文件的创建删除属性设置、一些其它配置之外,最关键的就是启动系统进程。这些进程包括两类,一类是main,一类是core,通过class关键字定义。

Android/system/core/rootdir/init.rc

4234e7a0d2318e14e6ceb21eef8f6bb5.png

ro.hardware的是芯片厂商对用芯片型号的名称。ro.zygote的值可以是:zygote32、zygote64、zygote32_64、zygote64_32。分别对应系统32位模式、64位模式、32(主模式)兼容64、64(主模式)兼容32。

init.${ro.hardware}.rc是芯片厂商的配置文件,init.${ro.zygote}.rc是不同位数系统的配置。这里首先会执行init.rc里面的配置,然后根据import的顺序,逐个执行要导入的rc文件。

init.${ro.zygote}.rc文件中是zygote的配置。zygote通过class_start main启动,需要触发action nonencrypted。action触发是在init.${ro.hardware}.rc文件的mount_all。mount_all定义在system/core/init/builtins.cpp。

init对rc文件里面的设置分为三个阶段,依次是early-init、init、late-init。在late-init阶段会依次触发fs和boot触发器,对应的action会通过class_start命令来启动main和core程序。

fs

这个阶段会启动class是main的服务程序,比如firewalld(disabled)、mdnsd(disabled)、mtpd(disabled)、installd、bluetoothtbd、drm、mediadrm、mediaextractor、uncrypt(disabled)、setup-bcb(disabled)、clear-bcb(disabled)、cameraserver、media、mediacodec、keystore、audioserver、ril-daemon、netd、inputflinger、zygote等等。

boot

boot的最后阶段会依次启动class是core的服务进程,比如uevent、healthd、console、vold、lmkd、surfaceflinger、bootanim(disabled)、servicemanager等。有一些在system目录下,有一些在frameworks目录下。

init.zygote32.rc

c1549474563d302c15aebb79d073f49c.png

这里涉及到两个进程zygote和system_server,是Android系统最关键的进程之二。init进程启动zygote进程,传入start-system-server参数。zygote进程启动的过程中,会根据传入的参数启动system_server进程。

后备注

init启动阶段的打印。第一条打印:init first stage started!

1df9387ea2df2989569895ac5bbfd57c.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值