Android基础之微信棋牌大厅开发系统启动

2019-04-14 17:11发布

Android系统的启动操作流程由Linux系统启动Android应用系统启动两个阶段组成。Linux系统启动Android操作系统启动次序分别为系统上电,Bootloader引导,Linux内核启动,init初始化系统服务等。1. 系统上电与启动ROM如同传统的PC设备,Android系统的CPU上电复位后,将程序指针指向复位时的零地址(启动地址),从该地址读取启动程序的可执行代码直接运行,或者将可执行代码与数据载入CPU内置的RAM中再运行。所谓的启动ROM内固化有启动代码,其起始地址就设在CPU复位后的启动地址(零地址)处,CPU复位后指针指向该处,开始执行代码。2. Bootloader引导程序Bootloader被烧录进入android系统后,系统上电复位,Bootloader被载入,在操作系统内核运行之前得到执行。通过这段小启动程序,我们可以初始化硬件设备,建立内存空间映射图,从而将系统的软,硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好环境,完成整个系统的加载启动任务。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的Bootloader引导程序。Bootloader本质作用相当于电脑的BIOS,在手机进入操作系统之前初始化软硬件环境,最终让手机成功启动。Android是一个开源系统,如不加修改,必将造成同质化,这是OEM/ODM厂商们必须考虑的问题。目前,各大厂商为了获得独有的系统价值,系统的稳定运行,用户信息安全等,最常用的方式是对Bootloader加密(加锁)。加密的Bootloader仅能引导原厂提供的固件(操作系统内核与主要应用软件),对任何第三方固件都不予识别。之前,除了发烧友,人们一般不会更多关注Bootloader的加锁问题。但随着Android的普及与人们对个性化的极致追求,越来越多的用户开始关注是否能够解锁Bootloader,进而加载其他固件。但是,当每一台Android手机都能随意刷写固件时,不但存在潜在的系统稳定性与系统安全问题,而且对于厂商而言,更加担心其生产的手机在某种程度上沦为一种硬件平台,自身蕴含于软件中的所谓“灵魂”将不复存在。此外,OEM厂商在新机型上新添加了很多功能,由于Bootloader的解锁,用户可以通过更换固件,将新固件直接用于老型号机器,使厂商蒙受损失,因此,OEM厂商通常对Bootloader进行加密或加锁处理,限制用户自行更改然而,Android的开源本质体现的是一种共享与尊重。“Bootloader”的锁与不锁在技术上并不是难题,在确保安全的前提下,更应首先考虑用户的选择:给需要的用户解锁,为不需要的用户保留!3. Linux内核启动Linux内核有两种映像:一种是非压缩内核,称为Image,另一种是压缩内核,称为zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。zImage是Image经过压缩形成的,所以它的大小比Image小。但是在使用zImage之前,必须在它的开头加上解压缩的代码,zImage解压缩之后才能执行,因此它的执行速度比Image要慢。考虑到嵌入式系统的存储空间一般比较小,采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的。所以一般的嵌入式系统均采用压缩内核的方式Bootloader启动后,系统启动的控制权移交给Kernel。Kernel启动主要包括:初始化内核,初始化设备驱动,启动内核,挂载文件系统和启动用户空间进程。4. Init初始化系统服务init是所有Linux系统进程的父进程,其进程ID为1,它负责系统的初始化和启动,创建并运行系统中的关键进程,比如shell,lgoin等。init也理所当然地成为Android系统中的第一个进程,被赋予更多重要的工作职责,比如创建zygote进程,提供一个属性服务(property service)来管理系统属性。Android应用系统启动Linux内核启动完毕之后,init进程将开始启动Android应用系统。init进程创建Android系统中的关键进程,如Android系统本地服务(Native Service),微信棋牌大厅开发QQ1279829431(h5.mostsheng.com)17061863554源码出售平台出租Zygote进程其中Zygote进程和其子进程Android系统服务(System Server)是Andorid系统的基础。在相继启动Zygote进程和System Server进程成功后,系统将启动主页面(home),在主页面启动成功之后,Android应用系统启动才正式完成。Android系统应用程序启动的整体流程如下图:下面详细说明每一步启动流程:1. 启动Android系统本地服务Android系统本地服务(Native Service)由init启动的,属于核心服务,采用C++语言编写,在运行时库层上实现Native Service是Android系统内核层与Android应用层通信的重要管道,通过socket向应用层提供特定的服务Native Service启动项定义在 init.rc 中,提供的本地服务主要有:
  • Console,shell console服务
  • Servicemanager,Binder服务管理器,管理所有Android系统服务。
  • Vold(Volume Daemon),支持存储外设的热插拔。
  • Mountd(设备安装Daemon),负责设备安装及状态通知。
  • Debuggerd(Debug Daemon),处理调试进程的请求。
  • Rild(radio interface layer),无线接口层。
  • Zygote,启动Dalvik并负责进程孵化服务。
  • Mediaserver,负责多媒体播放相关的功能,包括音视频解码,显示输出等。
2. 启动ZygoteZygote由init进程根据 init.rc 文件中的配置项创建。Zygote最初的名字叫“app_process”,但在运行过程中app_process通过Linux下的pctrl系统调用将自己的名字变成了Zygote。Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器。Zygote负责虚拟机的初始化,预置类库的加载和初始化等操作。每当系统要求执行一个Android应用程序时,Zygote就会创建一个子进程来执行该应用程序。其优点在于,当系统需要一个新的虚拟机实例时,Zygote通过自身复制的方式,可以快速地为系统提供虚拟机实例。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享同一块内存区域,有助于节省内存开销。Zygote进程是整个Android的孵化器进程,所有的Activity进程均是通过它来生成的3. 启动Android系统服务Android系统服务(System Server)作为Zygote的第一个子进程,也是由Zygote进程孵化出来的。它是Android框架层的核心,主要负责Android系统初始化并启动其他服务。Android的其他服务都由Systemserver启动并运行在该进程空间。在Zygote进程启动过程中通过指定参数“--start-system-server”来实现SystemServer的启动。4. 启动Android系统主界面在完成Android系统应用程序启动后,还需要有一个主页面(Home)应用程序来负责把它们在桌面上展示出来。在Android系统中,Home应用程序是Launcher,下面将详细分析Launcher应用程序的启动过程。Launcher由ActivityManagerService启动,而ActivityManagerService是在开机时由SystemServer启动,SystemServer首先需要启动PackageManagerService,由它来负责启动系统的应用程序。在系统中的应用程序启动完成后,SystemServer接下来通过ActivityManagerService来启动Launcher。Launcher在启动的时候便会通过PackageManagerService把系统中已经启动折应用程序以快捷图标的形式展示在桌面上,这样用户就可以使用系统应用程序了。