浅析安卓的启动过程

Android的启动过程

当我们大张旗鼓的学习Android的时候,可否知道,当我们按下电源键的那一刻,我们的手机发生了什么,它是怎么样工作。如果你和我一样不知道,那么接下来就和我一道去学习一下,Android的启动过程吧。
首先,本次的启动过程的文章我准备去解决以下几个问题。

  1. Android的启动过程是怎么样的?
  2. 什么是Android的内核,什么是linux内核,安卓的内核和linux有什么区别
  3. 什么是引导装载程序
  4. 什么是Zygote?
  5. 什么是X86以及ARM linux?
  6. 什么是init.rc?
  7. 什么是系统服务?

解决完这几个问题之后,我们将会知道Android的启动过程,然后对我们的手机启动过程做一个简单的了解,如果有什么值得拍砖的地方,烦请各位在留言处拍砖。

Step1 Android是什么?

Android是一个Google开源的系统,主要用于移动端的设备。经过很多年的开发目前更新至7.0了,Google目前针对于各个版本的系统做了不同的优化,因此我们在学习的时候一定要根据不同的版本做出相应的了解,并且利用到我们的项目中去。好了废话不多说,我们直接进入正题。Android是什么。
Android是一个基于Linux kernel的开源操作系统但不是linux,简单介绍一下,Google为了实现其商业化的目的阉割了很多功能,比如让宏亮特别心碎了阉割了ffmepeg用opencore取代,另外还阉割掉Glibc(c运行库)用bionic取代,感兴趣的同学可以看看系统源码看具体Google阉割掉哪些。
另外介绍一下CPU架构,x86是linux内核部署最常见的系统。然而几乎所有的Android设备都是运行在ARM处理器上的,X86架构的Android设备也有但是很少,比如现在宏亮所遇到的展讯的手机他们就是X86架构的,但是程序在它上面运行一定要做出相应的适配,不然很多的程序设计的jni或者说NDK开发的,一在上面运行就崩了。顺带介绍一下Android的核心架构吧,x86是复杂指令集的cpu架构,ARM相对于指令集简单,指令集长,能够满足简单操作系统的操作比如像我们的之前的诺基亚的塞班系统,还有微软的WM系统。但是随着手机的系统越来越复杂,就需要处理更复杂的操作,所以ARM架构的CPU操作就显得有些吃力,必须增加核心数来进行,这样子我们就会看到市面上动不动就八核之内的手机cpu。

Step2 Android系统的启动过程

当我们把手机打开的时候按电源键的时候我们的手机的启动流程是什么样的呢?

  • 加载bootloader
    当我们手机电源按下的时候引导芯片从预定义的地方开始执行,加载引导程序到RAM,,然后引导程序(bootloader)就执行了,引导程序是各个手机严格加锁控制的地方,所以我们一般修改是比较困难。引导程序是我们手机或者说移动设备运行的第一个程序,它是针对于特定的主板和芯片的,手机生产商一般使用很受欢迎的引导程序要么自己开发自己的引导程序,比如小米,宏亮的手机是努比亚Z9mini,刷的是小米的系统,当手机电源打开的时候,引导程序在rom/操作系统内核运行之前运行,这就是引导程序在执行某些操作。具体有哪些操作呢。第一阶段:检查手机的RAM和加载第二阶段的程序 第二阶段 设置网络和内存等硬件等等等等,特别多的东西。
  • 加载rom的内核
    我们可以翻开我们的手机,在高级信息,可以找到我们的内核版本,当我们的内核启动后,会加载驱动,设置缓存,计划列表等系统设置,当系统设置完成之后就会在系统中寻找“init”文件,然后启动root进程或者称之为启动系统第一个进程 init进程
  • init进程
    init是第一个进程,有2二个作用,一个是挂载目录,比如/sys /dev /proc ,二是运行init.rc脚本。 对于init.rc文件,有特定的格式和规则,是Android的初始化语言。这个文件有四大类型的声明组成,有Action,Commands,Service,Options(选项)。主要的有:设置init进程的优先级。设置init进程安全环境,设置全局环境,未cpu创建资源控制的挂载点。挂载分区。设置系统目录的访问权限,网络初始化,内存管理,启动系统管理器的本地服务,比如位置,音频,shared prference,启动zygote作为应用进程。这时候就能看到屏幕上的“Android”Logo了,但是根据不同的手机品牌又不同了。
  • zygote
    这个单词,有个中文好听的名字“受精卵”,好听吧,接下来来介绍一下这玩意是什么,zygote可以启动应用程序的进程(VM进程)。谈到zygote主要的习惯上分为2种一个是C/C++写的zygote 为未来的应用和SystemService 开启进程的,我们开启的就是这个了,另外一个是java编写的zygote接口,负责为应用和Service调用C/C++ 的zygote接口,执行启动进程操作,也可以启动SystemService
    zygote主要有2个作用:

    1. 建立运行时的环境,并启动虚拟机,
      执行com.android.internal.os.ZygoteInit的main函数,从而fork SystemService
      runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);
    2. 为应用程序创建DVM进程,进行预加载,初始化核心类库。这些核心类是Android SDK或者核心框架的一部分。
      这个时刻可以看到启动动画
  • SystemService
    刚看到那段代码,是startSystemServer,SystemServer是Android系统的一个核心进程,就是刚刚的zygote创建的,Android的所有服务都是建立在这个SystemServer,可以知道它建立了Android中的大部分服务,并通过ServerManager的add_service方法把这些服务加入到了ServiceManager的svclist中,然后启动各种的系统核心服务。
    比如:

  • 启动电源管理器;
  • 创建Activity管理器;
  • 启动电话注册;
  • 启动包管理器;
  • 设置Activity管理服务为系统进程;
  • 启动上下文管理器;
  • 启动系统Context Providers;
  • 启动电池服务;
  • 启动定时管理器;
  • 启动传感服务;
  • 启动窗口管理器;
  • 启动蓝牙服务;
  • 启动挂载服务。
  • 启动状态栏服务;
  • 启动硬件服务;
  • 启动网络状态服务;
  • 启动网络连接服务;
  • 启动通知管理器;
  • 启动设备存储监视服务;
  • 启动定位管理器;
  • 启动搜索服务;
  • 启动剪切板服务;
  • 启动登记服务;
  • 启动壁纸服务;
  • 启动音频服务;
  • 启动耳机监听;
  • 启动AdbSettingsObserver(处理adb命令)。

接着我们的引导就完成了,系统服务就在内存中跑起来了,引导过程就完成了,当我们的系统服务都开启了,开机的广播“ACTION_BOOT_COMPLETED”就发出

总结一下:打开电源->bootloader ->加载rom的内核->启动init进程->启动zygote进程->开启系统核心服务

欢迎大家来拍砖啊

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值