当前位置: 首页 > 科技观察

教你分析Android系统的启动过程

时间:2023-03-17 17:17:51 科技观察

在上一篇文章中,我们讲了Linux系统的启动过程。本文讲解Andorid系统的启动过程。手把手教你一步步分析Linux的启动过程。Android系统广泛应用于嵌入式行业。手机、平板、机器人、汽车中控系统都使用安卓系统。在应用方面的优势是Android系统有自己的UI。linux需要自己用QT开发界面,界面不是那么好看。Android系统架构图:从这张图可以看出,Android系统是基于Linux内核的。Linux之上有一个HAL层。这一层的原因是:Linux是开源的,基于它的修改也必须是开源的,所以Andorid在这里增加了一个HAL层,这样硬件厂商就不需要发布自己的代码了。Native层用C++语言实现,Framework层和app层用Java语言实现。也就是说,要想了解Android系统,就需要精通C、C++、Java这三种语言。上一篇文章分析了Linux系统的启动过程。Android系统的启动过程与Linux类似,只是init进程启动后,做了不同的事情。Android系统启动过程如下:1)BootROM是固化在硬件中的一段代码。一般是固定的。它的作用是检测基础硬件是否存在,比如检测EMMC是否存在。如果存在,将bootloader从EMMC复制到SRAM中,启动系统,交给bootloader。2)Android系统的bootloader不是uboot,而是LK(littlekernel),专门用来启动Android系统的。3)bootloader初始化完成后,跳转到Linux内核的start_kernel函数。这个函数最终生成kernel_init和kthreadd。kernel_init之后,会从内核空间跳转到用户空间,成为用户空间的init进程,PID=1,kthreadd(PID=2)是内核进程,专门用来监听请求创建一个内核进程。它维护一个链表。如果需要创建内核进程,就会在链表上创建。当然你可以看到图中有一个swapper(PID=0)进程。它是系统中唯一不使用fork创建的进程。kernel_init和kthreadd就是由它创建的。swapper也叫idleprocess,空闲进程,它运行的时候就是系统空闲的时候。4)当kernel_init转化为用户空间的init进程时,Andorid系统中会创建一个最重要的进程:Zygote,它会创建Android需要的所有进程。Android层分析在这个图中,kernel和native层的通信是syscall,大家比较熟悉,就是系统调用。毕竟从C++调用C语言是非常简单的。FrameWork层和Native层的通信比较复杂。java是如何调用C++语言的?这里会有一个JNI机制。JNI有特定的语法,类似于C语言但又不像C语言。它可以实现java调用C++函数。这个过程需要AndroidRuntime(ART)Android虚拟机的配合。在Native层中,有很多用C++编写的系统服务供上层使用,比如最重要的ServiceManager,它管理着其他所有的服务。案例研究如果一个手机应用程序想要控制扬声器、LED和其他硬件,它必须从应用程序传递到内核来操作硬件。这个过程比Linux应用程序要复杂得多。而且方式不止一种,例如:1、app通过直接读写的方式向内核节点写入数据,类似于Linux命令行直接echo,是最简单的方式。因为java本身也有文件读写功能,所以有按字节读写和按字符串读写两种方式。2、app的java语言调用JNI文件,JNI调用C语言在C函数中操作节点。3.你也可以用C++写一个Native服务。APP通过Binder通信访问这个服务,并在这个服务中操作节点。当然,socket通信也是可以的。Android权限问题当然,以上操作都是需要权限的,而Android系统的权限是比较严格的,以防止黑客破解。如果你有root权限,可以在Android命令行输入setenforce0关闭Android系统的SELinux检查机制,基本上你的所有操作都可以被允许。在linux系统中,安全机制是:我是root,我发出去访问什么的程序也应该有root权限,没有人能阻止我。在Andorid系统中,安全机制是:无论你是谁,凡事都必须提前申请,否则会被SELinux检查,不提前申请的行为将被拒绝。看日志,会发现很多avcdeny。举个生动的例子:某公司老板派儿子来公司上班。按理说应该类似于root权限。谁能阻止我?其实去公司上班是可以的,因为老板提前说了,但是要申请上厕所的权限,申请使用电脑的权限,申请使用打印机的权限.除上班外,其他未事先说明的行为一律拒绝。这是Andorid系统严格的安全机制,防止黑客在破解root权限后乱搞你的手机,例如:内置程序定期访问你的xxx文件,然后通过网络发送出去。本文转载自微信公众号《嵌入式Linux系统开发》