这两天和 360 加固抗衡了很久,突然发现自己现在的水平或许还无法搞定 360 加固,晚上睡觉的时候思考了一下,发现原因在于自己对于安卓还没有掌握,甚至连熟悉都算不上。以往学逆向的过程中总流传着一句话:要想逆向做的好,正向必须得精通。我现在连安卓里面有什么都不知道,那还怎么去搞安卓逆向呢?所以这两个月,我要静下心来,好好学习安卓的架构基本组件和基本的机制,把正向的基础打扎实!
我准备用自底向上的方法来学习安卓系统,从内核开始学起,因为上层的许多模块都是基于下层的,倘若直接从上层开始学起,那肯定会遇到许多下层的模块导致一时之间摸不着头脑.
# 安卓系统整体架构
这张图很清晰的描述了安卓的整体架构,从上到下共有五层
Android 是基于 Linux 内核的,从广义的角度说,它可以分为 Linux 内核层和用户空间层
# Linux 内核层
Android 系统是基于 Linux 内核的,这一层为 Android 设备的各种硬件提供了底层的驱动,管理底层驱动程序,用于和设备硬件直接交互,除了 Linux 内核的进程、内存管理等,还包含 Android 添加的特色驱动程序 Binder
, Logger
和 Ashmem
Android 对于 Linux
进行了改动,比如它没有 glibc
,最初一些便携的移动设备并没有采用 glibc
作为 c 库,而是 google 自己开发的 Bionic Libc
来作为代替品,也并没有完全照搬 Linux 系统的内核还增加了 Gold-Fish
平台以及 yaffs2 Flash
文件系统.
安卓驱动概述如下
Binder IPC
驱动:基于OpenBinder
框架的一个驱动,用于提供 Android 平台的进程间通信功能。源代码位于drivers/staging/android/binder.c
。- 电源管理 (PM) :一个基于标准 Linux 电源管理系统的轻量级 Android 电源管理驱动,针对嵌入式设备做了很多优化,比如电池电量。源代码位于:
kernel/power/earlysuspend.c、kernel/power/consoleearlysuspend.c、kernel/power/fbearlysuspend.c、kernel/power/wakelock.c、kernel/power/userwakelock.c
- 低内存管理器:比 Linux 的标准的 OOM 机制更加灵活,它可以根据需要杀死进程以释放需要的内存。源代码位于
drivers/staging/ android/lowmemorykiller.c
。 - 匿名共享内存: 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于
mm/ashmem.c
。 PMEM
:用于向用户空间提供连续的物理内存区域,DSP
和某些设备只能工作在连续的物理内存上。源代码位于drivers/misc/pmem.c
。Logger
:一个轻量级的日志设备,用于抓取 Android 系统的各种日志。源代码位于drivers/staging/android/logger.c
。Alarm
:提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会 运行的时钟基准。源代码位于drivers/rtc/alarm.c
。USB Gadget
:驱动 一个基于标准Linux USB gadget
驱动框架的设备驱动,Android 的 USB 驱动是基于 gaeget 框架的。源代码位于drivers/usb/gadget/
。Ram Console
: 为了提供调试功能,Android 允许将调试日志信息写入一个被称为RAM Console
的设备里,它是一个基于 RAM 的Buffer
。源代码位于drivers/staging/android/ram_console.c
。timed device
: 提供了对设备进行定时控制的功能,目前支持vibrator
和 LED 设备。源代码位于drivers/staging/android/timed_output.c(timed_gpio.c
)。Yaffs2
:Android 采用Yaffs2
作为MTD nand flash
文件系统,源代码位于fs/yaffs2/
目录下。Yaffs2 是一个快速稳定的应用于 NAND 和 NOR Flash 的跨平台的嵌入式设备文件系统,同其他 Flash 文件系统相比,Yaffs2 能使用更小的内存来保存其运行状态,因此它占用内存小。Yaffs2 的垃圾回收非常简单而且快速,因此能表现出更好的性能。Yaffs2 在大容量的NAND Flash
上的性能表现尤为突出,非常适合大容量的 Flash 存储。
# 用户空间层
# 硬件抽象层 (HAL)
硬件抽象层本应该属于 Linux 内核的驱动的,但是由于部分硬件厂商不想把自己的核心代码公开,如果把代码放在内核空间里就需要遵循 GUN License
,会损害厂家的利益。所以,Google 为了响应厂家,在 Android 的架构里提出 HAL 的概念,把对硬件的支持分为用户空间和内核空间,而 HAL 层就属于这里面的用户空间,该部分代码遵循 Apache License
,所以厂家可以把核心的代码实现在 HAL 层,无需对外开放源代码。
HAL 使用抽象和封装的概念,解决了解决软件和硬件的 “冲突” 的问题,是 Linux 内核与用户空间交互的纽带,他有如下优点
- 使用 HAL 可以帮助开发人员减少开发时间并提高代码架构质量;
- HAL 的实现可以作为动态库或模块加载,实现了对硬件的抽象,同时也可以隐藏代码(便捷性 + 安全性)。
# 系统库和运行时库 (Native C/C++ Library&&Android Runtime)
通过一些 c/c++
库来为 Android 提供主要的特性支持
系统库是应用程序框架的支撑,共有九个
Libc
:系统 c 库,是从 BSD 继承来的标准 C 系统函数库,专门为基于EmbeddedLinux
的设备定制。Media Framework
(多媒体库):Android 系统多媒体库,基于PacketVideoOpen
、CORE
。该库支持录放。并且可以录制许多流行的音频视频格式。还有静态映像文件,包括 MPEG4、H.264、MP3、AAC、JPG、PNG 等。Surface Manager
:主要负责管理针对显示系统的访问,并且为多个应用程序提供 2D 和 3D 图层的无缝融合。Webkit
:浏览器。一个最新的 web 浏览器引擎,用来支持 Android 浏览器和一个可嵌入的 Web 视图。SGL
:一个内置的 2D 图形引擎。SSL
:位于 TCP/IP 与各种应用层协议之间为数据通信提供支持。OpenGL ES
:3D 效果的支持。基于 OpenGLES 1.0 APIs 实现;该库可以使用硬件 3D 加速或者使用高度优化的 3D 软加速。greeType
:提供位图 bitmap 和向量 vector 的字体描述与显示。SQLite
:一个对于所有应用程序可用、功能强劲的轻型关系型数据库引擎
除了上面的主要系统类库之外,还有 Android NDK
,即 Android 原生库。
Android 运行时库包含核心库和 Dalvik
虚拟机
-
核心库:提供了 Java 语言 API 中的大多数功能,同时也包含
Android
的一些核心 API. 如android.OS
、android.net
、android.media
等。 -
Dalvik
虚拟机:Android 程序不同于 J2ME 程序(是 java 的一种运行环境),每个 Android 应用都运行在自己的进程上,享有 Dalvik 虚拟机为它分配的专有实例,并在该实例中执行。Dalvik 虚拟机可执行文件格式是(.dex
)。 大多数虚拟机包括 JVM 都是基于栈的,而 Dalvik 虚拟机则是基于寄存器的,所有的类都经由 JAVA 编译器编译,然后通过 SDK 中 的 “dx” 工具转化成.dex 格式由虚拟机执行。在一些底层功能例如线程和低内存管理等方面,Dalvik 虚拟机是依赖 Linux 内核的。
# 应用框架层 (Java API Framework)
应用框架层为开发人员提供了开发应用程序所需要的 API,我们平常开发应用程序都是调用这一层所提供的 API,当然也包括系统应用。这一层是由 Java 代码编写的,可以称为 Java Framework。这一层所提供的主要组件如下
名称 | 功能描述 |
---|---|
Activity Manager(活动管理器) | 管理各个应用程序生命周期,以及常用的导航回退功能 |
Location Manager(位置管理器) | 提供地理位置及定位功能服务 |
Package Manager(包管理器) | 管理所有安装在 Android 系统中的应用程序 |
Notification Manager(通知管理器) | 使得应用程序可以在状态栏中显示自定义的提示信息 |
Resource Manager(资源管理器) | 提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等 |
Telephony Manager(电话管理器) | 管理所有的移动设备功能 |
Window Manager(窗口管理器) | 管理所有开启的窗口程序 |
Content Provider(内容提供者) | 使得不同应用程序之间可以共享数据 |
View System(视图系统) | 构建应用程序的基本组件 |
# 应用层 (System Apps)
系统内置的应用程序以及非系统级的应用程序都属于应用层,负责与用户进行直接交互,通常使用 Java
或 Kotlin
进行开发
# 参考资料
- Android 系统架构 —— 导读
- 了解安卓架构 (linux 内核层、系统运行库层、应用框架层、应用层)
- 浅谈 HAL(1)- 介绍
- Android 系统五层架构