这两天和 360 加固抗衡了很久,突然发现自己现在的水平或许还无法搞定 360 加固,晚上睡觉的时候思考了一下,发现原因在于自己对于安卓还没有掌握,甚至连熟悉都算不上。以往学逆向的过程中总流传着一句话:要想逆向做的好,正向必须得精通。我现在连安卓里面有什么都不知道,那还怎么去搞安卓逆向呢?所以这两个月,我要静下心来,好好学习安卓的架构基本组件和基本的机制,把正向的基础打扎实!

我准备用自底向上的方法来学习安卓系统,从内核开始学起,因为上层的许多模块都是基于下层的,倘若直接从上层开始学起,那肯定会遇到许多下层的模块导致一时之间摸不着头脑.

# 安卓系统整体架构

这张图很清晰的描述了安卓的整体架构,从上到下共有五层

Android 软件堆栈

Android 是基于 Linux 内核的,从广义的角度说,它可以分为 Linux 内核层用户空间层

# Linux 内核层

Android 系统是基于 Linux 内核的,这一层为 Android 设备的各种硬件提供了底层的驱动,管理底层驱动程序,用于和设备硬件直接交互,除了 Linux 内核的进程、内存管理等,还包含 Android 添加的特色驱动程序 Binder , LoggerAshmem

Linux 内核层

Android 对于 Linux 进行了改动,比如它没有 glibc ,最初一些便携的移动设备并没有采用 glibc 作为 c 库,而是 google 自己开发的 Bionic Libc 来作为代替品,也并没有完全照搬 Linux 系统的内核还增加了 Gold-Fish 平台以及 yaffs2 Flash 文件系统.

安卓驱动概述如下

  1. Binder IPC 驱动:基于 OpenBinder 框架的一个驱动,用于提供 Android 平台的进程间通信功能。源代码位于 drivers/staging/android/binder.c
  2. 电源管理 (PM) :一个基于标准 Linux 电源管理系统的轻量级 Android 电源管理驱动,针对嵌入式设备做了很多优化,比如电池电量。源代码位于: kernel/power/earlysuspend.c、kernel/power/consoleearlysuspend.c、kernel/power/fbearlysuspend.c、kernel/power/wakelock.c、kernel/power/userwakelock.c
  3. 低内存管理器:比 Linux 的标准的 OOM 机制更加灵活,它可以根据需要杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c
  4. 匿名共享内存: 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于 mm/ashmem.c
  5. PMEM :用于向用户空间提供连续的物理内存区域, DSP 和某些设备只能工作在连续的物理内存上。源代码位于 drivers/misc/pmem.c
  6. Logger :一个轻量级的日志设备,用于抓取 Android 系统的各种日志。源代码位于 drivers/staging/android/logger.c
  7. Alarm :提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会 运行的时钟基准。源代码位于 drivers/rtc/alarm.c
  8. USB Gadget :驱动 一个基于标准 Linux USB gadget 驱动框架的设备驱动,Android 的 USB 驱动是基于 gaeget 框架的。源代码位于 drivers/usb/gadget/
  9. Ram Console : 为了提供调试功能,Android 允许将调试日志信息写入一个被称为 RAM Console 的设备里,它是一个基于 RAM 的 Buffer 。源代码位于 drivers/staging/android/ram_console.c
  10. timed device : 提供了对设备进行定时控制的功能,目前支持 vibrator 和 LED 设备。源代码位于 drivers/staging/android/timed_output.c(timed_gpio.c )。
  11. 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 提供主要的特性支持

系统库是应用程序框架的支撑,共有九个

  1. Libc :系统 c 库,是从 BSD 继承来的标准 C 系统函数库,专门为基于 EmbeddedLinux 的设备定制。
  2. Media Framework (多媒体库):Android 系统多媒体库,基于 PacketVideoOpenCORE 。该库支持录放。并且可以录制许多流行的音频视频格式。还有静态映像文件,包括 MPEG4、H.264、MP3、AAC、JPG、PNG 等。
  3. Surface Manager :主要负责管理针对显示系统的访问,并且为多个应用程序提供 2D 和 3D 图层的无缝融合。
  4. Webkit :浏览器。一个最新的 web 浏览器引擎,用来支持 Android 浏览器和一个可嵌入的 Web 视图。
  5. SGL :一个内置的 2D 图形引擎。
  6. SSL :位于 TCP/IP 与各种应用层协议之间为数据通信提供支持。
  7. OpenGL ES :3D 效果的支持。基于 OpenGLES 1.0 APIs 实现;该库可以使用硬件 3D 加速或者使用高度优化的 3D 软加速。
  8. greeType :提供位图 bitmap 和向量 vector 的字体描述与显示。
  9. SQLite :一个对于所有应用程序可用、功能强劲的轻型关系型数据库引擎

除了上面的主要系统类库之外,还有 Android NDK ,即 Android 原生库。

Android 运行时库包含核心库和 Dalvik 虚拟机

  • 核心库:提供了 Java 语言 API 中的大多数功能,同时也包含 Android 的一些核心 API. 如 android.OSandroid.netandroid.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)

系统内置的应用程序以及非系统级的应用程序都属于应用层,负责与用户进行直接交互,通常使用 JavaKotlin 进行开发

# 参考资料

  • Android 系统架构 —— 导读
  • 了解安卓架构 (linux 内核层、系统运行库层、应用框架层、应用层)
  • 浅谈 HAL(1)- 介绍
  • Android 系统五层架构
更新于 阅读次数