mirror of
https://github.com/feicong/rom-course.git
synced 2025-08-29 10:44:59 +00:00
更新第一章部分语句
This commit is contained in:
parent
360b665960
commit
ca247f4e0e
@ -12,11 +12,11 @@
|
||||
|
||||

|
||||
|
||||
对于新手而言,刚开始接触安卓源码时,对于很多基础理论性的知识都是懵懵懂懂的。这些基础并不需要我们完全的记住,只需要大概有这么一个分层和他们之间依赖关系的印象即可,等以后经常实战多了,再回过头,温故一下理论部分,就会茅塞顿开了。
|
||||
对于新手而言,刚开始接触安卓源码时,对于很多基础理论性的知识都是懵懵懂懂的。这些基础并不需要我们完全的记住,只需要大概有这么一个概念,以及了解它们之间依赖关系的印象即可,等以后实践多了,再过头看这部分内容,温故一下理论部分,就会茅塞顿开了。
|
||||
|
||||
Apps就是我们日常开发的应用层,我们使用手机日常安装的应用,游戏等等都属于这一层,普通应用基本都在手机的目录`/data/app`中。包括AOSP提供的系统APP也是属于应用层的例如相机、短信、图库等等在`/system/app`目录下的应用。应用层直接对接用户的输入操作和输出展示。这里的输入指的是,我们对手机进行的操作,例如点击屏幕,手机上的按键,所有我们对手机进行的操作行为,统称为一种输入。而输出指的是,手机接收到我们的输入行为后的一种反馈,例如屏幕亮了,页面刷新等等所有通过手机展示给你看到的,都算是手机的输出。
|
||||
Apps就是我们日常开发的应用层,我们使用手机日常安装的应用,游戏等等都属于这一层,普通应用基本都在手机的目录`/data/app`中。包括AOSP提供的系统APP,也是属于应用层。例如相机、短信、图库,在`/system/app`目录下的应用。应用层直接对接用户的输入操作和输出展示。这里的输入指的是,我们对手机进行的操作,例如点击屏幕,手机上的按键,所有我们对手机进行的操作行为,统称为一种输入。而输出指的是,手机接收到我们的输入行为后的一种反馈,例如屏幕亮了,页面刷新等等所有通过手机展示给你看到的,都算是手机的输出。
|
||||
|
||||
Framework框架层,这里简单介绍一下框架的概念,在我们开发中,很多功能是多数开发人员所共同需求的基础功能,这些功能是作为一个智能手机系统所必备的基础部分,例如查询sim卡信息,跨进程的通信,窗口的管理等等,这个部分就是框架,由基础组建而成的摩天大楼。普通应用就像是这栋大楼的住户,所以和应用打交道最多的就是基础功能,为我们提供在开发应用时所用到的API和组件支持。如果你是一名安卓开发人员,相信这里是你在开发中接触最多的部分。下面简单列举几个框架层中的关键组件。
|
||||
Framework框架层。这里简单介绍一下框架的概念,在我们开发中,很多功能是多数开发人员所共同需求的基础功能,这些功能是作为一个智能手机系统所必备的基础部分,例如查询sim卡信息,跨进程的通信,窗口的管理等等,这个部分就是框架,由基础组建而成的摩天大楼。普通应用就像是这栋大楼的住户,所以和应用打交道最多的就是基础功能,为我们提供在开发应用时所用到的API和组件支持。如果你是一名安卓开发人员,相信这里是你在开发中接触最多的部分。下面简单列举几个框架层中的关键组件。
|
||||
|
||||
1. **Activity Manager**是Android最核心的部分,它负责了系统中四大组件的启动、调度、管理。所有的Activity的生命周期都是在它的范畴。
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
|
||||
4. **Window Manager**窗口程序管理组件
|
||||
|
||||
当应用层调用管理组件后,管理组件会进而调用对应的Service来执行相应的函数。简单来说就是XXX Manager基本是提供给应用层调用,真正的处理逻辑是在XXX Service中处理。如下图:
|
||||
当应用层调用管理组件后,管理组件会进而调用对应的Service来执行相应的函数。简单来说就是XXX Manager基本是提供给应用层调用,真正的处理逻辑是在XXX Service中处理。如下图所示:
|
||||
|
||||

