Linux: Android系统
Android系统架构
Android 是谷歌开发的一款基于 Linux 内核的操作系统。系统架构分为五层,从下到上依次是Linux内核层、硬件抽象层、系统运行库层、应用框架层和应用层。
通俗点从下往上依次是:
- Linux kernel 层,很大一部分内容是驱动程序
- HAL 层,对下封装驱动硬件操作,对上向 App 提供统一稳定的驱动操作接口
- Native层,主要是 C/C++ 库以及 Java 虚拟机
- Java 层,主要是 Java 库,系统服务等
- App 层,一些系统和三方APP
我们常说的 framework 大多数指的是中间三层的开发,即 Java层、Native层、HAL层
以 Android 系统启动过程为主线,以进程的视角来学习 Android 系统全貌,更为清晰明了
Android 系统启动过程由上图从下往上的一个过程是由 Boot Loader 引导开机,然后依次进入 -> Kernel -> Native -> Framework -> App
- kernel 层主要向上提供了驱动,Hal 层加以封装后,向上提供驱动程序功能
- Native 层通过 init 进程启动了很多守护进程用于支持系统的运转
- Java 层通过 Zygote 孵化了 Java 守护进程,用于支持系统的运行和 App 的运行
Framework 开发做什么
谷歌几乎每年都会发布最新的 AOSP 原生代码,AOSP 原生代码只支持极少数几款手机,比如 Pixel。
芯片厂商根据自己的芯片的特点修改 AOSP ,让其可以在自己芯片上跑起来
方案厂商根据自己开发的设备特点(主要是外设 如wifi 蓝牙 传感器等),修改芯片厂提供的源码,使得软件能在方案厂商的开发板上跑起来
大部分做产品的厂商拿到的就是芯片厂商提供的开发板硬件和系统源码,产品厂商主要工作就是:
- 添加自己的硬件、驱动、HAL和硬件系统服务,硬件的提供商可能会提供相应软件支持
- 定制系统 App,比如 Launcher Setting System UI Message Camera 等
- 开发厂商自己的系统 App,比如 音视频播放器 应用商店 主题 红外遥控等
- 个性化功能开发,比如软件多开,手机分身,语音变声,录屏,双卡双待等等
- 集成一些常用三方应用,比如 微信 淘宝 爱奇艺等
- 系统稳定性 性能 安全相关优化
- 系统裁剪
方案厂商提供的系统源码并不完美,App 中很多的 Bug 可能是 Framework 层导致的,产品在上市前需要针对系统 App 和热门三方 App 及游戏进行测试,解决掉 Framework 中存在的 bug。Framework 开发的主要工作就是解决这些 bug 并协助系统 App 的开发,同时可能要做一些新特性开发,系统性能和安全相关的工作。
Framework 中无穷无尽的 bug 也不能怪芯片厂商和方案厂商,因为 Android 打娘胎里出来就有数不清的 bug,在这里可以查看 aosp 相关的 bug 信息。
Android系统开发和Android应用开发差别还是比较大的。上图是Google官方提供的Android系统架构图。Android应用开发人员开发的APP在上图中并没有体现,上图最顶层的System Apps,指的是Launcher(桌面)、SystemUI(状态栏、导航栏、快速设置等)、电话、短信、相机等内置的系统应用。开发人员另外开发的属于第三方应用,和系统应用平级,但在系统内部的存储位置不同,权限也不同。所以三方应用可以卸载,系统应用卸不了。可以看到Android系统架构最底部也是Linux Kernel,所以硬件层、驱动层、内核核心的开发步骤和Linux是一样的。下面我们重点来看看它的特别之处。
1、HAL层:硬件抽象层,为什么多了这么个玩意呢?主要有两个原因:一是对驱动做了再次封装,对Framework层提供统一接口,硬件厂商或或开发人员只需要面向HAL框架编程即可。二是HAL属于用户空间,Linux驱动属于内核空间,内核空间代码遵循GPL协议,必须开源。而用户空间遵循Apache协议,可以不开源。硬件厂商可以只在驱动层做简单的芯片寄存器映射,主要逻辑放在HAL层实现,更好的保护自身利益。在Android系统开发中,该层常和驱动层一起开发,由HAL开发工程师负责。
2、Framework Native层:使用C++和C实现,对下操作HAL层的硬件接口,向上通过Native和Framework Java层连接在一起。
3、Framework Java层:即Android Develop SDK,使用JAVA实现,对应用层提供调用接口,对下通过Native与Framework Native层连接在一起。负责Framework层开发的为Framework开发工程师或框架工程师。Android Framework是极其庞大复杂的,包含各种子系统的服务、策略、路由、调度等所有代码。所以做Android系统开发的大型公司常按照子系统重新组织团队,如蓝牙子系统、WIFI子系统、Audio子系统、Camera子系统、显示子系统。每个团队负责一个子系统从硬件到应用的垂直研发。
4、Android的GUI系统:Android的GUI系统并没有直接用那些知名GUI,而是是基于OpenGL/EGL来定制实现的。
5、应用层:即APP开发,常使用Java、Kotlin进行开发,编译出apk文件安装在Android系统上。需要注意的是,当Android系统为定制化系统时,framework和Android原生SDK很可能是不一样的,需要找到系统被修改后编译出的framework的jar包,替代Android Develop SDK进行开发。