2023-05-06 18:07:42 +08:00
..
2022-11-30 15:06:49 +08:00
2023-05-06 18:07:42 +08:00

第1章 引言

Android系统并不是一个新兴的技术,如今Android已经占领各大移动端市场,不单单是手机市场,还有许多智能设备也是使用的Android系统来驱动,例如智能电视、Android机顶盒、车载娱乐系统、智能手表、智能家居等等,由于Android的灵活性和开放性,让其可定制性在各类设备中得到充分的利用。开发者可以根据自身业务的需求,自由的改造Android 系统。在这一章中,将简单的介绍Android系统和定制。通过这一章的学习,让读者对于Android系统中的常见名词有一个简单的了解。

1.1 AOSP是什么

Android操作系统是如今最流行使用最广的智能手机操作系统,它的发展受到广大厂商和用户的支持,而Android操作系统的开源使它可以被任何人定制化,从而满足各类厂商和不同需求的用户。

AOSP的全称是“Android Open Source Project”,也就是安卓开源项目,它是由谷歌发起的移动设备的操作系统开源项目,任何人都可以自由地获取完整的项目源码,以及提交更新完善项目,同时,谷歌也会不断地迭代更新版本。

由于Android的开源,各大手机厂商能能够自由地定制系统的源码,适配自己的硬件,由此衍生出了各种产品。常见的国产安卓设备的系统基本是厂商开发团队基于AOSP源码不断进行改造和优化的结果,例如小米MIUI系统、华为Harmony系统、一加的H2OS系统等等,大多数都是基于AOSP的源码修改而来。如今的Android能够百花齐放,占据手机市场的半壁江山,也是主要得益于AOSP的开源。

由于AOSP项目过于庞大和复杂,在了解和学习的过程中,要善于查询官方的说明文档。Android官方文档地址: https://source.android.com

下图是官方文档中的AOSP的框架结构图。

android_framework_details

1.1.1 Android框架

对于新手而言,刚开始接触安卓源码时,对于很多基础理论性的知识都是懵懵懂懂的。这些基础并不需要完全的记住,只需要大概有这么一个概念,以及了解它们之间依赖关系的印象即可,等熟悉Android源码后,大多数理论知识部分,就会茅塞顿开了。

简单介绍一下框架的概念,框架是一种软件开发的基础结构,它提供了一组标准化的、可重用的代码和工具,帮助开发者更加高效地开发应用程序。通常,框架包括一些约定、规则和指南,以及可以被开发者扩展的可插入的模块。

框架的设计目的是简化开发过程,提高代码的可维护性和可扩展性,并促进开发人员之间的协作。通过使用框架,开发人员可以专注于业务逻辑而不必处理底层的实现细节,从而减少开发时间和成本,同时也能够降低代码错误率和风险。常见的框架有Web框架、移动应用框架、游戏引擎框架等。下面简单介绍Android框架的结构。

1.1.2 Apps

Apps是日常开发的应用层,用户安装的应用,游戏等等都属于这一层,普通应用基本都在手机的目录/data/app中。包括AOSP提供的系统APP,也是属于应用层。例如相机、短信、图库,在/system/app目录下的应用。应用层直接对接用户的输入操作和输出展示。这里的输入指的是,对手机进行的操作,例如点击屏幕,手机上的按键,所有对手机进行的操作行为,统称为一种输入。而输出指的是,手机接收到输入行为后的一种反馈,例如屏幕亮了,手机震动,页面刷新等等所有通过手机展示给你看到的,都算是手机的输出。

1.1.3 Framework

Framework框架指的是包含了大量系统级服务和API的软件层。它位于操作系统内核Linux和应用程序之间提供了一组通用的、可重用的软件组件以方便开发者构建各种类型的应用程序。下面简单列举几个框架层中的关键组件。

Framework框架被设计成一个分层架构,包含多个组件,如Activity Manager、Window Manager等。这些组件与应用程序和硬件之间进行交互,并提供了许多通用功能,如界面管理、数据存储、网络通信等。

