专栏首页嵌入式Linux系统开发手把手教你分析 Android 系统启动流程

手把手教你分析 Android 系统启动流程

上一篇我们讲了 Linux 系统的启动流程,本文讲解一下 Andorid 系统的启动流程。

手把手教你分析 Linux 启动流程

Andorid 系统是在嵌入式行业中广泛应用的系统,手机、平板、机器人、汽车中控系统都有使用安卓系统的,在应用方面的优势是安卓系统自带 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)Boot ROM 是固化在硬件中的一段代码,它一般是固定的,它的作用是检测基本的硬件是否存在,比如检测 EMMC 是否存在,存在的话,把 bootloader 从EMMC 拷贝到 SRAM ,启动系统,后面交给 bootloader 。

2)Andorid 系统的启动引导程序 bootloader 不是 uboot,是 LK(little kernel),专门用来启动安卓系统。

3)bootloader 初始化完成后跳转到 Linux 内核的 start_kernel 函数,此函数最后产生了 kernel_init 和 kthreadd,kernel_init 后面会从内核空间跳转到用户空间,变成用户空间的 init 进程,PID=1,而 kthreadd(PID=2)是内核进程,专门用来监听创建内核进程的请求,它维护了一个链表,如果有创建内核进程的需求,就会在链表上创建。

当然你可以看到图中还有一个swapper(PID=0)进程,它是系统中唯一一个不使用 fork 创建的进程,kernel_init 和 kthreadd 就是由它创建的,swapper 也叫 idle 进程,空闲进程,它运行的时候就是系统处于空闲状态的时候。

4)当 kernel_init 转变为用户空间的 init 进程以后,会在 Andorid 系统中创建一个最重要的进程:Zygote,此进程会创建安卓所需要的所有进程。

Android 层级分析

这个图中 kernel 和 native 层的通信是 syscall,这个大家都很熟悉,就是系统调用,毕竟 C++ 调用 C 语言还是很简单的。

而 FrameWork 层和 Native 层通信就比较复杂了,java 如何调用 C++ 语言,这里会有一个 JNI 机制,JNI 有特定的语法,类似于 C 语言但又不是 C 语言,他可以实现 java 调用 C++的函数,这个过程需要 Android Runtime(ART) 安卓虚拟机的配合。

在 Native 层中,有很多 C++ 写的系统服务,供上层使用,比如最重要的ServiceManager,管理所有其他服务的服务。

案例分析

手机 app 想要控制喇叭、LED 等硬件,要从 app 传递到 kernel,操作硬件,这个流程要比 Linux 的应用程序复杂得多。并且方式不止一种,举例:

1、app 通过直接读写 kernel 节点,向其写入数据,这就类似于在 Linux 命令行直接 echo,这是最简单的方式。因为 java 本身也有文件读写函数,有按字节读写和字符串读写两种方式。

2、app 的 java 语言调用 JNI 文件,JNI 调用 C 语言,在 C 函数中去操作节点。

3、也可以用 C++ 写一个 Native 服务,APP 通过 binder 通信访问这个服务,在这个服务中操作节点。当然 socket 通信也可以。

Android 权限问题

当然,以上所有的操作都需要权限,安卓系统的权限限制的比较严格,防止黑客破解。

如果你有 root 权限,那么你可以在安卓系统命令行中输入 setenforce 0 来关闭Android 系统的 SELinux 检查机制,那基本上你所有操作都可以被允许。

在 Linux 系统中,安全机制是:我是 root,我派出去的程序访问任何东西也应该是 root 权限,没有人可以阻止我。

在 Andorid 系统中,安全机制是:不管你是谁,做任何事情都要提前申请,否则会被 SELinux 检查,没有提前申请的行为都会被拒绝,看 log 会发现很多 avc deny。

举个形象一点的例子:一个公司老板,派他的儿子去自己的公司上班,按理来说是应该类似于 root 权限,谁能挡我?实际上呢,到公司上班可以,因为老板提前说了,但是去卫生间要申请权限,用电脑要申请权限,用打印机要申请权限,除了过来上班,其余任何没有提前说明的行为都会被拒绝。

这就是 Andorid 系统严格的安全机制,防止了黑客破解 root 权限以后乱搞你的手机,比如:内置一个程序,定期访问你的 xxx 文件,然后通过网络发出去。