|
||||
|
||||
@ -38,18 +38,19 @@ cp /system/framework/framework.jar /sdcard/
|
||||
adb pull /sdcard/framework.jar ./
|
||||
```
|
||||
|
||||
然后使用jadx打开将`framework.jar`文件
|
||||
然后使用jadx打开将`framework.jar`文件,如下图所示:
|
||||
|
||||

|
||||
|
||||
|
||||
Native Libraries层就是字面意思,c++库的支持,比如比较典型的libc、ssl、opengl等等。
|
||||
5. **Native Libraries**。字面意思,C/C++库的原生支持库,比如比较典型的libc、ssl、opengl等等。
|
||||
|
||||
Android Runtime是安卓运行时库,安卓中最核心的ART虚拟机就是在这个部分。虽然android开发常常使用的是java,但是android开发的应用并不是运行在JVM虚拟机中,而是类似的针对dex结构的Dalvik虚拟机和ART虚拟机。在android4.4之后,逐渐使用ART虚拟机全面替代了Dalvik虚拟机。
|
||||
6. **Android Runtime**。安卓的运行时库,安卓中最核心的ART虚拟机就是在这个部分。虽然android开发常常使用的是java,但是android开发的应用并不是运行在JVM虚拟机中,而是类似的针对dex结构的Dalvik虚拟机和ART虚拟机。在android4.4之后,逐渐使用ART虚拟机全面替代了Dalvik虚拟机。
|
||||
|
||||
HAL硬件抽象层,主要作用于系统内核与硬件之间的接口,具有提供给硬件供应商实现的标准接口。往往用来做硬件的驱动程序开发。也有个说法是因为硬件供应商不愿意自身的驱动放在内核中被一起开源。所以单独抽出了HAL层来对接硬件驱动。
|
||||
7. **HAL硬件抽象层**。主要作用于系统内核与硬件之间的接口,具有提供给硬件供应商实现的标准接口。往往用来做硬件的驱动程序开发。也有个说法是因为硬件供应商不愿意自身的驱动放在内核中被一起开源。所以单独抽出了HAL层来对接硬件驱动。
|
||||
|
||||
8. **Linux内核**。系统的最重要的核心部分,内核负责与设备底层的硬件进行交互。比如显示驱动、音频驱动、WIFI驱动、电源驱动、内存管理、进程管理等等。
|
||||
|
||||
Linux内核,系统的最重要的核心部分,内核负责与设备底层的硬件进行交互。比如显示驱动、音频驱动、WIFI驱动、电源驱动、内存管理、进程管理等等。
|
||||
|
||||
## 1.2 系统开发,定制,刷机,改机分别是什么
|
||||
|
||||
@ -57,41 +58,41 @@ adb pull /sdcard/framework.jar ./
|
||||
|
||||
### 1.2.1 系统开发
|
||||
|
||||
我们常规的android开发,属于应用层开发。而在开发应用层时,会接触到大量的系统提供的api,为我们获取权限,跨进程通信,网络请求等功能提供了便利。并且我们运行的app整个生存周期都是寄托于系统环境中。作为开发人员,我们往往最多面对的问题就是,系统给你提供了哪些功能,系统允许了你哪些权限范围。但是并不代表着,系统能满足所有群体的所有需求。这个时候就需要了解android系统架构,根据我们自己的需求,去添加功能提供接口给我们应用层开发的app使用。
|
||||
我们常规的android开发,属于应用层开发。而在开发应用层时,会接触到大量的系统提供的api,为我们获取权限,跨进程通信,网络请求等功能提供了便利。并且我们运行的app整个生存周期都是寄托于系统环境中。作为开发人员,我们往往最多面对的问题就是,系统给你提供了哪些功能,系统允许了你哪些权限范围。但是并不代表着,系统能满足所有群体的所有需求。这个时候就需要了解android系统架构,根据我们自己的需求,去添加功能提供接口给我们应用层开发的app使用。
|
||||
|
||||
非常常见的一个场景就是,AOSP是谷歌开源的系统,而谷歌的开发者并不一定了解其他国家的国情,用户的习惯。那么国内的厂商进行系统开发扩展功能,就需要考虑到国内用户体验,对界面,操作方式,系统服务等一些功能进行开发。
|
||||
非常常见的一个场景就是,AOSP是谷歌开源的系统,而谷歌的开发者并不一定了解其他国家的国情,用户的习惯。那么国内的厂商进行系统开发扩展功能,就需要考虑到国内用户体验,对界面,操作方式,系统服务等一些功能进行开发。
|
||||
|
||||
### 1.2.2 系统定制
|
||||
|
||||
系统定制也是属于系统开发的一种,属于轻量级的改动。往往不会对系统进行太大的变动。比如下面的场景。系统就像是一个沙箱,而我们开发的应用是在沙箱中运作的小盒子。而我们需要对应用进行分析和观测时,可以通过修改小盒子运行流程时对系统相关的调用,来分析应用执行的各种状态。只要我们对android系统有足够的了解,就可以像开了上帝视角一般,对普通应用进行跨维度的分析。
|
||||
系统定制也是属于系统开发的一种,属于轻量级的改动。往往不会对系统进行太大的变动。比如下面的场景。系统就像是一个沙箱,而我们开发的应用是在沙箱中运作的小盒子。而我们需要对应用进行分析和观测时,可以通过修改小盒子运行流程时对系统相关的调用,来分析应用执行的各种状态。只要我们对android系统有足够的了解,就可以像开了上帝视角一般,对普通应用进行跨维度的分析。
|
||||
|
||||
### 1.2.3 刷机
|
||||
|
||||
在最早先的Android版本界面非常简陋,而且功能并不是那么完善,随着各大第三方团队的加入,非官方ROM越来越多,而官方原版ROM长久使用后越来越卡,善于折腾的手机用户就开始尝试使用功能相对完善,界面漂亮,性能更好的第三方ROM。更换ROM的过程就叫做刷机。当然我们并不是直接刷第三方提供的ROM包,而是自己编译一个ROM,再刷入手机。
|
||||
在最早先的Android版本界面非常简陋,而且功能并不是那么完善,随着各大第三方团队的加入,非官方ROM越来越多,而官方原版ROM长久使用后越来越卡,善于折腾的手机用户就开始尝试使用功能相对完善,界面漂亮,性能更好的第三方ROM。更换ROM的过程就叫做刷机。当然我们并不是直接刷第三方提供的ROM包,而是自己编译一个ROM,再刷入手机。
|
||||
|
||||
当系统修改完成,编译成ROM镜像后,我们就需要将镜像刷入测试设备中,测试我们修改的系统功能是否正常运转。常见的刷机流程是卡刷和线刷。
|
||||
当系统修改完成,编译成ROM镜像后,我们就需要将镜像刷入测试设备中,测试我们修改的系统功能是否正常运转。常见的刷机流程是卡刷和线刷。
|
||||
|
||||
线刷指的是刷机时候需要用数据线连接电脑,将线刷包通过数据线方式刷放设备。这里,刷机用到的系统镜像称为“线刷包”。线刷包一般都是分区镜像img后缀的文件。通过执行命令`adb reboot bootloader`,进入设备刷机模式后,然后执行`fastboot flash`命令,刷入对应分区的镜像。而AOSP编译完成后在输出目录拿到的就是分区镜像。
|
||||
线刷指的是刷机时候需要用数据线连接电脑,将线刷包通过数据线方式刷放设备。这里,刷机用到的系统镜像称为“线刷包”。线刷包一般都是分区镜像img后缀的文件。通过执行命令`adb reboot bootloader`,进入设备刷机模式后,然后执行`fastboot flash`命令,刷入对应分区的镜像。而AOSP编译完成后在输出目录拿到的就是分区镜像。
|
||||
|
||||
卡刷指的是刷机过程不需要使用数据线连接电脑,而是将设备启动进入恢复模式,在该模式下,将放在设备上的刷机镜像直接刷入设备。卡刷包一般是一个zip格式的压缩包文件。目前,比较流行的第三方设备恢复镜像是TWRP。刷机流程一般是先刷入TWRP,然后将卡刷包传入手机sdcard中。再用TWRP的命令功能刷入镜像。第三方常见的ROM,比如魔趣、lineageOS、PixelExperience等系统,ROM编译完成后,输出目录的就是卡刷包。
|
||||
卡刷指的是刷机过程不需要使用数据线连接电脑,而是将设备启动进入恢复模式,在该模式下,将放在设备上的刷机镜像直接刷入设备。卡刷包一般是一个zip格式的压缩包文件。目前,比较流行的第三方设备恢复镜像是TWRP。刷机流程一般是先刷入TWRP,然后将卡刷包传入手机sdcard中。再用TWRP的命令功能刷入镜像。第三方常见的ROM,比如魔趣、lineageOS、PixelExperience等系统,ROM编译完成后,输出目录的就是卡刷包。
|
||||
|
||||
### 1.2.4 改机
|
||||
|
||||
每个设备都有各自的唯一标识和对应的指纹信息。这里的指纹信息,并不是指手指的指纹,而是一个概念的意思。比如每个人指纹不同,是因为手指有很多细微的纹路,纹路都组合在一起时,就会每个人的都不同了。设备也是如此,有很多种设备信息,当这些设备信息组合在一起时,就可以当作是这台设备唯一标识的指纹特征。
|
||||
每个设备都有各自的唯一标识和对应的指纹信息。这里的指纹信息,并不是指手指的指纹,而是一个概念的意思。比如每个人指纹不同,是因为手指有很多细微的纹路,纹路都组合在一起时,就会每个人的都不同了。设备也是如此,有很多种设备信息,当这些设备信息组合在一起时,就可以当作是这台设备唯一标识的指纹特征。
|
||||
|
||||
在风控对抗中,有些应用会收集设备的各种信息组合为设备指纹,记录起来。有些设备信息是属于风险设备,就会被特殊处理。而我们自己定制的AOSP,以及谷歌天然支持的Pixel手机,就很容易被判定为高风险设备。所以我们自己编译的ROM常常会碰到被检测的情况,识别到属于风险设备后,就可能导致app闪退,或者不给正确的结果,或者服务端标记为风险用户等等情况。这时我们就需要对获取设备信息的各个接口进行修改,或者直接将设备信息相关的文件修改,伪装成一台正常的手机。有时应用并不会通过系统接口来获取设备指纹,而是直接通过系统目录,或者将系统文件结构作为设备信息,或者是绕过你的修改,通过底层内联汇编执行系统调用,来读取文件获取你的设备信息,这种情况就需要分析和持续的对抗了。
|
||||
在风控对抗中,有些应用会收集设备的各种信息组合为设备指纹,记录起来。有些设备信息是属于风险设备,就会被特殊处理。而我们自己定制的AOSP,以及谷歌天然支持的Pixel手机,就很容易被判定为高风险设备。所以我们自己编译的ROM常常会碰到被检测的情况,识别到属于风险设备后,就可能导致app闪退,或者不给正确的结果,或者服务端标记为风险用户等等情况。这时我们就需要对获取设备信息的各个接口进行修改,或者直接将设备信息相关的文件修改,伪装成一台正常的手机。有时应用并不会通过系统接口来获取设备指纹,而是直接通过系统目录,或者将系统文件结构作为设备信息,或者是绕过你的修改,通过底层内联汇编执行系统调用,来读取文件获取你的设备信息,这种情况就需要分析和持续的对抗了。
|
||||
|
||||
## 1.3 安卓系统发展史
|
||||
|
||||
2003年由安迪.鲁宾、克里斯.怀特等人开发制作。最初方向只是创建一个数字相机的操作系统,后来由于数码相机市场的萎缩,智能手机的快速发展,最后重新将安卓定位为开发一款智能手机操作系统。于2005年7月11日被Google收购。
|
||||
2003年由安迪.鲁宾、克里斯.怀特等人开发制作。最初方向只是创建一个数字相机的操作系统,后来由于数码相机市场的萎缩,智能手机的快速发展,最后重新将安卓定位为开发一款智能手机操作系统。于2005年7月11日被Google收购。
|
||||
|
||||
2007年11月,Google牵头联合了硬件制造商,软件开发商,通讯运营商成立了“开放手机联盟”,共同研发Android,随后开放了Android源码。11月5日,Android1.0公测版面世
|
||||
2007年11月,Google牵头联合了硬件制造商,软件开发商,通讯运营商成立了“开放手机联盟”,共同研发Android,随后开放了Android源码。11月5日,Android1.0公测版面世
|
||||
|
||||
2008年9月,发布了第一款安卓智能机:HTC Dream,这个时候还是诺基亚塞班系统的天下,这是时候并没有多少人看好Android系统。
|
||||
2008年9月,发布了第一款安卓智能机:HTC Dream,这个时候还是诺基亚塞班系统的天下,这是时候并没有多少人看好Android系统。
|
||||
|
||||
2010年末,刚出世两年的Android操作系统在市场占有率上打败了塞班系统。这时的Android2.3版本
|
||||
2010年末,刚出世两年的Android操作系统在市场占有率上打败了塞班系统。这时的Android2.3版本
|
||||
|
||||
2011年10月,Android4.0发布,首次支持通过使用照相机拍摄用户的脸部来解锁手机
|
||||
2011年10月,Android4.0发布,首次支持通过使用照相机拍摄用户的脸部来解锁手机
|
||||
|
||||
2014年,Android5.0发布,这是第一个使用Google全新Material Design语言的版本,用户操作界面和UI的外挂得到了升级。同时加上了对双SIM卡的支持。
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user