200 lines
18 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第1章 引言
## 1.1 AOSP是什么
Android操作系统是如今最流行使用最广的智能手机操作系统它的发展受到广大厂商和用户的全力支持而Android操作系统的开源使它可以被任何人定制化从而满足各类厂商和不同需求的用户。
AOSP的全称是“Android Open Source Project”也就是安卓开源项目它是由谷歌发起的移动设备的操作系统开源项目任何人都可以自由地获取完整的项目源码以及提交更新完善项目同时谷歌也会不断地迭代更新版本。
由于Android的开源各大手机厂商能能够自由地定制系统的源码适配自己的硬件由此衍生出了各种产品。常见的国产安卓设备的系统基本是厂商开发团队基于AOSP源码不断进行改造和优化的结果例如小米MIUI系统、华为Harmony系统、一加的H2OS系统等等大多数都是基于AOSP的源码修改而来。如今的Android能够百花齐放占据手机市场的半壁江山也是主要得益于AOSP的开源。
由于AOSP项目过于庞大和复杂在了解和学习的过程中要善于查询官方的说明文档。Android官方文档地址: [https://source.android.com](https://source.android.com)
下图是官方文档中的AOSP的框架结构图。
![android_framework_details](images/android_framework_details.png)
对于新手而言,刚开始接触安卓源码时,对于很多基础理论性的知识都是懵懵懂懂的。这些基础并不需要完全的记住,只需要大概有这么一个概念,以及了解它们之间依赖关系的印象即可,等以后实践多了,再过头看这部分内容,温故一下理论部分,就会茅塞顿开了。
Apps是日常开发的应用层使用手机日常安装的应用游戏等等都属于这一层普通应用基本都在手机的目录`/data/app`中。包括AOSP提供的系统APP也是属于应用层。例如相机、短信、图库`/system/app`目录下的应用。应用层直接对接用户的输入操作和输出展示。这里的输入指的是,对手机进行的操作,例如点击屏幕,手机上的按键,所有对手机进行的操作行为,统称为一种输入。而输出指的是,手机接收到输入行为后的一种反馈,例如屏幕亮了,页面刷新等等所有通过手机展示给你看到的,都算是手机的输出。
Framework框架层。这里简单介绍一下框架的概念在开发过程中很多功能是多数开发人员所共同需求的基础功能这些功能是作为一个智能手机系统所必备的基础部分例如查询sim卡信息跨进程的通信窗口的管理等等这个部分就是框架由基础组建而成的摩天大楼。普通应用就像是这栋大楼的住户所以和应用打交道最多的就是基础功能提供开发应用时所用到的API和组件支持。如果你是一名安卓开发人员相信这里是你在开发中接触最多的部分。下面简单列举几个框架层中的关键组件。
1. **Activity Manager**是Android最核心的部分它负责了系统中四大组件的启动、调度、管理。所有的Activity的生命周期都是在它的范畴。
2. **Location Manager**位置信息和定位的管理组件
3. **Telephony Manager**电话管理组件可以获取sim卡相关信息以及网络信息
4. **Window Manager**窗口程序管理组件
当应用层调用管理组件后管理组件会进而调用对应的Service来执行相应的函数。简单来说就是XXX Manager基本是提供给应用层调用真正的处理逻辑是在XXX Service中处理。如下图所示
![manager_service](images/manager_service.png)
也可以更直观的去看framework的实现连接手机。将jar文件传到电脑
```
adb shell
cp /system/framework/framework.jar /sdcard/
adb pull /sdcard/framework.jar ./
```
然后使用jadx打开将`framework.jar`文件,如下图所示:
![jadx_framework](images/jadx_framework.png)
5. **Native Libraries**。字面意思C/C++的常用库的支持比如比较典型的libc、ssl、OpenGL、WebKit等等。为开发大大的提高了效率和性能。避免每次用到都需要自己去找工具库。
6. **Android Runtime**。缩写就是ART是Android5.0中的使用的新技术替换了以前的Dalvik虚拟机运行环境。虽然android开发常常使用的是java但是android开发的应用并不是运行在JVM虚拟机中而是类似的针对dex结构的Dalvik虚拟机和ART虚拟机。在android4.4开始测试ART功能随后逐渐使用ART虚拟机全面替代了Dalvik虚拟机。ART使用了更高效的代码编译技术Ahead-of-Time简称AOT编译。大致就是在安装应用时将程序代码编译成可执行的机器码而在运行时不再需要编译。由此提高了应用的运行效率极大的提高用户体验。
7. **HAL硬件抽象层**。主要作用于系统内核与硬件之间的接口是Android系统底层的部分具有提供给硬件供应商实现的标准接口Android系统通过接口访问硬件设备也就是硬件的驱动程序开发因此Android操作系统能够与各类硬件设备进行交互不用关心底层硬件的处理。也有个说法是因为硬件供应商不愿意自身的驱动放在内核中被一起开源。所以单独抽出了HAL层来对接硬件驱动。
8. **Linux内核**。系统的最重要的核心部分内核负责与设备底层的硬件进行交互。比如显示驱动、音频驱动、WIFI驱动、电源驱动、内存管理、进程管理网络通信等等内核相当于一个操作系统的灵魂。
## 1.2 系统开发,定制,刷机,改机分别是什么
在正式开始学习前,需要先了解一下这些常常出现的关键词基本的含义。
### 1.2.1 系统开发
常规的android开发属于应用层开发。而在开发应用层时会接触到大量的系统提供的API为获取权限、跨进程通信、网络请求等功能提供了便利。并且运行的app整个生存周期都是寄托于系统环境中。作为开发人员往往最多面对的问题就是系统给你提供了哪些功能系统允许了你哪些权限范围。但是并不代表着系统能满足所有群体的所有需求。这个时候就需要了解android系统架构根据自己的需求去添加功能提供接口给应用层开发的app使用。
非常常见的一个场景就是AOSP是谷歌开源的系统而谷歌的开发者并不一定了解其他国家的国情用户的习惯。那么国内的厂商进行系统开发扩展功能就需要考虑到国内用户体验对界面操作方式系统服务等一些功能进行开发。
这里主要是对Android系统的底层原有的代码进行修改定制化调整系统的部分框架和核心代码来实现新的功能例如硬件的驱动支持优化系统的性能实现开发者自己的系统结构。
### 1.2.2 定制
系统定制也是属于系统开发的一种属于轻量级的改动。往往不会对系统进行太大的变动。比如下面的场景。系统就像是一个沙箱开发的应用是在沙箱中运作的小盒子。需要对应用进行分析和观测时可以通过修改小盒子运行流程时对系统相关的调用来分析应用执行的各种状态。只要对android系统有足够的了解就可以像开了上帝视角一般对普通应用进行跨维度的分析。
这里主要就是轻量级的定制比如对系统的预装应用进行修改优化桌面的结构预装系统权限app替换系统默认应用修改配置等等。
### 1.2.3 刷机
在最早先的Android版本界面非常简陋而且功能并不是那么完善随着各大第三方团队的加入非官方ROM越来越多而官方原版ROM长久使用后越来越卡善于折腾的手机用户就开始尝试使用功能相对完善界面漂亮性能更好的第三方ROM。更换ROM的过程就叫做刷机。当然并不是直接刷第三方提供的ROM包而是自己编译一个ROM再刷入手机。
当系统修改完成编译成ROM镜像后就需要将镜像刷入测试设备中测试修改的系统功能是否正常运转。常见的刷机流程是卡刷和线刷。
线刷指的是刷机时候需要用数据线连接电脑将线刷包通过数据线方式刷放设备。这里刷机用到的系统镜像称为“线刷包”。线刷包一般都是分区镜像img后缀的文件。通过执行命令`adb reboot bootloader`,进入设备刷机模式后,然后执行`fastboot flash`命令刷入对应分区的镜像。而AOSP编译完成后在输出目录拿到的就是分区镜像。
卡刷指的是刷机过程不需要使用数据线连接电脑而是将设备启动进入恢复模式在该模式下将放在设备上的刷机镜像直接刷入设备。卡刷包一般是一个zip格式的压缩包文件。目前比较流行的第三方设备恢复镜像是TWRP。刷机流程一般是先刷入TWRP然后将卡刷包传入手机sdcard中。再用TWRP的命令功能刷入镜像。第三方常见的ROM比如魔趣、lineageOS、PixelExperience等系统ROM编译完成后输出目录的就是卡刷包。
### 1.2.4 改机
每个设备都有各自的唯一标识和对应的指纹信息。这里的指纹信息,并不是指手指的指纹,而是一个概念的意思。比如每个人指纹不同,是因为手指有很多细微的纹路,纹路都组合在一起时,就会每个人的都不同了。设备也是如此,有很多种设备信息,当这些设备信息组合在一起时,就可以当作是这台设备唯一标识的指纹特征。
在风控对抗中有些应用会收集设备的各种信息组合为设备指纹记录起来。有些设备信息是属于风险设备就会被特殊处理。而自己定制的AOSP以及谷歌天然支持的Pixel手机就很容易被判定为高风险设备。所以自己编译的ROM常常会碰到被检测的情况识别到属于风险设备后就可能导致app闪退或者不给正确的结果或者服务端标记为风险用户等等情况。这时就需要对获取设备信息的各个接口进行修改或者直接将设备信息相关的文件修改伪装成一台正常的手机。有时应用并不会通过系统接口来获取设备指纹而是直接通过系统目录或者将系统文件结构作为设备信息或者是绕过你的修改通过底层内联汇编执行系统调用来读取文件获取你的设备信息这种情况就需要分析和持续的对抗了。
## 1.3 安卓系统发展史
2003年由安迪.鲁宾、克里斯.怀特等人开发制作。最初方向只是创建一个数字相机的操作系统后来由于数码相机市场的萎缩智能手机的快速发展最后重新将安卓定位为开发一款智能手机操作系统。于2005年7月11日被Google收购。
2007年11月Google牵头联合了硬件制造商软件开发商通讯运营商成立了“开放手机联盟”共同研发Android随后开放了Android源码。11月5日Android1.0公测版面世
2008年9月发布了第一款安卓智能机HTC Dream这个时候还是诺基亚塞班系统的天下这是时候并没有多少人看好Android系统。
2010年末刚出世两年的Android操作系统在市场占有率上打败了塞班系统。这时的Android2.3版本
2011年10月Android4.0发布,首次支持通过使用照相机拍摄用户的脸部来解锁手机
2014年Android5.0发布这是第一个使用Google全新Material Design语言的版本用户操作界面和UI的外挂得到了升级。同时加上了对双SIM卡的支持。
2016年Android7.0发布改用新的JIT编译器加快应用的运行速度。
2017年Android全球网络流量和设备超越微软的Window正式成为全球第一大操作系统。
## 1.4 其他常见的第三方定制系统
AOSP并不是唯一可以定制的ROM同样有很多优秀的第三方团队研发的定制系统。由于AOSP基本只对Google系的机型适配所以有使用国内常见测试机的人一般会选择使用第三方的定制ROM这些第三方开源ROM都有着各自的优点有很多人会直接选择在这些已经定制修改过ROM上二次开发对于学习来说选择哪个ROM的区别并不会太大因为底层一套使用的AOSP这一套只要摸透一款做好的功能随时可以迁移到其他的系统上。
### 1.4.1 Mokee
官网https://www.mokeedev.com/
中文名魔趣。发起于2012年12月12日是国内最大的第三方非盈利性开源ROM适配了大量国内主流机型高达近300种。魔趣是由一群热爱Android开源社区的热心志愿者维护他们致力于为用户提供最新、最安全、最稳定的定制Android系统主要针对的用户群体也是国内群众所以在功能和操作方面非常贴切国人的使用习惯同时简单纯净性能出众所以有些人会使用魔趣作为日常用的手机。下面是魔趣支持的手机厂商
| ARK | 华硕 | Essential | 谷歌 |
| :--: | :--: | :-------: | :--: |
| HTC | 华为 | 乐视 | 联想 |
| LG | 魅族 | 摩托罗拉 | Nextbit |
| 努比亚 | 一加 | OPPO | Realme |
| 红米 | 三星 | 锤子 | 索尼 |
| Wileyfox | 小米 | YU | 中兴 |
| ZUK | | | |
如果想要进一步了解可以看看魔趣为AOSP扩展的功能 [https://www.mokeedev.com/guide/feature.html](https://www.mokeedev.com/guide/feature.html)。
### 1.4.2 PixelExperience
官网https://download.pixelexperience.org/
这是最接近原生Android系统的第三方ROM,它是在Google Pixel系列设备发布的拥有着Pixel系列设备的原生外观和功能并且添加了更多可定制的功能。它提供了Gestures、Substratum、EDXposed等特殊应用这些应用让用户可以轻松的定制自己的Android设备它还预装了谷歌插件并且还提供了大量可定制的主题以及强大的安全性功能。而正常编译出来的AOSP刷入后是没有谷歌插件并且界面UI都是非常简陋的。如果你想要打造一个和原生Android非常相似的ROM那么完全可以选择它原生Android的界面风格以及自带谷歌套装以及适配了更多的手机厂商。下面是它所支持的各大厂商。
| ASUS | Google | Lenovo | Motorola |
| :----: | :-----: | :------: | :------: |
| Nokia | Nubia | OnePlus | Razer |
| Realme | Samsung | Teracube | Xiaomi |
### 1.4.3 LineageOS
官网https://www.lineageos.org/
LineageOS的前身是大名鼎鼎的CyanogenMod简称CM这个开发团队是全球最大的Android第三方编译团队。早在Android1.6版本时就为很多手机厂商定制出稳定的ROM。2016年12月Cyanogen公司宣布停止开发并关闭项目随后复刻后更名为LineageOS由原团队继续研发。 LineageOS的风格同样是类似原生Android的但是相比起PixelExperience要更加的精简运行起来也是非常流畅同样也是非常纯净不会携带任何第三方应用并且具有高度的安全性可以在经过认证的设备上使用能防止恶意软件攻击或病毒感染也有着定制功能允许用户自己定制操作系统适配各大厂商机型。下面是它所支持的各大厂商。
| ASUS | BQ | Dynalink | Essential |
| :-------: | :-----: | :------: | :-------: |
| Fairphone | FxTec | Google | LeEco |
| Lenovo | LG | Motorola | Nextbit |
| Nokia | Nubia | Nvidia | OnePlus |
| Razer | Samsung | SHIFT | Sony |
| Xiaomi | Zuk | Extras | |
## 1.5 初识系统定制
除了各大知名团队的开源ROM也有一些深入了解安卓原理的开发人员会自己修改ROM定制自己的专属工具亦或者为团队定制专用的功能。不过定制并不是能解决所有问题要了解定制的优点和缺点在各种需求场景采用更合适的方案。
### 1.5.1 系统定制的优点
学习系统定制的好处是非常多的,这里我简单列举几点。
1. 可以通过源码的阅读深入了解Android设计的原理对异常错误排查性能优化以及应用提权等等开发应用层的程序也会得心应手。
2. 从逆向的角度看依托在系统下运行的应用可以直接通过对ROM的修改就能轻松获取到任何执行环节所使用的数据。如同游戏开外挂一般的降维打击。
3. 同时也可以自己打造喜欢的日常用机。为自己DIY一些提供便利的小功能或者打造自己专用的工具手机。
4. 可以有效的控制操作系统的体积,更好的提升产品的性能和效率。
### 1.5.2 系统定制的缺点
定制的优势有的时候同样也代表着缺点杀鸡用牛刀可以非常形象的形容定制ROM来干的事情。因为有很多时候一些需求并不需要修改ROM就能用其他方案轻松做到的下面简单的总结几个缺点。
1. 学习难度大刚开始的阶段搭建编译ROM的环境就较为麻烦再加上庞大的源代码复杂的结构所以很容易劝退一些初学者。
2. 开发成本大每次修改完代码都需要重新刷机很多时候哪怕做一个小小的功能你在测试的过程都在无限的重复编译刷机。并且需要熟悉源码结构必须深入理解Android系统以便于充分利用系统提供的API来制定出更加合理的定制方案
3. 维护成本大即使是一个成型的产品后续难免会有优化和更新BUG是不可能没有的。而想要更新只能选择全部重新刷机同样每次新的系统版本发布都需要重新定制和迁移需要耗费大量的时间和精力。
4. 安全系数低AOSP定制的系统安全性较低所以定制的系统可能存在安全漏洞导致定制系统比原生系统更容易受到攻击。
### 1.5.3 系统定制的发展趋势
### 1.6 初识系统刷机
## 1.7 小结