最近写一个native services,顺便学习了一下启动流程。看见了这个帖子说的很到位,赶紧分享一下。
android 启动过程及init.rc_init.target.rc_冷眼旁观之气的博客-CSDN博客吧吧
安卓的启动流程
1. 启动电源以及系统启动
当电源按下,引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序到RAM,然后执行。
2.bootloader
引导程序
3.内核启动
内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。
4.init进程
4.1action
格式
on <trigger> <command> <command> <command>
on early-init | 设置init进程以及它创建的子进程的优先级,设置init进程的安全环境 |
on init | 设置全局环境,为cpu accounting创建cgroup(资源控制)挂载点 |
on fs | 挂载mtd分区 |
on post-fs | 改变系统目录的访问权限 |
on post-fs-data | 改变/data目录以及它的子目录的访问权限 |
on boot | 基本网络的初始化,内存管理等等 |
service servicemanager | 启动系统管理器管理所有的本地服务,比如位置、音频、Shared preference等等… |
service zygote | 启动zygote作为应用进程 |
4.2 service
格式
capability class <name> //设定service的class console critical disabled group <groupname> [<groupname>]* //设定进程 keycodes oneshot //service只执行一次 onrestart //当service终止时自动重启 seclabel setenv socket user <username> ioprio
举例,bin 文件为mytest,那么该services的rc 可以这么写
on charger
wait ***
start mytest
on boot
wait ***
start mytest
service mytest 【mytest路径】
class mian
user root
group system
seclabel u:r:mytest:s0
oneshot
disabled
4.2.1 oneshot与disabled配套使用
在服务配置中,"oneshot"和"disabled"是两个不同的选项,它们可以单独使用,也可以一起使用。
"disabled"选项表示禁用该服务,即系统启动时不会自动运行该服务。
"oneshot"选项表示该服务只会在启动时执行一次,并在执行完毕后立即退出。它通常用于执行一些初始化任务或启动其他服务的操作。
当一个服务配置中同时设置了"oneshot"和"disabled"时,它的含义是这个服务是禁用的(disabled),并且在启动时只会执行一次(oneshot)。这意味着系统启动时不会自动运行该服务,并且该服务会在启动时执行一次特定的任务或操作,然后立即退出。
这种组合常用于执行一些初始化任务或临时性的操作,例如配置文件的生成、系统设置的调整等。一旦服务执行完毕,它将不再运行,直到下次手动触发或重新启动系统。
因此,"oneshot"与"disabled"的配套使用可以让你在需要时执行一次性任务,并且在不需要时将服务保持禁用状态。
4.2.2 service的class
core ueventd、logd、healthd、adbd(disabled)、lmkd(LowMemoryKiller)、servicemanager、vold、debuggerd、surfaceflinger、bootanim(disabled)等 //core分类中的服务都是一些核心服务,它们不启动,后续的服务或系统启动就可能出问题。比如servicemanager,binder通信大管家,它的启动很靠前,因为,其他服务启动时候需要向servicemanager注册binder服务。vold,负责存储类设备的挂载;还有surfaceflinger,图形显示的核心服务等。 main debuggerd64、drm、media、ril-daemon、installd、flash_recovery、racoon(disabled)、mtpd(disabled)、keystore、dumpstate(disabled)、mdnsd(disabled)、pre-recovery(disabled)、cmd_services(disabled)、phasecheckserver、zygote等。 // main分类中的服务是一些系统的基本服务,有了这些服务android系统、Java世界才能正常运行。 late_start 字面意思是晚些启动。 ///device/中一些硬件厂商的.rc文件中会将一些服务设置为该类
4.2.3 seclabel u:r:mytest:s0
u 表示用户,这个标签是为一个用户分配的。
r 表示角色,这个标签定义了用户的角色或权限组。
mytest 是用户的名称,可能是某个应用程序或服务的标识符。
s0 表示安全级别,通常表示最低的安全级别。
5.添加启动脚本init.target.rc
需要import 对应的rc。
除init.rc外,其他文件都由init.rc中以import语句导入,一般来说init.rc文件存放通用配置,而其他特定模块以及特定硬件的配置则放置在独立的文件中,这样设计可以使init.rc脚本简洁,方便系统维护和升级。
提前将自己的rc设置好 ,然后导入到init.target.rc里面去。