本文分享自微信公众号 - 嵌入式Linux系统开发(Jason_Linux_),作者:Jasonangel

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 手把手教你分析 Linux 启动流程

    最新 Linux 内核是 5.15 版本。现在常用 Linux 内核源码为4.14、4.19、4.9 等版本,其中 4.14 版本源码压缩包大概 90+M,解压...

    用户8662056
  • 手把手教你分析 Linux 启动流程

    最新 Linux 内核是 5.15 版本。现在常用 Linux 内核源码为4.14、4.19、4.9 等版本,其中 4.14 版本源码压缩包大概 90+M,解压...

    Jasonangel
  • 手把手教你逆向分析 Android 程序

    很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下。 ? 第一张图是在把代码注入到地...

    腾讯Bugly
  • 手把手教你调试Netty启动服务流程源码

    JavaEdge
  • 手把手教你如何分析 iOS 系统栈 crash

    先上栈,这个 crash 是我们目前开发产品的 top5 crash ? 第一步 对于死在 ojbc _ msgSend 的函数(不仅仅是 msgSend, o...

    腾讯Bugly
  • 手把手教你安装 Win+Ubuntu 双系统(图文教程)

    在大多数情况下,对于一个程序开发人员,电脑的操作系统的最佳选择不应该是 Windows,而是 Mac 或者 Linux。

    猴哥yuri
  • 手把手教你在Android Studio 3.0上分析内存泄漏

    戳我下载 Android Studio 3.0:https://developer.android.google.cn/studio/index.html

    用户2802329
  • 手把手教你启用Win10的Linux子系统(图文超详细)

    今天为大家介绍如何才能启用Windows10下的Linux子系统,废话不多说,直接看步骤:

    砸漏
  • 手把手带你调试阅读Netty启动服务流程源码

    在创建 NioEventLoopGroup(创建一组NioEventLoop) 的过程中就创建了 selector

    JavaEdge
  • 手把手教你用Excel分析网站流量(实例讲解)

    前言:随着运营精细化发展,如何通过品牌沉淀的数据挖掘出更多优化可能,是每个运营、产品甚至技术的必修课。这篇文章将主要阐述我是如何通过发现问题、提出猜测、验证猜想...

    iCDO互联网数据官
  • Android系统启动流程(三)解析SyetemServer进程启动过程

    前言 上一篇我们学习了Zygote进程,并且知道Zygote进程启动了SyetemServer进程,那么这一篇我们就来学习Android7.0版本的Syetem...

    用户1269200
  • Android系统启动流程(一)解析init进程

    前言 作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来...

    用户1269200
  • Android系统启动流程(二)解析Zygote进程

    前言 上一篇文章我们分析了init进程,init进程中主要做了三件事,其中一件就是创建了Zygote进程,那么Zygote进程是什么,它做了哪些事呢?这篇文章会...

    用户1269200
  • Kubernetes动手系列:手把手教你10分钟快速部署集群

    Kubernetes 动手系列想通过一系列动手的 demo ,来帮助读者快速的理解上手 Kubernetes 一些运行机制。会包括如下内容:

    CNCF
  • 教程 | 用数据做酷的事!手把手教你搭建问答系统

    选自TowardsDataScience 作者:Priya Dwivedi 机器之心编译 参与:Pedro、路 本文介绍了如何基于 SQuAD 数据集搭建问答系...

    机器之心
  • 保姆级教程:手把手教你升级 Windows 11 系统!(建议收藏)

    Windows 11 发布于 2021 年 6 月 24 日,2021 年 10 月 5 日正式发行!

    Lucifer三思而后行
  • graylog日志分析系统上手教程

    日志分析系统可以实时收集、分析、监控日志并报警,当然也可以非实时的分析日志。splunk是功能强大且用起来最省心的,但是要收费,免费版有每天500M的限制,超过...

    震八方紫面昆仑侠
  • 手把手教你读懂源码,View的绘制流程详细剖析

    上一篇文章我们分析了View的加载流程,今天我们继续来深入学习View的绘制流程,接着上次的View绘制开始,同样使用的是Android 7.1源码。 ...

    分享达人秀
  • 手把手教你读懂源码,View的加载流程详细剖析

    最近想要理清我们的View是如何加载到界面中的,最好的方式就是分析源代码,这里一同分享给有需要的朋友们。内容较多,需要一定的耐心,请斟酌学习! ...

    分享达人秀

扫码关注云+社区

领取腾讯云代金券