通过使用Framework框架,开发人员可以快速地编写复杂的应用程序,并在不同设备上运行,同时也能够轻松地处理常见的Android应用程序逻辑。此外,由于Framework框架的广泛使用,它还为第三方开发者提供了良好的兼容性和稳定性。下面简单列举几个Framework中的组件。

  1. Activity Manager负责了系统中四大组件的启动、调度、管理。所有的Activity的生命周期都是在它的范畴。
  2. Location Manager位置信息和定位的管理组件
  3. Telephony Manager电话管理组件,可以获取sim卡相关信息以及网络信息
  4. Window Manager窗口程序管理组件

当应用层调用管理组件后,管理组件会进而调用对应的Service来执行相应的函数。简单来说就是XXX Manager基本是提供给应用层调用,真正的处理逻辑是在XXX Service中处理。如下图所示:

manager_service

也可以更直观的去看framework的实现,连接手机。将jar文件传到电脑

adb shell
cp /system/framework/framework.jar /sdcard/
adb pull /sdcard/framework.jar ./

然后使用jadx打开将framework.jar文件,如下图所示:

jadx_framework

1.1.4 Native Libraries

C/C++的常用库的支持,比如比较典型的libc、ssl、OpenGL、WebKit等等。为开发大大的提高了效率和性能。避免每次用到都需要自己去找工具库。

1.1.5 Android Runtime

缩写ART,是Android5.0中的使用的新技术,替换了以前的Dalvik虚拟机运行环境。虽然android开发常常使用的是java,但是android开发的应用并不是运行在JVM虚拟机中,而是类似的针对dex结构的Dalvik虚拟机和ART虚拟机。在android4.4开始测试ART功能,随后逐渐使用ART虚拟机全面替代了Dalvik虚拟机。ART使用了更高效的代码编译技术Ahead-of-Time,简称AOT编译。大致就是在安装应用时,将程序代码编译成可执行的机器码,而在运行时不再需要编译。由此提高了应用的运行效率,极大的提高用户体验。

1.1.6 HAL硬件抽象层

主要作用于系统内核与硬件之间的接口,是Android系统底层的部分,具有提供给硬件供应商实现的标准接口,Android系统通过接口访问硬件设备,也就是硬件的驱动程序开发,因此Android操作系统能够与各类硬件设备进行交互,不用关心底层硬件的处理。也有个说法是因为硬件供应商不愿意自身的驱动放在内核中被一起开源。所以单独抽出了HAL层来对接硬件驱动。

1.1.7 Linux内核

系统的最重要的核心部分内核负责与设备底层的硬件进行交互。比如显示驱动、音频驱动、WIFI驱动、电源驱动、内存管理、进程管理网络通信等等内核相当于一个操作系统的灵魂。

1.2 系统开发,定制,刷机,改机分别是什么

系统开发是指开发新的操作系统或对现有操作系统进行修改和优化的过程。这通常需要专业的编程技能和深入的计算机系统知识。

定制是指根据客户的需求,对软件或硬件进行修改,以满足特定的需求。这可以包括添加新功能、修改现有功能或更改用户界面等。

刷机是指在手机或其他电子设备上,安装或替换操作系统的过程。这通常需要在设备上进行一些技术操作,例如解锁设备的引导加载程序,或使用特殊的刷机工具进行刷写。

改机是指对手机或其他电子设备进行硬件或软件方面的修改,以增强其性能或添加新功能。对软件的修改称为软改,对硬件的修改称为硬改。软改在软件安全领域通常指的是一种设备指纹信息的修改,以达到隐藏设备信息检测或风控系统绕过;硬改可以包括更换处理器、增加内存、添加新的传感器或修改设备的固件等。需要注意的是,错误的修改,可能会导致设备失去保修或无法使用。而且,改机技术本身需要慎用,通常它代表着为设备增加一层“伪装”,在网络安全领域中,改机过的设备是各种计算机信息犯罪的工具材料,是黑灰产的代名词,不正规的使用具有极高的法律风险。

1.2.1 系统开发

常规的Android开发,属于应用层开发。而在开发应用层时,会接触到大量的系统提供的API,为获取权限、跨进程通信、网络请求等功能提供了便利。而运行的App整个生存周期都是寄托于Android框架中。作为开发人员,往往最多面对的问题就是,系统给你提供了哪些功能,系统允许了你哪些权限范围。但是并不代表着,能满足所有群体的所有需求。这个时候就需要了解Android系统架构,根据自己的需求,去添加功能提供接口(API)给应用层开发的App使用。

