一、安卓系统架构
Google官方提供了一张经典的四层架构图,从下往上依次分为Linux内核、系统库和Android Runtime、框架层以及应用层这4层架构,其中每一层都包含大量的子模块或子系统
安卓系统主要由5部分组成,下面将对这五部分进行简单介绍。
1.应用程序层
Android系统将会包含一系列胡核心应用程序,如电子邮件客户端,日历、地图、浏览器等等。这些程序通常都是由Java编写的。
2.应用程序框架
Android应用程序框架提供了大量的API供开发者使用,当我们开发Android应用程序时,就是面向底层的应用程序框架进行开发的。
3.函数库
Android包含一套可以被不同组件所使用的C、C++库。一般来说,应用程序开发者不能直接调用这套C、C++库,但可以通过它上面的应用程序框架来调用这些库。
4.Android运行时
Android运行时由两部分组成:Android核心库集和ART。核心库集提供了Java语言核心库所能使用的大部分功能,ART虚拟机则负责运行Android应用程序,
Android5.0之前的虚拟机为Dalvik虚拟机,APP运行较慢,ART模式则是在用户安装APP时进行预编译,提升Android APP运行效率。
5.Linux内核
Android系统建立在Linux2.6之上。Linux内核提供了安全性、内存管理、进程管理、网络协议栈和驱动模型等核心系统服务。
二、Android启动流程
Android 系统启动流程基本框架
Android系统的启动流程,从按power按键启动电源开始,到Launcher应用程序启动完结束,大致可以分为以下7个步骤。
1、开启电源执行BootLoader引导程序
当电源按下,引导芯片代码执行。加载引导程序到RAM,执行Boot Loader,主要是检查RAM,初始化硬件参数,设置CPU的速度和时钟频率等。
2、Boot Loader拉起并执行操作系统
BootLoader执行时,会拉起并运行操作系统。BootLoader是一个引导程序,作用就是拉起操作系统。
3、操作系统启动init进程
Android操作系统基于Linux内核实现,所以此时Linux内核开始启动,进行系统设置
启动Kernel的swapper进程(pid=0):该进程又称为idle进程, 是Kernel创建的第一个进程, 用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作。
当完成系统设置后,会首先在系统文件中寻找init.rc脚本,并启动init进程
4、启动init进程
init进程是Android系统中用户空间的第一个进程(pid = 1),是Android系统启动中的一个关键进程,作为第一个进程,它被赋予了很多重要的职责,简单概括为:
(1)、创建和挂载启动系统所需要的文件目录。
(2)、初始化和启动属性服务。
(3)、解析init.rc配置文件,并启动Zygote进程。
5、Zygote进程启动
Zygote的中文翻译为“受精卵”,是生命的开始,从字面意思,我们大致可以领会到它在Android系统中的地位。Dalvik/ART,应用程序进程以及运行系统的关键服务SystemServer都是由Zygote进程创建的,所以一般也称它为孵化器。Zygote需要做很多工作,归纳起来大致有如下几条: (1)创建Dalvik/ART
(2)从Native层进入到Java框架层。也就是说Zygote开创了Java框架层,这一步是通过Native层通过JNI方式调用ZygoteInit类的main方法来实现。Zygote的路径为:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
(3)ZygoteInit的main方法中会创建一个Service端的Socket,名称为“zygote”,用于等待AMS请求Zygote创建新的应用程序进程。
(4)ZygoteInit的main方法中还会通过fork方式创建并启动SystemServer进程。
6、SystemServer进程启动
SytemServer是运行系统的关键服务,主要用于创建系统服务,比如AMS,WMS,PMS等。它的主要职责为:
(1)启动Binder线程池。该过程主要通过ZygoteInit.nativeZygoteInit()来调用Native层的方法来实现启动Binder线程池的,这样SystemServer就可以使用Binder与其他进程进行通信。
(2)创建SystemServerManager(SSM),并启动各种服务。这个过程是在SystemServer的main方法中调用实现的,可以参考如下的源码。SystemServerManager用于对系统的服务进行创建、启动和生命周期管理。这里启动的各种服务包括引导服务、核心服务、其他服务三类:引导服务包括AMS、PowerMS、PackageMS等;核心服务包括BatteryService等;其他服务包括WMS等,SystemUI也是在这里启动的。
7、启动Launcher
系统启动的最后一步是启动一个应用程序来显示系统中已经安装的应用程序,Launcher加载其他应用快捷方式到桌面。这一步由SystemServer创建的AMS来启动。
三、Android str流程
str开机流程:
当电视选择快速开机模式后,按power健待机就进行了str待机
再次点击power按键,会通过PhoneWindowManager中的wakeUpFromPowerKey方法唤醒设备。
当待机时间大于30s时,shouldWakeUpWithHomeIntent()会为true,然后启动HomeActivity。
当待机时间小于30s时,shouldWakeUpWithHomeIntent()返回false,直接唤醒屏幕,显示待机前的activity。
GTV ATV str开机流程区别:
GTV str开机逻辑:
GoogleTV中,有Google Launcher和Settings共同控制的STR开机逻辑。
Settings中可以配置开机显示,Home 或 Last input。在冷开机时,系统会先启动Launcherx应用,Launcherx 的 DispatchActivity会根据该选项启动
Launcherx主页或LiveTV等应用。
而在STR待机状态下,该选项依然有管控效果。
通过与Google沟通, STR待机30s以内开机和30s以上开机的逻辑不同
1. 30s以内开机回到待机前的位置
2. 30s以上开机,选择home screen进入Launcher,选择Last input则进入最后待机位置。
整个逻辑由Google Launcherx制定,无法客制化修改。
ATV str开机常见异常:
常见异常:
1. 应用自身在onPause或onStop状态 kill 自己(常见于中国区应用,以前因性能优化要求,应用进入后台状态后kill自己降低内存使用)
2. 广播问题,部分场景在STR开机后会接收STR开机广播做结束静音状态、Service 继续运行等操作,但由于系统中或应用中接收广播处理超
时,导致后面的广播接收器较晚收到广播,出现延迟异常