Android系统的初始化过程是init进程开始的。它在加载linux基本内核后就开始运行。那么系统怎么样知道它应该加载init进程呢?原来是从android加载linux内核时,就设置了下面的参数: Kernelcommand line: noinitrd root=/dev/nfs console=ttySAC0 init=/initnfsroot=192.168.1.103:/nfsbootip=192.168.1.20:192.168.1.103:192.168.1.1:255.255.255.0::eth0:on 在这行命令里,就是告诉linux内核初始化完成后开始运行init进程,由于init进程就是放在系统根目录下面。而这个进程的代码,就是位于源码的目录system/core/init下面。init是一个进程,确切的说,它是Linux系统中用户空间的第一个进程,由于Android是基于Linux内核的,所以init也是Android系统空间中的第一个进程,它的进程号是1.作为天字第一号进程,它被赋予了很重要的职责。 1.负责创建系统中的几个关键进程,尤其是zygote,它是Java世界的开创者。
这里不贴解析文件的代码,可是当细细分析代码之后,我不禁对写这个解析文件的程序员心生景仰。 前面说过解析这个文件是奠定全局基调的,没有它,android一事无成。的确是这样! 文件中有些行是以on、#或者service开头的,其中#开头的是注释,不多说。以on或service开头的称为一个section, android维护了三个双向链表,分别是action_list、service_list、action_queue.action_list存放的是所有要执行的动作, 解析函数在解析每一个section的时候,如果是on的,就表明是一个action,则把这个action加入action_list中,比如init、boot都是action,而这个action下面会跟着很多的command,解析函数会把这个action下面的所有command链成一个双向链表,保存在action结构体的commands成员中。如果是service,表明是一个服务,则把这个service加入service_list中,这个service下面有很多options,解析函数会根据这些不同的option执行不同的动作,对服务的信息进行设置,其中包括设置环境信息,创建套接字,设置重启标记等等。 解析完init.rc之后,两个链表中已经保存了所有要执行的动作和要启动的服务了。 在讲android什么时候执行这些动作之前得先知道,android的init把这些动作执行的时间分为四个阶段:early-init、init、early-boot、boot。注意,这里说的执行动作仅仅是action,不涉及service(后面会讲到service的启动其实是在这些action中的某一个command中启动的)。 这时候init调用action_for_each_trigger(ACTIONNAME,action_add_queue_tail);把ACTIONNAME阶段的要执行的command添加到action_queue中,以执行。其中ACTIONNAME就是上面所说的四个阶段中的一个,顾名思义,得先执行early-init中的command。这里加个小插曲:分析完整个配置文件后,其实没发现存在early-init和early-boot阶段,可能这是允许在以后的开发中如果需要在init阶段之前添加些动作的话,就直接修改配置文件就行了。这就为我们自由选择启动项或者个性化开机动作提供了接口。 然后调用drain_aciton_queue执行action_queue里面的commands。综观配置文件,这些执行的动作主要有设置环境变量、创建文件目录、挂载文件系统、设置系统属性、设置某些文件目录的属性等。 接下来init得初始化设备文件、属性空间、/dev/keychord设备,然后加载开机动画文件,然后设置一些系统只读属性。 完了之后,init要启动属性服务器,这个属性服务器的作用就是允许客户端通过与之交互来设置属性或者查看属性,这也是唯一的方法。 说了这么多好像还没启动service,其实所有service是在boot阶段中的一个命令中启动的 /* class_start default */ 这个命令执行的动作是启动所有classname为default的服务,其实在启动的时候,所有的服务都是default的,这时候就会把service_list中所有classname为default的服务启动,zygote当然也不例外。但是有些服务由于标记了disable性质,所以它不随着这样的类启动而启动,这些服务的启动是另外的时机了。 在所有动作都执行完毕之后,init进入一个死循环,在循环中检测哪些死去的服务需要重启并重启之。 至此,init函数启动完毕,具体init如何处理接收到的各种消息,zygote死后如何重启,android启动完init之后,再执行什么样的动作,启动流程往何处去?且听下回分解。。。。 仅是个人理解,欢迎指正:-D |
android 系统进程的进程id 安卓系统init进程号
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
android进程号 安卓进程id查看
【Android 进程保活】oom_adj 值 ( 根据 查询进程 PID | 根据进程 PID 查询 oom_adj 值 )
android进程号 Android 用户名 进程优先级 -
android log 进程号 安卓进程id查看
根据包名查看adb shell pidof my.app.package ps -T -p pid
android log 进程号 包名 -
android 进程后台 安卓系统进程
在Android里,进程和程序是两回事,程序可以一直保留在系统里,但是没有任何进程在后台运行,也不消耗任何系统资源。所有的程序保留在内存中,这样可以更快的启动回到它之前的状态。当你的内存用完了,系统会自动帮你杀掉不用的应用或任务。 每一个Android应用都是以一个进程的方式运行的,其生命周期不是有自身控制,而是由系统根据运行的应用的一些特征来决定。 Android在进程活动停
android 进程后台 android ubuntu android开发 android android应用 -
android 查看所有进程id 安卓系统查看所有进程
adb shell 进入手机后,执行ps就能显示手机里所有正在运行的进程。一、ps命令详细说明1,ps的命令参数:-t -x,-P,-p,-c [pid|name] -t显示进程下的线程列表 -x 显示进程耗费的用户时间和系统时间,单位s -P 显示调度策略,通过是bg or fg ,当获取失败将会un和er比之前打印的内容多出了一列PCY
android 查看所有进程id Android adb shell ps 优先级 Android -
android 进程名字 安卓进程id查看
ADB查看手机端APP的进程ID(PID)adb shell top 最后一列是包名,知道包名就知道APP运行的PID了
android 进程名字 APP PID APP进程 包名 手机端