非常常见的一个场景就是,AOSP是谷歌开源的系统,而谷歌的开发者并不一定了解其他国家的国情,用户的习惯。那么国内的厂商进行系统开发扩展功能,就需要考虑到国内用户体验,对界面,操作方式,系统服务等一些功能进行开发,并适配自己的硬件。

这里主要是对Android系统的底层原有的代码进行修改定制化,调整系统的部分框架和核心代码来实现新的功能,例如硬件的驱动支持,优化系统的性能,实现开发者自己的ROM

1.2.2 定制

系统定制也是属于系统开发的一种,属于轻量级的改动。往往不会对系统进行太大的变动。比如下面的场景。系统就像是一个沙箱,开发的应用是在沙箱中运作的小盒子。需要对应用进行分析和观测时,可以通过修改小盒子运行流程时对系统相关的调用,来分析应用执行的各种状态。只要对Android系统有足够的了解,就可以像开了上帝视角一般,对普通应用进行跨维度的分析。

轻量级的定制,比如对系统的预装应用进行修改,优化桌面的结构,预装系统权限App,替换系统默认应用,修改配置等等。

在本人看来,可以简单的划分,大团队多人开发ROM功能进行分层分模块对整个源码的系统UI运行优化驱动支持等等进行完整的改造可以看作是系统开发而个人或小团队不考虑代码的兼容性不考虑多设备的适配不考虑用户安全和隐私保护仅为自身需求而进行修改ROM,这种行为就可以叫定制。

1.2.3 刷机

在最早先的Android版本界面非常简陋,而且功能并不是那么完善,随着各大第三方团队的加入,非官方ROM越来越多,而官方原版ROM长久使用后越来越卡,善于折腾的手机用户就开始尝试使用功能相对完善,界面漂亮,性能更好的第三方ROM。更换ROM的过程就叫做刷机。刷机的方式通常有两种,分别是线刷和卡刷。

线刷指的是刷机时候需要用数据线连接电脑,将线刷包通过数据线刷入设备。这里,刷机用到的系统镜像称为“线刷包”。线刷包一般都是分区镜像img后缀的文件。通过执行命令adb reboot bootloader,进入设备刷机模式后,然后执行fastboot flash命令,刷入对应分区的镜像。而AOSP编译完成后默认输出结果就是分区镜像。

卡刷指的是刷机过程不需要使用数据线连接电脑,而是将设备启动进入恢复模式,在该模式下,将放在设备上的卡刷包直接刷入设备。卡刷包一般是一个zip格式的压缩包文件。目前,比较流行的第三方设备恢复工具是TWRP。刷机流程是先刷入TWRP,然后将卡刷包传入手机sdcard中。再用TWRP的刷入镜像。第三方常见的ROM,比如魔趣、lineageOSPixelExperience等系统,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全球网络流量和设备超越微软的Windows,正式成为全球第一大操作系统。

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系统,主要针对的用户群体也是国内用户,所以在功能和操作方面非常贴切国人的使用习惯,同时简单纯净,性能出众,因此有着不少用户使用魔趣ROM作为日常用的手机。下面是魔趣支持的手机厂商,

ARK 华硕 Essential 谷歌
HTC 华为 乐视 联想
LG 魅族 摩托罗拉 Nextbit
努比亚 一加 OPPO Realme
红米 三星 锤子 索尼
Wileyfox 小米 YU 中兴
ZUK

如果想要进一步了解,可以看看魔趣为AOSP扩展的功能 https://www.mokeedev.com/guide/feature.html

1.4.2 PixelExperience

官网:https://download.pixelexperience.org/

这是最接近原生Android系统的第三方ROM,它是在Google Pixel系列设备发布的,拥有着Pixel系列设备的原生外观和功能,并且添加了更多可定制的功能,它还预装了谷歌插件,并且还提供了大量可定制的主题,以及强大的安全性功能。而正常编译出来的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 系统定制的发展趋势

TODO

1.6 小结

TODO