/ Android 系统目录与文件设计架构 — 完整知识体系
📱 Android 系统架构概述
Android 是基于 Linux 内核的移动操作系统,由 Google 领导的开放手机联盟 (OHA) 开发维护。其架构采用分层设计,从底层内核到上层应用框架各层职责明确。
Android 软件栈层次结构
▼
┌─────────────────────────────────────────────────────────────┐ │ 📱 Applications │ │ (Home, Contacts, Phone, Browser, Games, 3rd Party Apps) │ ├─────────────────────────────────────────────────────────────┤ │ 📦 Java API Framework │ │ ┌─────────┬──────────┬─────────────┬──────────┬─────────┐ │ │ │ Activity│ Window │ View │ Package │ Resource│ │ │ │ Manager │ Manager │ System │ Manager │ Manager │ │ │ ├─────────┼──────────┼─────────────┼──────────┼─────────┤ │ │ │ Content │Telephony │ Notification│ Location │ Power │ │ │ │Providers│ Manager │ Manager │ Manager │ Manager │ │ │ └─────────┴──────────┴─────────────┴──────────┴─────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 🏛️ Native C/C++ Libraries │ Android Runtime │ │ ┌────────────────────────┐ ┌────────────────────────────┐ │ │ │ Surface │ Media │WebKit │ │ ART Runtime │ │ │ │ Flinger│Framework│SQLite│ │ (Core Libraries) │ │ │ │ OpenGL │ libc │ SSL │ │ (DEX → Machine Code) │ │ │ └────────────────────────┘ └────────────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 🔧 Hardware Abstraction Layer (HAL) │ │ ┌──────┬──────┬────────┬───────┬────────┬─────────────┐ │ │ │Camera│Audio │Bluetooth│Sensors│Display │GPS/Location │ │ │ └──────┴──────┴────────┴───────┴────────┴─────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 🐧 Linux Kernel │ Device Drivers │ │ ┌─────┬──────┬──────┬───────┬──────┬───────┬──────────┐ │ │ │Power│Memory│Process│Binder │Camera│Display│WiFi/BT │ │ │ │ Mgmt│ Mgmt│ Mgmt │ IPC │Drv │Driver │Drivers │ │ │ └─────┴──────┴──────┴───────┴──────┴───────┴──────────┘ │ └─────────────────────────────────────────────────────────────┘
Android 各层详细说明
▼
| 层次 | 语言 | 位置 | 说明 |
|---|---|---|---|
| Linux 内核层 | C/汇编 | boot.img 内 | 提供硬件抽象、进程管理、内存管理、安全机制、电源管理等核心操作系统功能。Android 使用定制化的 Linux 内核(通常基于 LTS 版本),包含 Binder 驱动、Ashmem、LowMemory Killer 等特有模块。 |
| HAL 层 | C/C++ | /vendor/lib/hw/ | 硬件抽象层,将硬件功能封装为标准接口暴露给上层。通过 HIDL/AIDL 定义接口规范,实现框架层与硬件驱动的解耦。是 Project Treble 的关键组成部分。 |
| Native 库层 | C/C++ | /system/lib(64)/ | 系统核心 C/C++ 共享库,包括图形引擎(Skia/OpenGL)、媒体框架(Stagefright/MediaCodec)、数据库(SQLite)、渲染引擎(SurfaceFlinger)、Binder 通信等。 |
| ART 运行时 | C++/Java | /system/lib/libart.so | Android Runtime,替代早期的 Dalvik VM。使用 AOT(提前编译) + JIT(即时编译) + Profile-Guided Optimization 策略,将 DEX 字节码编译为机器码执行。提供 GC、JIT编译、JNI桥接等功能。 |
| Java 框架层 | Java | /system/framework/*.jar | Android 应用开发 API 的实现层,包括 Activity/Window/View 系统、包管理、资源管理、通知系统、位置服务、电话服务等所有系统服务的 Java 实现。 |
| 应用层 | Java/Kotlin | /data/app/, /system/app/ | 系统预装应用和第三方安装的应用程序。所有应用通过 Android SDK 提供的 API 与系统交互,运行在独立的 Dalvik/ART 虚拟机实例中。 |
Android 版本演进关键里程碑
▼
| 版本 | 年份 | 关键变革 |
|---|---|---|
| Android 1.0-2.3 | 2008-2010 | Dalvik VM、基础API、Linux 2.6内核 |
| Android 4.x | 2011-2013 | Project Butter (60fps)、Holo Design、Fragment |
| Android 5.0 | 2014 | ART替代Dalvik、Material Design、64位支持 |
| Android 6.0 | 2015 | 运行时权限、Doze省电、Fingerprint API |
| Android 7.0 | 2016 | A/B无缝升级、JIT编译器、Vulkan API、分屏 |
| Android 8.0 | 2017 | Project Treble、通知频道、后台限制 |
| Android 9 | 2018 | AI自适应、手势导航、Digital Wellbeing |
| Android 10 | 2019 | APEX模块化、Scoped Storage、隐私沙盒 |
| Android 11 | 2020 | 一次性权限、会话气泡、Conversations |
| Android 12 | 2021 | Material You、AIDL HAL、模糊渲染 |
| Android 13 | 2022 | 细化媒体权限、Themed Icons、多语言 |
| Android 14 | 2023 | Ultra HDR、Health Connect、Path APIs |
| Android 15 | 2024 | 卫星通信、Private Space、16KB页面 |
| Android 16 | 2025-2026 | Health Connect扩展、预测性返回优化 |
📁 Android 根目录结构
Android 基于 Linux 内核构建,根目录包含系统分区挂载点和伪文件系统。从 Android 8.0 (Oreo) 引入 Project Treble 后,系统分区进一步解耦。
完整根目录树
▼
/
根文件系统 (rootfs) — 由 initramfs 提供
├──
system/
系统分区 (read-only) — Android OS 核心文件
│ ├──
app/
普通系统预装应用
│ ├──
priv-app/
特权系统应用
│ ├──
framework/
Java 框架层核心 JAR 文件
│ ├──
lib/
32位 Native 共享库
│ ├──
lib64/
64位 Native 共享库
│ ├──
bin/
系统可执行文件和守护进程
│ ├──
etc/
系统配置文件目录
│ ├──
fonts/
系统字体文件
│ ├──
media/
系统媒体资源(铃声/动画)
│ ├──
vendor/
厂商文件(旧版兼容)
│ ├──
apex/
预置 APEX 模块
│ ├──
usr/
键盘布局/输入设备配置
│ ├──
tts/
TTS 语音合成资源
│ └──
build.prop
系统构建属性文件
│ ├──
data/
数据分区 (read-write) — 用户数据和APP数据
│ ├──
data/
各APP私有数据 (沙盒)
│ ├──
app/
用户安装的第三方APK
│ ├──
system/
系统运行时数据(packages.xml等)
│ ├──
dalvik-cache/
ART 编译缓存
│ ├──
misc/
WiFi/蓝牙/密钥库等杂项
│ ├──
anr/
ANR Trace 文件
│ ├──
tombstones/
Native Crash Dump
│ └──
media/
用户媒体文件
│ ├──
vendor/
厂商分区 — HAL/驱动/芯片厂商代码
├──
product/
产品分区 — 产品型号级定制
├──
odm/
ODM分区 — 硬件设计商定制
├──
system_ext/
系统扩展分区
├──
oem/
OEM自定义分区(可选)
├──
persist/
持久化数据分区(设备校准等)
│ ├──
cache/
缓存分区 — OTA/Recovery临时文件
├──
sdcard/
外部存储挂载点 → /storage/emulated/0
├──
storage/
存储挂载管理目录
│ ├──
proc/
进程信息伪文件系统 (/proc/*)
├──
sys/
内核设备和驱动信息 (/sys/*)
├──
dev/
设备文件 (/dev/*)
├──
mnt/
挂载点管理
├──
acct/
账户 cgroup 管理
├──
config/
内核配置 (configfs)
│ ├──
init
→ /system/bin/init (PID 1)
├──
init.rc
主初始化脚本
├──
init.${ro.hardware}.rc
硬件特定初始化脚本
├──
default.prop
默认系统属性
├──
fstab.${ro.hardware}
文件系统挂载表
├──
ueventd.rc
设备节点权限配置
└──
verity_key
验证启动公钥
💡 关键说明
• 根目录中的 /proc、/sys、/dev 是内存中的伪文件系统,由内核动态生成 • /system、/vendor 等是实际分区,启动时由 init 根据 fstab 挂载 • /sdcard 是软链接,实际指向 /storage/emulated/0 • 早期Android还有 /sbin(adbd) 和 /charger(充电动画)
💿 分区架构演进
分区架构历史演进
▼
| 时期 | 分区方案 | 特点 |
|---|---|---|
| Pre-Treble (Android ≤ 7.1) | /system 包含所有内容 (Google代码 + 厂商代码混合) | • 升级 Android 需要芯片厂商重新适配 • 设备碎片化严重 • 大版本升级周期长(通常6-12个月) |
| Treble (Android 8.0+) | /system + /vendor (Google/厂商分离) | • 厂商HAL独立分区 • 系统升级无需重新适配HAL • GSI(通用系统镜像)成为可能 |
| 现代分区 (Android 10+) | 多分区: system/vendor /product/odm/system_ext | • 更细粒度的定制 • APEX模块独立更新 • 动态分区(Dynamic Partitions) |
现代 Android 完整分区布局:
┌────────────────────────────────────────────────────────┐ │ eMMC / UFS 存储芯片 │ ├────────────────────────────────────────────────────────┤ │ Bootloader 区 │ xbl / abl / tz / hyp / devcfg │ ├────────────────────────────────────────────────────────┤ │ │ ┌──────────────────────────────────┐ │ │ super 分区 │ │ Dynamic Partitions (动态分区) │ │ │ (Android10+) │ │ ┌────────┬──────────┬─────────┐ │ │ │ │ │ │system │ vendor │ product │ │ │ │ │ │ │(可大可小动态调整) │ │ │ │ │ │ ├────────┼──────────┼─────────┤ │ │ │ │ │ │odm │system_ext│ (free) │ │ │ │ │ │ └────────┴──────────┴─────────┘ │ │ │ │ └──────────────────────────────────┘ │ ├────────────────────────────────────────────────────────┤ │ 独立分区 │ boot │ dtbo │ vbmeta │ userdata │ cache │ ├────────────────────────────────────────────────────────┤ │ 持久分区 │ persist │ misc │ frp │ fsg │ └────────────────────────────────────────────────────────┘
✅ 动态分区 (Dynamic Partitions)
Android 10 引入的分区方案,所有逻辑分区(system、vendor、product、odm、system_ext)位于一个名为 super 的物理分区中。优势: • OTA时各分区大小可动态调整,无需预留空间 • 系统更新时可以调整分区大小 • 通过 dm-linear 设备映射实现
分区挂载机制 — fstab 详解
▼
Android 使用 fstab(filesystem table)文件定义分区挂载关系。init 进程在启动早期解析 fstab 并挂载分区。
fstab.${ro.hardware} 文件示例 (Android 12+)
system partition
/dev/block/by-name/system
/system
ext4
ro,barrier=1,discard
wait,slotselect,avb=vbmeta,logical,first_stage_mount
/dev/block/by-name/vendor
/vendor
ext4
ro,barrier=1,discard
wait,slotselect,avb,logical,first_stage_mount
/dev/block/by-name/product
/product
ext4
ro,barrier=1,discard
wait,slotselect,avb,logical,first_stage_mount
/dev/block/by-name/odm
/odm
ext4
ro,barrier=1,discard
wait,slotselect,avb,logical,first_stage_mount
data partition (用户数据)
/dev/block/by-name/userdata
/data
f2fs
noatime,nosuid,nodev,discard
latemount,wait,check,fileencryption=aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized,quota,formattable,reservedsize=128M
cache partition (可选)
/dev/block/by-name/cache
/cache
ext4
noatime,nosuid,nodev
wait,check
persist partition
/dev/block/by-name/persist
/mnt/vendor/persist
ext4
noatime,nosuid,nodev
wait
| 字段 | 说明 | 示例 |
|---|---|---|
| 设备路径 | 分区块设备位置 | /dev/block/by-name/system |
| 挂载点 | 挂载到根文件系统的位置 | /system |
| 文件系统 | 分区使用的文件系统类型 | ext4, f2fs, erofs |
| 挂载选项 | 文件系统挂载参数 | ro(只读), discard(TRIM) |
| fs_mgr 标志 | Android fs_mgr 管理器参数 | wait, avb, logical, slotselect |
fs_mgr 关键标志说明:
wait— 等待设备就绪后再挂载avb/avb=vbmeta— 启用 Android Verified Boot 验证slotselect— A/B 设备选择当前活动槽位logical— 该分区是动态分区的一部分first_stage_mount— 第一阶段 init 时挂载latemount— 延迟到第二阶段挂载fileencryption— 启用文件级加密formattable— 允许格式化quota— 启用磁盘配额check— 启动时检查文件系统完整性
📂 /system 分区详解
/system 分区是 Android 系统的核心,通常在出厂后为只读状态。存放 Android 操作系统的所有关键文件,包括框架、库、应用和配置。
📱 system/app 与 system/priv-app 应用目录
▼
| 目录 | 说明 | 权限特点 |
|---|---|---|
| /system/app/ | 普通系统预装应用,如计算器、日历、浏览器等。可被用户禁用(不能直接卸载)。 | 系统签名或平台签名 |
| /system/priv-app/ | 特权应用,拥有系统级权限。包含系统UI、设置、启动器、电话、联系人等核心应用。使用 signature|privileged 权限保护级别。 | 平台签名,拥有特殊权限白名单 |
/system/app/
普通系统应用
├──
Calculator/
计算器
│ └──
Calculator.apk
├──
Calendar/
日历
├──
Camera2/
相机(非特权版本)
├──
CertInstaller/
证书安装器
├──
Chrome/
Chrome 浏览器
├──
DeskClock/
桌面时钟/闹钟
├──
Email/
电子邮件客户端
├──
Gallery2/
图库应用
├──
KeyChain/
密钥链管理
├──
LatinIME/
AOSP输入法
├──
Music2/
音乐播放器
└──
PrintSpooler/
打印后台服务
/system/priv-app/
特权系统应用
├──
BackupRestoreConfirmation/
备份恢复确认
├──
BlockedNumberProvider/
黑名单提供者
├──
CallLogBackup/
通话记录备份
├──
CarrierConfig/
运营商配置
├──
CellBroadcastReceiver/
小区广播接收
├──
Contacts/
通讯录
├──
ContactsProvider/
联系人内容提供者
├──
Dialer/
拨号器
├──
DownloadProvider/
下载管理器
├──
EmergencyInfo/
紧急信息
├──
ExternalStorageProvider/
外部存储提供者
├──
GoogleServicesFramework/
GMS 框架
├──
Launcher3QuickStep/
系统桌面启动器
├──
MmsService/
彩信服务
├──
NetworkStack/
网络协议栈 (Android 10+ APEX化)
├──
PermissionController/
权限控制器
├──
Phonesky/
Google Play 商店
├──
PrebuiltGmsCore/
Google Play 服务
├──
Settings/
系统设置
├──
SettingsIntelligence/
设置智能搜索
├──
SettingsProvider/
设置数据库提供者
├──
Shell/
Shell 服务
├──
SystemUI/
系统UI(状态栏/通知/快捷设置)
├──
TeleService/
电话服务
├──
Telecom/
电信管理
├──
TelephonyProvider/
电话数据提供者
└──
WifiBackup/
WiFi备份
⚠️ APK 安装位置与权限
• 系统应用位于 /system/app/ 或 /system/priv-app/ 的独立文件夹中 • 文件夹名必须与 APK 包名匹配 • 每个文件夹包含 APK 文件和可选的 lib/ 子目录 • priv-app 中的应用需在 privapp-permissions-*.xml 中声明权限白名单 • 系统应用使用 platform 签名,可访问系统级 API
🏛️ system/framework — Java 框架层
▼
framework 目录包含 Android Java 框架层的核心文件,定义了所有 Java API 的实现。Zygote 进程在启动时预加载这些 JAR 文件。
| 文件 | 说明 | 大小(典型) |
|---|---|---|
| framework.jar | Android 框架核心 JAR,包含 android.* 包下所有类。是应用开发依赖的核心库。包含 Activity、Service、View、Window 等所有组件。 | ~30-50MB |
| services.jar | 系统服务实现,包含 SystemServer 中运行的所有系统服务(AMS, PMS, WMS, ConnectivityService 等)。 | ~15-25MB |
| ext.jar | Apache Harmony 扩展库,包含 dalvik.system 等类。 | ~2-5MB |
| core-oj.jar | OpenJDK 核心库 (core openjdk),Java 基础类库实现(java.lang, java.util 等)。 | ~10-20MB |
| core-libart.jar | ART 运行时相关的核心库。 | ~5-10MB |
| conscrypt.jar | 加密相关库,TLS/SSL 实现(现已迁移至 APEX)。 | ~2-3MB |
| okhttp.jar | OkHttp 网络库实现。 | ~1-2MB |
| bouncycastle.jar | BouncyCastle 加密提供者。 | ~2-3MB |
| apache-xml.jar | Apache XML 解析库。 | ~1-2MB |
| telephony-common.jar | 电话相关公共 API。 | ~2-3MB |
| voip-common.jar | VoIP 通话公共 API。 | ~0.5-1MB |
| ims-common.jar | IMS (IP 多媒体子系统) 公共 API。 | ~1-2MB |
| framework-res.apk | 框架资源包,包含系统级资源(drawable、layout、style、string 等)。所有应用共享此资源。 | ~20-40MB |
📚 BOOTCLASSPATH
系统启动时,BOOTCLASSPATH 环境变量定义了框架 JAR 的加载顺序。在 init.rc 中设置,Zygote 进程按顺序加载这些 JAR 来初始化 Java 运行时环境。加载顺序决定了类的查找优先级。
Zygote 启动时的 BOOTCLASSPATH 设置(简化版)
export
BOOTCLASSPATH
/apex/com.android.art/javalib/core-oj.jar
:
/apex/com.android.art/javalib/core-libart.jar
:
/apex/com.android.art/javalib/okhttp.jar
:
/apex/com.android.art/javalib/bouncycastle.jar
:
/apex/com.android.art/javalib/apache-xml.jar
:
/system/framework/framework.jar
:
/system/framework/ext.jar
:
/system/framework/telephony-common.jar
:
/system/framework/voip-common.jar
:
/system/framework/ims-common.jar
📚 system/lib 与 lib64 — Native 共享库
▼
存放系统级 C/C++ 共享库(.so 文件),分为 32 位和 64 位两个目录。这些库提供了 Android 系统核心功能的 Native 实现。
| 库文件 | 所属模块 | 说明 |
|---|---|---|
| libandroid.so | NDK | Android NDK 核心库,提供 Native Activity、ALooper、AAssetManager、ANativeWindow 等 API。 |
| libandroid_runtime.so | Runtime | Android 运行时桥接层,连接 Java 框架与 Native 层。实现 JNI 注册。 |
| libandroidfw.so | Framework | Android Framework 底层,资源管理、Asset 管理、配置管理。 |
| libart.so | ART | ART 运行时核心库。包含 JIT 编译器、GC、Class Linker、JNI 桥接。 |
| libart-compiler.so | ART | ART AOT 编译器,将 DEX 编译为机器码 (dex2oat)。 |
| libbinder.so | IPC | Android Binder IPC 机制核心库,实现跨进程通信。所有系统服务的基础。 |
| libcamera_client.so | Camera | 相机客户端库,与 CameraService 通信。 |
| libcutils.so | Utils | C 语言实用工具库(属性访问、日志、socket、atomic 等)。 |
| libEGL.so | Graphics | EGL 图形接口,连接 OpenGL ES 与本地窗口系统。 |
| libGLESv2.so | Graphics | OpenGL ES 2.0+ 可编程管线实现。 |
| libgui.so | Graphics | GUI 核心库,SurfaceFlinger 客户端、BufferQueue、Surface 等。 |
| libhardware.so | HAL | 硬件抽象层 (HAL) 接口定义和动态加载。 |
| libhwui.so | UI | 硬件加速 UI 渲染库。View 的 RenderThread 后端。 |
| libicui18n.so | ICU | ICU 国际化库(本地化、日期格式、排序规则)。 |
| libicuuc.so | ICU | ICU 通用库(Unicode 支持、字符集转换)。 |
| libinput.so | Input | 输入事件处理库。InputDispatcher, InputReader。 |
| liblog.so | Log | Android 日志系统库(__android_log_print 等)。 |
| libmedia.so | Media | 多媒体框架核心库。MediaPlayer, MediaRecorder 客户端。 |
| libmediaplayerservice.so | Media | 媒体播放器服务实现。 |
| libnativehelper.so | JNI | JNI 辅助工具库。简化 JNI 编程。 |
| libOpenSLES.so | Audio | OpenSL ES 音频 API。低延迟音频。 |
| libpowermanager.so | Power | 电源管理服务库。 |
| libselinux.so | Security | SELinux 策略库。强制访问控制实现。 |
| libskia.so | Graphics | Skia 2D 图形引擎。Canvas 绘制的后端实现。 |
| libsqlite.so | Database | SQLite 数据库引擎。Android 数据存储核心。 |
| libstagefright.so | Media | Stagefright 多媒体框架。媒体编解码核心。 |
| libsurfaceflinger.so | Graphics | SurfaceFlinger 合成器。负责屏幕合成显示。 |
| libui.so | UI | 底层 UI 框架(GraphicBuffer, Fence, Rect 等)。 |
| libutils.so | Utils | 基础工具库(RefBase, String8, Vector, Looper 等)。 |
| libwebviewchromium.so | WebView | WebView 基于 Chromium 的实现(已迁移至 APEX)。 |
| libz.so | Compress | zlib 压缩库。 |
📐 32位与64位
• /system/lib/ 存放 32 位库,/system/lib64/ 存放 64 位库 • 系统根据设备架构(arm/arm64/x86/x86_64)和进程位数自动选择加载路径 • 从 Android 14 开始,Google 逐步推动纯 64 位设备(移除 32 位库支持) • 纯 64 位设备可减少存储占用和内存使用
⚙️ system/etc — 系统配置文件
▼
| 文件/目录 | 说明 |
|---|---|
| /system/etc/permissions/ | 权限声明目录,包含所有系统权限的 XML 声明文件。 • platform.xml — 平台权限与 GID 映射 • privapp-permissions-*.xml — 特权应用权限白名单 • android.hardware.*.xml — 硬件功能声明(camera、wifi、bluetooth 等) • android.software.*.xml — 软件功能声明 |
| /system/etc/selinux/ | SELinux 策略目录 • plat_sepolicy.cil — 平台级 SELinux 策略(编译后的 CIL 格式) • plat_mac_permissions.xml — MAC 权限配置 • plat_property_contexts — 属性 SELinux 上下文 • plat_seapp_contexts — 应用 SELinux 上下文 • plat_service_contexts — 服务 SELinux 上下文 |
| /system/etc/init/ | Init 脚本目录,各系统服务的初始化 RC 文件。 • bootanim.rc — 开机动画服务 • logd.rc — 日志守护进程 • lmkd.rc — 低内存杀手 • servicemanager.rc — 服务管理器 • surfaceflinger.rc — 显示合成器 |
| /system/etc/security/ | 安全相关配置 • cacerts/ — 系统 CA 证书库 • mac_permissions.xml — 强制访问控制权限 |
| /system/etc/vintf/ | VINTF(Vendor Interface)清单 • manifest.xml — 系统 HAL 接口清单 • compatibility_matrix.xml — 兼容性矩阵 |
| hosts | DNS 主机名映射文件(类似 Linux 的 /etc/hosts) |
| apns-conf.xml | 运营商 APN 接入点配置数据库 |
| event-log-tags | 事件日志标签定义 |
| media_codecs.xml | 媒体编解码器能力声明 |
| audio_policy_configuration.xml | 音频策略配置 |
| public.libraries.txt | 公开的 NDK 共享库列表(Vendor Native Library) |
| sysconfig/ | 系统配置目录 • hiddenapi-whitelist.xml — 隐藏 API 白名单 • component-overrides.xml — 组件覆盖配置 |
| task_profiles.json | 任务配置文件(cgroup 调度配置,Android 11+) |
| fonts.xml | 字体映射配置,定义字体族和回退链 |
| platform.xml | 权限与 Unix GID 的映射关系 |
🔧 system/bin — 可执行文件与守护进程
▼
| 可执行文件 | 说明 |
|---|---|
| init | 系统初始化进程(PID 1),Android 启动后由内核启动的第一个用户空间进程。解析 init.rc 脚本,启动所有系统服务和守护进程。 |
| app_process | 应用进程启动器,用于启动 Java 进程。Zygote 进程和所有应用进程都通过 app_process 启动。区分 app_process32/app_process64。 |
| servicemanager | Binder 服务管理器,管理系统服务的注册和查找,是所有 Binder 通信的注册中心。所有系统服务必须在此注册。 |
| surfaceflinger | 显示合成服务,负责将各个 Surface 合成后输出到显示屏。管理 Layer 树和 Vsync 同步。 |
| cameraserver | 相机服务进程,管理相机硬件访问。处理 Camera API 请求。 |
| installd | 安装守护进程,负责应用安装、卸载、数据清理、dex 优化等操作。由 PackageManagerService 调用。 |
| vold | 卷管理守护进程,管理存储设备挂载、SD 卡、USB 存储、磁盘加密等。 |
| netd | 网络守护进程,管理网络配置、防火墙、DNS、tethering 等。 |
| keystore2 | 密钥库服务,管理硬件/软件密钥存储。Android 12+ 重写为 Rust。 |
| gatekeeperd | 门禁守护进程,管理锁屏密码验证。与 TEE 交互。 |
| logd | 日志守护进程,收集和管理系统日志缓冲区。 |
| lmkd | 低内存杀手守护进程,替代内核 LMK driver,在内存不足时杀死进程。 |
| drmserver | DRM 版权管理服务。 |
| statsd | 统计数据守护进程 (Android 10+)。收集系统指标。 |
| dumpstate | 系统状态转储工具,生成 bugreport。 |
| adbd | ADB 守护进程,处理 ADB 调试连接。 |
| logcat | 日志查看工具。 |
| pm | 包管理器命令行工具 (Package Manager)。 |
| am | 活动管理器命令行工具 (Activity Manager)。 |
| wm | 窗口管理器命令行工具 (Window Manager)。 |
| input | 输入事件注入工具。 |
| cmd | 通用系统命令路由工具。 |
| toybox | 轻量级 Unix 工具集合(替代 toolbox/busybox),提供 ls、cat、grep、ps 等基本命令。 |
| sh | mksh Shell(通常指向 toybox sh)。 |
| getprop / setprop | 读取/设置系统属性。 |
| start / stop | 启动/停止系统服务。 |
| reboot | 重启命令(支持 reboot bootloader/recovery/fastboot 等模式)。 |
| bugreport | Bug 报告生成工具,收集系统完整状态。 |
💾 /data 分区详解
/data 分区是可读写分区,存放用户数据、应用数据、系统运行时数据。出厂后用户所有的数据修改都发生在此分区。
/data 完整目录结构
▼
/data/
├──
app/
用户安装的第三方 APK
│ ├──
com.example.app-1/base.apk
│ ├──
com.example.app-1/lib/arm64/libnative.so
│ └──
com.another.app-2/base.apk
│ ├──
data/
各应用的私有数据目录(沙盒)
│ ├──
com.example.app/
│ │ ├──
cache/
应用缓存(系统可自动清理)
│ │ ├──
code_cache/
代码缓存(JIT/Profile)
│ │ ├──
databases/
SQLite 数据库
│ │ ├──
files/
内部文件存储
│ │ ├──
shared_prefs/
SharedPreferences XML
│ │ ├──
lib/
Native 库符号链接
│ │ └──
no_backup/
不参与备份的文件
│ └──
com.another.app/
│ ├──
system/
系统运行时数据
│ ├──
packages.xml
已安装包完整信息(核心)
│ ├──
packages.list
安装包列表
│ ├──
packages-backup.xml
包信息备份
│ ├──
users/
多用户数据
│ ├──
accounts/
账户信息
│ ├──
notification_policy/
通知策略(DND)
│ ├──
batterystats/
电池统计数据
│ ├──
sync/
同步状态
│ ├──
storage/
存储管理数据
│ └──
procstats/
进程统计
│ ├──
dalvik-cache/
DEX 编译缓存(ART 优化文件)
│ ├──
arm64/
│ │ ├──
system@framework@boot.art
启动镜像(预加载堆)
│ │ ├──
system@framework@boot.oat
编译后系统框架
│ │ ├──
system@framework@boot-framework.art
Framework 堆镜像
│ │ ├──
system@framework@boot-framework.oat
Framework 代码
│ │ └──
data@app@com.example@base.apk@classes.odex
应用优化 DEX
│ ├──
arm/
32位版本
│ └──
profiles/
Profile-guided optimization 数据
│ ├──
misc/
杂项系统数据
│ ├──
keystore/
密钥库数据
│ ├──
wifi/
WiFi 配置(WifiConfigStore.xml)
│ ├──
bluetooth/
蓝牙配对信息
│ ├──
vold/
卷管理数据
│ ├──
zoneinfo/
时区数据
│ ├──
profileinstaller/
性能 Profile 安装
│ └──
netd/
网络守护进程数据
│ ├──
media/
媒体数据
├──
anr/
ANR (Application Not Responding) trace 文件
│ └──
traces.txt
应用无响应时的线程快照
├──
tombstones/
Native 崩溃信息 (crash dumps)
├──
log/
系统日志
├──
backup/
应用备份数据
├──
ota/
OTA 升级相关数据
│ ├──
system_de/
系统设备加密数据 (Direct Boot)
├──
user_de/
用户设备加密数据
├──
user_ce/
用户凭据加密数据 (Credential Encrypted)
├──
system_ce/
系统凭据加密数据
├──
misc_ce/
杂项凭据加密
├──
misc_de/
杂项设备加密
├──
apexdata/
APEX 模块数据
└──
gsi/
GSI (Generic System Image) 数据
应用沙盒与存储路径详解
▼
| API 方法 | 对应路径 | 说明 | 生命周期 |
|---|---|---|---|
| getFilesDir() | /data/data/{pkg}/files/ | 应用内部文件存储 | 应用卸载时删除 |
| getCacheDir() | /data/data/{pkg}/cache/ | 应用缓存(系统可自动清理) | 系统低内存时可能清理 |
| getDatabasePath() | /data/data/{pkg}/databases/ | SQLite 数据库 | 应用卸载时删除 |
| getSharedPreferences() | /data/data/{pkg}/shared_prefs/ | 偏好设置 XML 文件 | 应用卸载时删除 |
| getExternalFilesDir() | /storage/emulated/0/Android/data/{pkg}/files/ | 外部私有文件 | 应用卸载时删除 (Android 11+) |
| getExternalCacheDir() | /storage/emulated/0/Android/data/{pkg}/cache/ | 外部缓存 | 可能被清理 |
| getCodeCacheDir() | /data/data/{pkg}/code_cache/ | 代码缓存目录 | 应用升级或卸载时清理 |
| getNoBackupFilesDir() | /data/data/{pkg}/no_backup/ | 不参与备份的文件 | 应用卸载时删除 |
Scoped Storage (Android 10+)
Android 10 引入 Scoped Storage,限制了应用对共享存储的访问方式:
- 应用私有目录:通过
Context.getExternalFilesDir()访问,无需存储权限 - 媒体文件:通过 MediaStore API 访问图片、视频、音频
- Downloads:通过 Storage Access Framework (SAF) 访问
- MANAGE_EXTERNAL_STORAGE:需要此权限才能进行全局存储访问(Google Play 限制使用)
存储加密机制 — FDE vs FBE
▼
| 特性 | FDE (Full Disk Encryption) | FBE (File-Based Encryption) |
|---|---|---|
| 引入版本 | Android 5.0 | Android 7.0 |
| 加密粒度 | 整个 /data 分区 | 每个文件独立加密 |
| 密钥数量 | 单个主密钥 | 每个文件一个密钥 |
| Direct Boot | 不支持 | 支持 |
| 多用户隔离 | 弱(共享密钥) | 强(独立密钥) |
| 性能 | 较好(单密钥缓存) | 略差(多密钥管理) |
| 算法 | AES-128-CBC | AES-256-XTS (内容) + AES-256-CTS (文件名) |
| 当前状态 | 已弃用 | 强制要求 (Android 10+) |
🔑 Direct Boot (Android 7.0+)
• Device Encrypted (DE) 存储:设备启动后即可访问,不需要用户解锁 路径:/data/system_de/、/data/user_de/ 用途:闹钟、来电、消息推送等需要在锁屏下工作的功能 • Credential Encrypted (CE) 存储:需要用户解锁后才可访问 路径:/data/user_ce/、/data/system_ce/ 用途:联系人、短信、邮件等敏感数据 • 应用可以通过 DIRECT_BOOT_AWARE 组件声明支持 Direct Boot
🏭 /vendor 分区(Project Treble)
/vendor 分区是 Project Treble 架构的核心,将厂商硬件相关代码与 Google 系统代码分离,实现系统升级时不需要等待芯片厂商适配。
/vendor 完整目录结构
▼
/vendor/
├──
bin/
厂商 HAL 服务进程
│ ├──
hw/
HIDL/AIDL HAL 服务实现
│ │ ├──
android.hardware.audio@7.0-service
│ │ ├──
android.hardware.camera.provider@2.7-service
│ │ ├──
android.hardware.graphics.composer@2.4-service
│ │ ├──
android.hardware.keymaster@4.1-service
│ │ ├──
android.hardware.sensors@2.1-service
│ │ ├──
android.hardware.wifi@1.5-service
│ │ ├──
android.hardware.bluetooth@1.1-service
│ │ └──
android.hardware.neuralnetworks@1.3-service
│ └──
vendor.qti.*
高通厂商特定服务
│ ├──
lib/
&
lib64/
厂商 Native 库
│ ├──
hw/
HAL 模块实现 (.so)
│ │ ├──
audio.primary.{ro.hardware}.so
│ │ ├──
camera.device@3.5-impl.so
│ │ ├──
gps.{ro.hardware}.so
│ │ ├──
gralloc.{ro.hardware}.so
│ │ ├──
sensors.{ro.hardware}.so
│ │ └──
vulkan.{ro.hardware}.so
│ └──
egl/
GPU 驱动库
│ ├──
libGLES_android.so
软件渲染
│ ├──
libGLES_*.so
硬件 OpenGL
│ └──
libEGL_*.so
│ ├──
etc/
厂商配置
│ ├──
vintf/
厂商 VINTF 清单
│ │ ├──
manifest.xml
厂商 HAL 清单
│ │ └──
compatibility_matrix.xml
兼容性矩阵
│ ├──
selinux/
厂商 SELinux 策略
│ │ ├──
vendor_sepolicy.cil
│ │ └──
vendor_file_contexts
│ ├──
init/
厂商 init 脚本
│ │ └──
vendor_init.rc
│ ├──
permissions/
厂商权限声明
│ ├──
media_codecs.xml
厂商编解码器能力
│ ├──
media_profiles.xml
媒体配置文件
│ ├──
audio_policy_configuration.xml
音频策略
│ └──
public.libraries.txt
厂商公开 NDK 库
│ ├──
firmware/
芯片固件文件
│ ├──
wlan/
WiFi 固件
│ ├──
bluetooth/
蓝牙固件
│ └──
modem/
基带固件
│ ├──
app/
厂商预装应用
├──
priv-app/
厂商特权应用
├──
framework/
厂商 Java 库扩展
├──
overlay/
厂商资源覆盖 (RRO)
├──
media/
厂商媒体资源
├──
usr/
厂商输入设备配置
└──
build.prop
厂商构建属性
📦 /product 分区
/product 分区用于产品级别的定制,存放与特定产品型号(而非硬件平台)相关的文件和配置。例如同一芯片平台的不同手机型号。
/product 目录结构
▼
/product/
├──
app/
产品级预装应用
├──
priv-app/
产品级特权应用
├──
etc/
产品级配置
│ ├──
sysconfig/
系统配置
│ ├──
permissions/
权限配置
│ ├──
selinux/
SELinux 策略扩展
│ └──
vintf/
产品 HAL 清单
├──
overlay/
产品级资源覆盖
├──
media/
产品级媒体资源
├──
fonts/
产品级字体
├──
framework/
产品级 Java 库
├──
lib/
&
lib64/
产品级 Native 库
└──
build.prop
产品构建属性
✅ Product vs Vendor 区别
• Vendor 分区:包含硬件相关代码(HAL 驱动、芯片固件)— 芯片厂商维护 • Product 分区:包含产品型号相关的定制(不同市场版本配置、预装 APP 差异、UI 定制)— OEM 维护 • 覆盖优先级:product > odm > vendor > system
⚙️ /odm 分区 (ODM)
/odm (Original Design Manufacturer) 分区用于硬件设计商的特定定制,允许 ODM 在不修改 vendor 分区的情况下进行硬件适配。
/odm 目录结构与用途
▼
/odm/
├──
bin/
ODM 特定可执行文件
├──
lib/
&
lib64/
ODM 特定库
├──
etc/
ODM 配置
│ ├──
vintf/
ODM HAL 清单
│ ├──
selinux/
ODM SELinux 策略
│ └──
permissions/
ODM 权限
├──
firmware/
ODM 固件
├──
overlay/
ODM 资源覆盖
├──
odm_manifest.xml
ODM 清单(可覆盖 vendor manifest)
└──
build.prop
ODM 构建属性
| 使用场景 | 说明 |
|---|---|
| 多设备共享芯片平台 | 同一 SoC 用于多个手机型号时,每个型号使用独立的 odm 分区 |
| 运营商定制 | 运营商特定的硬件配置和固件更新 |
| 区域变体 | 不同地区销售的硬件差异(如 NFC、5G 频段) |
📂 /system_ext 分区
/system_ext 分区是系统扩展分区,存放不属于核心 system 但属于系统级的定制内容。
/system_ext 内容
▼
/system_ext/
├──
app/
扩展应用
├──
priv-app/
扩展特权应用
├──
etc/
扩展配置
│ ├──
permissions/
│ ├──
selinux/
│ └──
vintf/
├──
framework/
扩展 Java 库
├──
lib/
&
lib64/
扩展 Native 库
├──
media/
扩展媒体资源
├──
overlay/
扩展资源覆盖
└──
build.prop
扩展构建属性
此分区通常被 OEM 用于放置需要与 system 一起更新但不属于 AOSP 核心的内容。
🚀 Android 完整启动流程
Android 从按下电源键到显示桌面,经历了多个阶段。理解启动流程对于系统开发和故障排查至关重要。
启动流程全景图
▼
BootROM
→
Bootloader
→
Linux Kernel
→
Init (PID 1)
→
Native Daemons
→
Zygote
→
SystemServer
→
Launcher
| 阶段 | 持续时间 | 关键操作 |
|---|---|---|
| BootROM | ~100ms | CPU 上电执行固化代码,验证并加载 Bootloader |
| Bootloader | ~500ms-2s | 初始化硬件,验证 boot.img,加载内核 |
| Kernel | ~1-3s | 内核初始化,驱动加载,挂载 rootfs |
| Init 第一阶段 | ~1s | 挂载分区,解析 fstab,初始化属性系统 |
| Init 第二阶段 | ~2-3s | 启动守护进程,加载 SELinux 策略 |
| Zygote | ~1-2s | 预加载框架类和资源 |
| SystemServer | ~2-5s | 启动所有系统服务 |
| Launcher | ~1-3s | 显示主屏幕 |
🔓 Bootloader 阶段
▼
Bootloader 是设备上电后执行的第一段软件代码,通常分为多个阶段:
Bootloader 启动链 (以高通平台为例): ┌─────────────────────────────────────────────────────────────┐ │ PBL (Primary Boot Loader) — 固化在 BootROM 中 │ │ • CPU 上电后自动执行 │ │ • 验证并加载 XBL │ └───────────────────────────┬─────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ XBL (eXtensible Boot Loader) — 替代早期 SBL │ │ • 初始化 DDR 内存 │ │ • 初始化显示(用于显示 OEM Logo) │ │ • 加载 TZ (TrustZone) 和 ABL │ └───────────────────────────┬─────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ ABL (Android Boot Loader) │ │ • 验证 boot.img 签名 (AVB) │ │ • 支持 fastboot 协议 │ │ • 加载 Linux Kernel + Ramdisk │ │ • 传递启动参数 (cmdline) 给内核 │ └───────────────────────────┬─────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ Linux Kernel 启动 │ └─────────────────────────────────────────────────────────────┘
Bootloader 关键功能:
- 安全验证:验证 boot.img 签名,确保启动链完整性
- 解锁/锁定:控制是否允许刷入非官方镜像
- Fastboot 模式:提供刷机接口
- Recovery 模式:启动到 Recovery 系统
- A/B 槽位选择:在双分区方案中选择活动槽位
🐧 内核启动阶段
▼
Linux 内核启动后执行以下关键步骤:
- 内核解压缩:如果内核是压缩格式,先解压缩到内存
- 硬件初始化:初始化 CPU、内存控制器、中断控制器
- Device Tree 解析:解析 DTB 获取硬件配置
- 驱动初始化:按顺序加载内核模块和内置驱动
- 内存管理初始化:设置页表、内存区域
- 进程调度器初始化:设置 CFS/EAS 调度器
- Rootfs 挂载:挂载初始内存盘(initramfs)为根文件系统
- 启动 init:执行 /init (PID 1) 进程
androidboot.hardware— 硬件平台标识,决定加载哪个 init.${hardware}.rcandroidboot.selinux— SELinux 模式 (enforcing/permissive)androidboot.verifiedbootstate— AVB 验证状态 (green/orange/yellow/red)androidboot.slot_suffix— A/B 槽位 (_a 或 _b)buildvariant— 构建类型 (user/userdebug/eng)- 服务管理:解析 rc 文件中的 service 定义,fork 并管理子进程
- 属性服务:维护系统属性数据库(类似 Windows 注册表)
- 事件触发:监听属性变化和事件,执行相应动作
- 设备节点管理:通过 ueventd 响应设备热插拔
- 进程监控:监控子进程状态,异常退出时重启
- 预加载 Java 类:加载约 8000+ 个框架类到内存(framework.jar 等)
- 预加载资源:加载 framework-res.apk 中的系统资源
- 预加载共享库:加载常用 Native 库
- 启动 SystemServer:fork 出 SystemServer 进程
- 监听 Socket:等待 AMS 请求创建新应用进程
- Fork 应用进程:收到请求后 fork 出新的应用进程
/init— 符号链接到 /system/bin/init,是 init 进程的入口/init.rc— 主初始化脚本,定义启动序列/fstab.${ro.hardware}— 文件系统挂载表/default.prop— 默认属性(ro.secure, ro.debuggable 等)/ueventd.rc— 设备节点权限配置/verity_key— AVB 验证启动公钥/proc, /sys, /dev— 空目录,挂载后填充- Activity 管理:管理 Activity 栈、启动/暂停/销毁
- Service 管理:管理 Service 生命周期
- Broadcast 分发:广播注册和分发
- ContentProvider 管理:CP 启动和权限验证
- 进程管理:进程优先级(oom_adj)、进程创建和销毁
- 内存管理:低内存时回收进程
- 任务栈管理:Task、BackStack 管理
- 复制 APK 到 /data/app/
- PMS 解析 APK (PackageParser)
- 验证签名 (PackageSigner)
- installd 创建数据目录
- dexopt/dex2oat 优化 DEX
- 更新 packages.xml
- 发送 PACKAGE_ADDED 广播
- 窗口管理:管理所有 Window (PhoneWindow, Dialog, Toast, SystemUI)
- Z-order 管理:控制窗口的层叠顺序
- 窗口动画:管理窗口转场动画
- 屏幕旋转:处理方向变化
- 输入法管理:与 InputMethodManagerService 协调
- 截图/录屏:提供屏幕捕获功能
- Seccomp-BPF:使用 BPF 过滤器定义允许的系统调用列表
- 应用进程:限制为约 300 个必要系统调用
- MediaCodec:进一步限制为约 60 个系统调用
- WebView:使用更严格的沙盒策略
- 效果:即使应用被漏洞攻击,也无法执行任意系统调用
- 管理 WiFi、移动数据、以太网、VPN 等网络
- 网络优先级策略:WiFi > Ethernet > Mobile
- 网络验证(Captive Portal 检测)
- 流量统计和限制
- DNS 解析管理
- 网络请求(NetworkRequest)和回调
- Linux 系统(推荐 Ubuntu 20.04/22.04)
- 至少 250GB 可用磁盘空间(建议 500GB+)
- 至少 16GB 内存(建议 32GB+)
- 64位 CPU 和多核心处理器
内核启动命令行参数 (kernel cmdline) 示例
console=ttyMSM0,115200n8
androidboot.hardware=qcom
androidboot.console=ttyMSM0
androidboot.memcg=1
lpm_levels.sleep_disabled=1
video=vfb:640x400,bpp=32
earlycon=msm_geni_serial,0x880000
androidboot.selinux=enforcing
androidboot.verifiedbootstate=green
androidboot.slot_suffix=_a
androidboot.vbmeta.digest=...
buildvariant=user
androidboot.bootdevice=1d84000.ufshc
关键参数说明:
⚡ Init 进程详解 (PID 1)
▼
init 是 Android 系统的第一个用户空间进程(PID 1),位于 /system/bin/init。它负责整个系统的初始化和服务管理。
Init 两阶段启动:
| 阶段 | 时间 | 关键操作 |
|---|---|---|
| 第一阶段 (Early Init) | 启动后 ~0.5s | • 创建必要的目录 (/dev, /proc, /sys) • 挂载 tmpfs 到 /dev • 初始化属性系统 • 解析 fstab 并挂载分区 • 启用 SELinux (加载策略) |
| 第二阶段 (Late Init) | ~0.5s-5s | • 解析所有 init.rc 脚本 • 触发 early-init/init/late-init 事件 • 启动各种系统服务 • 设置属性触发器 • 启动 Zygote • 进入主事件循环 |
Init 核心职责:
Init 进程启动序列: init 执行 ──→ 创建/dev, /proc, /sys │ ├──→ 初始化属性系统 │ ├──→ 解析 fstab,挂载分区 (first_stage_mount) │ ├──→ 加载 SELinux 策略 │ ├──→ 切换到 second stage init (/system/bin/init) │ ├──→ 解析所有 .rc 文件 │ ├──→ 触发 early-init → init → late-init 事件 │ ├──→ 启动 servicemanager │ ├──→ 启动 vold, netd, logd 等守护进程 │ ├──→ 启动 Zygote │ └──→ 进入 epoll 主循环,等待事件
🥚 Zygote 进程详解
▼
Zygote 是 Android 系统最关键的 Java 进程,是所有应用进程的"母体"。通过预加载和 fork 机制大幅提升应用启动速度。
Zygote 核心职责:
Zygote 工作流程: ┌──────────────┐ │ init 进程 │ ← 读取 zygote.rc 启动 Zygote └──────┬───────┘ ↓ ┌──────────────────────────────────────────────────────┐ │ Zygote 进程 │ │ 1. 启动 Java VM (ART) │ │ 2. 预加载 BOOTCLASSPATH 中的所有 JAR │ │ 3. 预加载 framework-res.apk 资源 │ │ 4. 预加载常用 Native 库 │ │ 5. 注册 Zygote Socket (zygote/zygote_secondary) │ └──────────┬────────────────────┬──────────────────────┘ │ fork │ 监听 Socket ↓ ↓ ┌──────────────────┐ ┌──────────────────────────────┐ │ SystemServer │ │ 等待应用启动请求 │ │ 启动所有系统服务 │ │ 收到请求后 fork 出应用进程 │ └──────────────────┘ └──────────┬───────────────────┘ │ fork (每个应用) ↓ ┌──────────────────────────────┐ │ 应用进程 (com.example.app) │ │ - 继承 Zygote 预加载的类 │ │ - 执行 ActivityThread.main() │ │ - 运行应用程序代码 │ └──────────────────────────────┘
🔬 为什么使用 Zygote?
• COW (Copy-On-Write):fork 后的子进程与 Zygote 共享内存页,只有被修改时才复制 • 启动加速:应用不需要重新加载 8000+ 个框架类,节省约 1-2 秒 • 内存节省:所有应用共享框架类的物理内存页 • 32位/64位:现代设备通常有两个 Zygote (zygote 和 zygote_secondary) 分别处理不同位数的应用
zygote 启动命令(来自 init.rc)
service
zygote
/system/bin/app_process64
-Xzygote /system/bin --zygote --start-system-server
class
main
priority
-20
user
root
group
root readproc
socket
zygote stream 660 root system
socket
usap_pool_primary stream 660 root system
onrestart
exec_background u:object_r:system_server_exec:s0 -- /system/bin/servicemanager
writepid
/dev/cpuset/foreground/tasks
🏗️ SystemServer 进程
▼
SystemServer 是 Android 系统中最核心的 Java 进程,由 Zygote fork 产生。它启动了所有系统服务。
SystemServer 启动的服务分类:
| 类别 | 服务名称 | 说明 |
|---|---|---|
| 引导服务 (Bootstrap) | Installer | 安装守护进程代理 |
| DeviceIdentifiersPolicyService | 设备标识策略 | |
| ActivityTaskManagerService | Activity 任务管理 | |
| ActivityManagerService | 活动管理器 (AMS) | |
| PowerManagerService | 电源管理 | |
| 核心服务 (Core) | BatteryService | 电池监控 |
| UsageStatsService | 使用统计 | |
| WebViewUpdateService | WebView 更新 | |
| BugreportManagerService | Bug报告管理 | |
| GraphicsStatsService | 图形统计 | |
| PermissionPolicyService | 权限策略 | |
| 其他服务 (Other) | WindowManagerService | 窗口管理器 (WMS) |
| PackageManagerService | 包管理器 (PMS) | |
| TelephonyRegistry | 电话注册 | |
| ConnectivityService | 连接管理 | |
| WifiService | WiFi 服务 | |
| BluetoothService | 蓝牙服务 | |
| LocationManagerService | 位置管理 | |
| NotificationManagerService | 通知管理 |
SystemServer 启动序列: SystemServer.main() │ ├── 1. 创建 Looper/MessageQueue ├── 2. 加载 Native 库 ├── 3. 创建 SystemServiceManager │ ├── 4. startBootstrapServices() ← 关键引导服务 │ ├── Installer │ ├── DeviceIdentifiers │ ├── ActivityTaskManagerService │ ├── ActivityManagerService │ ├── PowerManagerService │ ├── RecoverySystemService │ └── LightsService │ ├── 5. startCoreServices() ← 核心服务 │ ├── BatteryService │ ├── UsageStatsService │ └── WebViewUpdateService │ ├── 6. startOtherServices() ← 其他服务 (80+ 个) │ ├── WindowManagerService │ ├── PackageManagerService │ ├── AccountManagerService │ ├── ContentService │ ├── InputMethodManagerService │ ├── LocationManagerService │ ├── NotificationManagerService │ ├── ConnectivityService │ └── ... 更多服务 │ └── 7. 进入 Looper.loop() 主循环,处理消息
📝 init.rc 语法教程
init.rc 是 Android init 进程使用的配置文件,定义了系统启动时要执行的动作、要启动的服务以及事件触发器。
init.rc 基本语法
▼
init.rc 文件由四种类型的语句组成:
| 类型 | 语法 | 说明 |
|---|---|---|
| Actions | on <trigger> [&&<trigger>] <command> <command> | 定义触发事件时要执行的命令序列 |
| Services | service <name> <pathname> [args] <option> <option> | 定义 init 要启动和管理的进程 |
| Commands | exec, start, stop, mkdir, chmod, chown, write, setprop... | init 支持的内置命令 |
| Options | class, user, group, socket, oneshot, disabled, critical... | 服务的配置选项 |
============= Action 示例 =============
在 init 触发时执行
on
init
创建目录
mkdir
/system
mkdir
/data
0771 system system
mkdir
/cache
0770 system cache
设置系统属性
export
PATH
/sbin:/system/sbin:/system/bin:/system/xbin
export
ANDROID_ROOT
/system
export
ANDROID_DATA
/data
写文件
write
/proc/sys/kernel/panic_on_oops
1
在 early-boot 触发时执行
on
early-boot
设置 SELinux 为 enforcing 模式
selinux_reload_policy
属性触发器
on
property
:
sys.boot_completed
=1
exec
u:r:system_app:s0 system --
/system/bin/boot_complete_handler
============= Service 示例 =============
service
servicemanager
/system/bin/servicemanager
class
core animation
user
system
group
system readproc
critical
关键服务,退出会重启设备
onrestart
restart zygote
重启时连带重启 zygote
writepid
/dev/cpuset/system-background/tasks
service
zygote
/system/bin/app_process64
-Xzygote /system/bin --zygote --start-system-server
class
main
priority
-20
高优先级
user
root
group
root readproc reserved_disk
socket
zygote stream 660 root system
创建 Unix Socket
socket
usap_pool_primary stream 660 root system
onrestart
restart audioserver
onrestart
restart media
task_profiles
MaxPerformance
service
bootanim
/system/bin/bootanimation
class
core animation
user
graphics
group
graphics audio
disabled
不自动启动
oneshot
运行一次,退出不重启
常用内置命令:
| 命令 | 说明 | 示例 |
|---|---|---|
| mkdir | 创建目录 | mkdir /data/misc 0770 system misc |
| chmod/chown | 修改权限/所有者 | chmod 0660 /dev/binder |
| write | 写入文件 | write /proc/sys/vm/swappiness 60 |
| setprop | 设置系统属性 | setprop service.bootanim.exit 1 |
| start/stop | 启动/停止服务 | start media |
| exec | 执行命令 | exec -- /system/bin/shell_script.sh |
| export | 设置环境变量 | export LD_LIBRARY_PATH /system/lib |
| copy | 复制文件 | copy /src/file /dest/file |
| symlink | 创建软链接 | symlink /system/bin/toolbox /system/bin/ls |
| mount | 挂载文件系统 | mount ext4 /dev/block/sda1 /mnt |
| trigger | 触发事件 | trigger early-boot |
| class_start | 启动一类服务 | class_start main |
| class_stop | 停止一类服务 | class_stop main |
常用触发器:
| 触发器 | 触发时机 |
|---|---|
| early-init | init 最早阶段,设备初始化前 |
| init | init 阶段,基本目录创建后 |
| late-init | 初始化后期,挂载完成后 |
| early-fs | 文件系统挂载前 |
| fs | 文件系统挂载时 |
| post-fs | 文件系统挂载后 |
| post-fs-data | 数据分区挂载后 |
| boot | 系统基本启动完成 |
| early-boot | 早于 boot 的阶段 |
| property:name=value | 属性值变化时触发 |
| device-added | 设备添加时 |
| service-exited | 服务退出时 |
🖼️ Boot Image 结构
boot.img 是 Android 设备的启动镜像,包含内核和初始内存盘。理解其结构对于系统定制和调试至关重要。
boot.img 内部结构
▼
boot.img 文件布局 (Header V3, Android 11+): ┌─────────────────────────────────────────┐ │ Boot Image Header │ │ ┌─────────────────────────────────┐ │ │ │ Magic: "ANDROID!" │ │ │ │ Kernel Size: 0x1A3C000 │ │ │ │ Kernel Load Address: 0x80000 │ │ │ │ Ramdisk Size: 0x045600 │ │ │ │ Ramdisk Load Address: 0x1000000 │ │ │ │ Page Size: 4096 │ │ │ │ Header Version: 3 │ │ │ │ OS Version: 14.0.0 │ │ │ │ OS Patch Level: 2024-01 │ │ │ │ Product Name: shiba │ │ │ │ Command Line: console=tty... │ │ │ └─────────────────────────────────┘ │ ├─────────────────────────────────────────┤ │ Linux Kernel │ │ (编译后的内核二进制,如 Image.gz) │ │ (~15-25MB) │ ├─────────────────────────────────────────┤ │ Ramdisk │ │ (初始内存盘,cpio 格式,gzip 压缩) │ │ 包含: │ │ - /init (→ /system/bin/init) │ │ - /init.rc (主初始化脚本) │ │ - /fstab.${hardware} (挂载表) │ │ - /default.prop (默认属性) │ │ - /ueventd.rc │ │ - /verity_key (验证启动公钥) │ │ (~2-5MB) │ └─────────────────────────────────────────┘
| Header 版本 | Android 版本 | 特性 |
|---|---|---|
| V0 | ≤ 7.0 | 基础格式,无签名 |
| V1 | 8.0-8.1 | 添加 Recovery DTBO |
| V2 | 9.0 | 添加 Recovery DTBO 偏移 |
| V3 | 10-12 | 简化结构,移除 Second Stage |
| V4 | 13+ | 添加签名信息,GKI 支持 |
Ramdisk 内容详解:
🔒 验证启动 (AVB)
Android Verified Boot (AVB) 确保设备启动过程中所有代码的完整性,防止恶意篡改。
AVB 验证链
▼
AVB 验证链 (Chain of Trust): ┌──────────────────┐ │ BootROM (硬件) │ ← CPU 内置,不可修改 │ 验证 XBL 签名 │ └────────┬─────────┘ ↓ 验证通过 ┌──────────────────┐ │ XBL/ABL │ ← Bootloader │ 验证 boot.img │ └────────┬─────────┘ ↓ 验证通过 ┌──────────────────┐ │ Linux Kernel │ ← 内核 │ dm-verity 模块 │ └────────┬─────────┘ ↓ 运行时验证 ┌──────────────────┐ │ dm-verity │ ← 内核设备映射模块 │ 实时验证分区数据 │ 读取任何数据块前验证 hash └────────┬─────────┘ ↓ ┌──────────────────┐ │ /system, /vendor │ ← 只读分区 │ (hashtree 验证) │ 每个数据块对应一个 hash └──────────────────┘
| 验证状态 | 含义 | 显示 |
|---|---|---|
| Green | 完全验证通过,所有签名有效 | 正常启动,无警告 |
| Yellow | 验证通过但使用自定义公钥 | 短暂警告后启动 |
| Orange | Bootloader 已解锁,无法验证 | 警告后启动 |
| Red | 验证失败,镜像被篡改 | 拒绝启动 |
🛡️ dm-verity
• dm-verity 是内核级的块设备完整性验证模块 • 为只读分区(system, vendor)建立 Merkle Hash Tree • 每次读取数据块时验证其 hash 值 • 如果数据被篡改,读取时返回错误 • 仅支持只读分区,/data 分区使用 dm-crypt 加密
🔧 Recovery 系统
Recovery 是一个独立的迷你操作系统,用于执行 OTA 升级、恢复出厂设置、ADB sideload 等操作。
Recovery 系统详解
▼
| 文件/组件 | 说明 |
|---|---|
| recovery.img | Recovery 分区镜像,包含独立内核 + ramdisk + mini Linux |
| /cache/recovery/command | 传递给 Recovery 的命令文件 |
| /cache/recovery/log | Recovery 运行日志 |
| /cache/recovery/last_kmsg | 上次内核崩溃信息 |
| /cache/recovery/last_install | 上次 OTA 安装结果 |
Recovery 通信机制:
系统通过写入 /cache/recovery/command 文件来向 Recovery 传递指令:
恢复出厂设置时写入的命令
--wipe_data
OTA 升级时写入的命令
--update_package=/cache/ota_package.zip
ADB sideload 模式
--sideload
清除缓存
--wipe_cache
🔄 A/B 设备的变化
• 采用 A/B 分区方案的设备没有独立 Recovery 分区 • Recovery 功能内置在 boot.img 中(通过 androidboot.mode=recovery 参数进入) • OTA 升级由 update_engine 服务在后台完成,写入非活动槽位 • 用户无需重启进入 Recovery 即可完成系统更新
🏛️ 核心系统服务详解
Android 系统服务运行在 SystemServer 进程中,通过 Binder IPC 机制向应用提供功能接口。
📋 ActivityManagerService (AMS)
▼
AMS 是 Android 最重要的系统服务之一,负责管理四大组件的生命周期和系统资源调度。
AMS 核心职责:
进程优先级 (oom_adj):
| 级别 | Adj 值 | 说明 |
|---|---|---|
| Foreground | 0 | 前台进程(当前 Activity、前台 Service) |
| Visible | 1 | 可见但非前台(被 Dialog 部分遮挡) |
| Perceptible | 2 | 可感知的(如后台播放音乐) |
| Backup | 3 | 备份操作中的进程 |
| Service | 5-6 | 普通 Service 进程 |
| Home | 6 | 桌面应用 |
| Previous | 7 | 上一个 Activity 进程 |
| Cached | 9-15 | 缓存进程(LRU 列表) |
📦 PackageManagerService (PMS)
▼
PMS 负责管理设备上所有 APK 包的安装、卸载、权限、版本、签名验证等工作。
PMS 启动流程:
PMS 启动序列 (耗时约 2-5 秒): PMS 构造方法 │ ├── 1. 读取 /data/system/packages.xml (已安装包信息) ├── 2. 扫描系统目录: │ ├── /system/framework/ (框架 JAR) │ ├── /system/app/ (系统应用) │ ├── /system/priv-app/ (特权应用) │ ├── /vendor/app/ (厂商应用) │ ├── /product/app/ (产品应用) │ └── /data/app/ (第三方应用) │ ├── 3. 解析每个 APK 的 AndroidManifest.xml ├── 4. 验证 APK 签名 ├── 5. 构建权限映射表 ├── 6. 注册 ContentProvider ├── 7. 发送 Intent.ACTION_BOOT_COMPLETED (扫描完成后) └── 8. 写入 packages.xml 更新
APK 安装流程:
🪟 WindowManagerService (WMS)
▼
WMS 负责管理所有窗口的创建、销毁、显示顺序、动画和输入事件分发。
WMS 核心职责:
窗口类型层级:
| 层级 | 类型 | Z-Order | 示例 |
|---|---|---|---|
| 系统窗口 | TYPE_SYSTEM_OVERLAY | 2006 | 系统级覆盖 |
| 系统窗口 | TYPE_STATUS_BAR | 2000 | 状态栏 |
| 系统窗口 | TYPE_KEYGUARD | 2004 | 锁屏 |
| 系统窗口 | TYPE_SEARCH_BAR | 2005 | 搜索栏 |
| 应用窗口 | TYPE_APPLICATION | 1-99 | 普通 Activity |
| 子窗口 | TYPE_APPLICATION_PANEL | 1000+ | Dialog、PopupWindow |
🔗 Binder IPC 机制
Binder 是 Android 系统核心的进程间通信(IPC)机制,几乎所有的系统服务通信都基于 Binder 实现。
Binder 工作原理
▼
Binder 通信模型: ┌──────────────────────┐ ┌──────────────────────────┐ │ 客户端进程 │ │ 服务端进程 │ │ │ │ │ │ ┌────────────────┐ │ │ ┌────────────────────┐ │ │ │ 应用代码 │ │ │ │ Service 实现 │ │ │ │ service.do() │ │ │ │ onTransact() │ │ │ └───────┬────────┘ │ │ └─────────▲──────────┘ │ │ │ │ │ │ │ │ ┌───────▼────────┐ │ │ ┌─────────┴──────────┐ │ │ │ Proxy (代理) │ │ │ │ Binder 实体 │ │ │ │ transact() │ │ │ │ (继承 Binder) │ │ │ └───────┬────────┘ │ │ └─────────▲──────────┘ │ │ │ │ │ │ │ │ ┌───────▼────────┐ │ IPC │ ┌─────────┴──────────┐ │ │ │ Binder Driver └──┼─────────┼──┤ Kernel Buffer │ │ │ │ (内核驱动) │ │ 1次拷贝 │ │ (共享内存映射) │ │ │ └────────────────┘ │ │ └────────────────────┘ │ └──────────────────────┘ └──────────────────────────┘ 关键优势: • 1次内存拷贝(vs System V 的2次) • 基于内存映射(mmap)实现共享 • 内核驱动(/dev/binder)负责进程间数据传递 • 支持同步和异步调用
Binder 关键概念:
| 概念 | 说明 |
|---|---|
| Binder Driver | 内核驱动 /dev/binder,负责 IPC 数据传输 |
| Binder 实体 | 服务端的 Binder 对象,继承 android.os.Binder |
| Binder 代理 | 客户端的代理对象(BinderProxy),转发调用 |
| ServiceManager | Binder 注册中心,管理所有系统服务 |
| onTransact() | 服务端接收远程调用的回调方法 |
| transact() | 客户端发起远程调用的方法 |
| AIDL | Android Interface Definition Language,自动生成 Stub/Proxy |
| 线程池 | 每个进程有 Binder 线程池(默认最多16个线程)处理请求 |
⚠️ Binder 限制
• 传输大小限制:单次 Binder 调用数据不能超过 1MB(所有进程共享的 binder 内存),否则抛出 TransactionTooLargeException • 线程池限制:每个进程 Binder 线程池默认 16 个,高并发时可能阻塞 • 同步调用阻塞:默认同步调用会阻塞调用线程,直到服务端响应
📡 ServiceManager
ServiceManager 是 Binder 机制的注册中心(类似电话簿),所有系统服务在此注册,客户端通过它查找服务。
ServiceManager 工作机制
▼
服务注册与查找流程: 1. 服务注册 (服务端): ┌──────────────┐ ┌─────────────────┐ │ SystemServer │ ──addService("activity", binder)──→ │ ServiceManager │ └──────────────┘ └─────────────────┘ 存储: {"activity": binder_ref_1, "package": binder_ref_2, "window": binder_ref_3, ...} 2. 服务查找 (客户端): ┌──────────────┐ ┌─────────────────┐ │ App 进程 │ ──getService("activity")──→ │ ServiceManager │ └──────┬───────┘ └────────┬────────┘ │ │ │ 返回 binder_ref_1 │ └──────────────────────────┘ │ ┌──────▼───────────────────────────┐ │ 获得 ActivityManager 代理对象 │ │ 可通过代理调用 AMS 方法 │ └──────────────────────────────────┘
常用系统服务注册名:
| 服务名 | 对应服务 | 管理器 |
|---|---|---|
| activity | ActivityManagerService | ActivityManager |
| package | PackageManagerService | PackageManager |
| window | WindowManagerService | WindowManager |
| input | InputManagerService | InputManager |
| connectivity | ConnectivityService | ConnectivityManager |
| wifi | WifiService | WifiManager |
| bluetooth_manager | BluetoothManagerService | BluetoothManager |
| location | LocationManagerService | LocationManager |
| notification | NotificationManagerService | NotificationManager |
| power | PowerManagerService | PowerManager |
| audio | AudioService | AudioManager |
| phone | TelephonyRegistry | TelephonyManager |
| clipboard | ClipboardService | ClipboardManager |
| alarm | AlarmManagerService | AlarmManager |
| content | ContentService | ContentResolver |
📐 HIDL / AIDL 接口定义
HIDL 和 AIDL 是 Android 定义跨进程/跨分区接口的语言,是 Treble 架构的关键。
HIDL vs AIDL 对比
▼
| 特性 | HIDL | AIDL (Stable) |
|---|---|---|
| 引入版本 | Android 8.0 | Android 11 (稳定版) |
| 语法 | 类 C 语法,.hal 文件 | 类 Java 语法,.aidl 文件 |
| 版本控制 | 接口版本号(如 @1.0, @2.0) | parcelable + version 字段 |
| 通信方式 | hwbinder (独立 binder 域) | Binder / hwbinder |
| 生成代码 | C++ / Java | Java / C++ / NDK |
| 未来方向 | 逐步淘汰 | 推荐方式 |
| 使用位置 | System-Vendor 接口 | 新增 HAL 首选 |
HIDL 接口示例:
// ICameraDevice@3.5.hal
package
android.hardware.camera.device
@
3.5
;
import
ICameraDeviceCallback
;
import
ICameraDeviceSession
;
interface
ICameraDevice
{
// 获取设备资源
getResourceCost
()
generates
(
CameraDeviceCost
cost);
// 打开设备会话
open
(
ICameraDeviceCallback
callback)
generates
(
Status
status,
ICameraDeviceSession
session);
// 获取可用特性
getCameraCharacteristics
()
generates
(
Status
status,
CameraMetadata
characteristics); };
AIDL 稳定接口示例:
// ICameraDevice.aidl (Android 12+)
package
android.hardware.camera
;
parcelable
CameraMetadata
;
interface
ICameraDevice
{
// 获取相机特性
CameraMetadata
getCharacteristics
();
// 打开相机设备
ICameraDeviceSession
open
(
in
ICameraDeviceCallback
callback);
// 断开连接
void
disconnect
(); }
🏗️ Project Treble 详解
Project Treble 是 Android 8.0 引入的革命性架构变更,旨在解决 Android 碎片化升级问题。
Treble 架构分层
▼
Treble 分层设计 (Android 8.0+): ┌─────────────────────────────────────────────────┐ │ Android Framework (Google 维护) │ │ /system/framework/.jar │ │ ──────────── Stable Interface ──────────── │ ├─────────────────────────────────────────────────┤ │ Vendor Interface (VINTF 定义) │ │ HIDL / Stable AIDL / VNDK │ │ ────── Vendor Interface Object ────── │ ├─────────────────────────────────────────────────┤ │ Vendor Implementation (厂商维护) │ │ /vendor/ — HAL 实现, 驱动, 固件 │ │ /odm/* — 硬件特定定制 │ ├─────────────────────────────────────────────────┤ │ Linux Kernel (芯片厂商) │ │ 设备驱动, Device Tree │ └─────────────────────────────────────────────────┘ 优势: • 升级 Android 版本 → 只需更新 /system (Framework) • 厂商 HAL 实现 (/vendor) 不需要重新适配 • 通过 GSI (Generic System Image) 快速测试 • 缩短了大版本升级周期
Treble 兼容性要求:
| 要求 | 说明 |
|---|---|
| HAL 接口稳定性 | HIDL/AIDL 接口必须保持向后兼容 |
| VNDK 使用 | Vendor 只能使用 VNDK 库子集 |
| SELinux 隔离 | System 和 Vendor 运行在不同 SELinux 域 |
| 文件系统隔离 | System 和 Vendor 位于不同分区 |
| 命名空间隔离 | 动态链接器使用独立命名空间 |
VNDK (Vendor Native Development Kit)
▼
VNDK 是提供给 Vendor 分区使用的 Native 库子集,确保 vendor 代码不依赖不稳定的内部 API。
| 库类型 | 说明 | 示例 |
|---|---|---|
| VNDK-Core | VNDK 核心库,vendor 可直接链接 | libutils, libcutils, liblog |
| VNDK-SP | Same-Process HAL 依赖库 | libhardware, libhidlbase |
| LLNDK | Linker-Namespace NDK,稳定ABI | libc, libm, libdl |
| Framework-only | 仅 Framework 可用,vendor 禁止使用 | libmedia, libgui |
🚫 Vendor 禁止事项
• 禁止直接链接 /system/lib 中的非 VNDK 库 • 禁止访问 /system 中非公开的 API • 禁止在 vendor 中修改 system 分区文件 • 禁止绕过 SELinux 策略
🔑 APEX 模块化 (Mainline)
APEX (Android Pony EXpression) 是 Android 10+ 引入的模块化方案,允许部分系统组件通过 Google Play 独立更新。
APEX 模块列表与结构
▼
| APEX 模块 | 说明 | 挂载点 |
|---|---|---|
| com.android.art | ART 运行时 (JIT/AOT编译器) | /apex/com.android.art/ |
| com.android.runtime | 运行时公共库 | /apex/com.android.runtime/ |
| com.android.media | 媒体框架 (MediaCodec, Extractors) | /apex/com.android.media/ |
| com.android.mediaprovider | 媒体存储提供者 | /apex/com.android.mediaprovider/ |
| com.android.conscrypt | TLS/SSL 加密库 | /apex/com.android.conscrypt/ |
| com.android.resolv | DNS 解析器 | /apex/com.android.resolv/ |
| com.android.tzdata | 时区数据 | /apex/com.android.tzdata/ |
| com.android.wifi | WiFi 框架和驱动 | /apex/com.android.wifi/ |
| com.android.bluetooth | 蓝牙协议栈 | /apex/com.android.bluetooth/ |
| com.android.neuralnetworks | NNAPI (神经网络 API) | /apex/com.android.neuralnetworks/ |
| com.android.permission | 权限控制器 | /apex/com.android.permission/ |
| com.android.ipsec | IPSec VPN | /apex/com.android.ipsec/ |
| com.android.adbd | ADB 守护进程 | /apex/com.android.adbd/ |
| com.android.cellbroadcast | 小区广播 | /apex/com.android.cellbroadcast/ |
| com.android.extservices | 扩展服务 | /apex/com.android.extservices/ |
| com.android.uwb | UWB 超宽带 | /apex/com.android.uwb/ |
| com.android.nfcservices | NFC 服务 | /apex/com.android.nfcservices/ |
| com.android.virt | 虚拟化框架 | /apex/com.android.virt/ |
APEX 文件内部结构:
APEX 文件结构 (.apex 本质上是特殊的 zip)
com.android.art.apex
├──
apex_manifest.json
模块清单
│ { │ "name": "com.android.art", │ "version": 341100000, │ "requireNativeLibs": ["libc.so", "libm.so"] │ } ├──
apex_pubkey
签名公钥
├──
lib/
32位 Native 库
├──
lib64/
64位 Native 库
├──
javalib/
Java 库
│ ├──
core-oj.jar
│ ├──
core-libart.jar
│ └──
okhttp.jar
├──
etc/
配置文件
│ └──
init/
模块 init 脚本
│ └──
art.rc
└──
bin/
可执行文件
└──
dex2oat
挂载方式
APEX 在启动时被解压/挂载到 /apex/{module_name}/@{version}/
通过 /apex/{module_name}/ 软链接到当前活跃版本
🔐 安全架构概述
Android 采用多层安全模型,包括 Linux 用户隔离、强制访问控制(SELinux)、应用沙盒、安全启动等机制。
SELinux 强制访问控制
▼
SELinux 在 Android 上以 Enforcing 模式运行,为每个进程和文件分配安全上下文标签,严格控制访问权限。
SELinux 上下文格式:
格式:user:role:type:level
u:r:untrusted_app:s0:c512,c768 │ │ │ │ │ │ │ │ │ └── MCS 类别 (多类别安全) │ │ │ └───── 安全级别 │ │ └──────────────────── 类型 (最关键的标识) │ └─────────────────────── 角色 └────────────────────────── 用户
常见 SELinux 域:
| SELinux 域 | 说明 |
|---|---|
| u:r:init:s0 | Init 进程 |
| u:r:system_server:s0 | SystemServer 进程 |
| u:r:zygote:s0 | Zygote 进程 |
| u:r:surfaceflinger:s0 | SurfaceFlinger |
| u:r:servicemanager:s0 | ServiceManager |
| u:r:system_app:s0 | 普通系统应用 |
| u:r:platform_app:s0 | 平台签名应用 |
| u:r:priv_app:s0 | 特权应用 |
| u:r:untrusted_app:s0 | 第三方应用 |
| u:r:hal_*_default:s0 | HAL 服务进程 |
| u:r:vold:s0 | 卷管理守护进程 |
| u:r:netd:s0 | 网络守护进程 |
SELinux 策略规则示例:
允许 system_app 读取 /data/data 下的文件
allow
system_app
app_data_file
:
file
{
read
open
getattr
};
允许 untrusted_app 连接到 internet
allow
untrusted_app
node
:
tcp_socket
{
name_connect
};
允许 system_server 创建 binder 调用
allow
system_server
binder_device
:
chr_file
{
ioctl
read
write
};
不允许 untrusted_app 访问系统属性
neverallow
untrusted_app
system_prop
:
property_service
set
;
⚠️ SELinux 模式
• Enforcing:强制模式,所有违规操作被阻止并记录(生产环境) • Permissive:宽容模式,违规操作被允许但记录(调试用) • Disabled:禁用(仅早期工程设备) getenforce 命令查看当前模式 setenforce 0/1 切换模式(需要 root)
权限体系详解
▼
| 权限级别 | 说明 | 示例 |
|---|---|---|
| normal | 低风险权限,安装时自动授予 | INTERNET, ACCESS_NETWORK_STATE, BLUETOOTH |
| dangerous | 高风险权限,运行时需用户授权 | CAMERA, READ_CONTACTS, ACCESS_FINE_LOCATION, RECORD_AUDIO |
| signature | 同签名应用自动授予 | BIND_ACCESSIBILITY_SERVICE |
| signature|privileged | 同签名或特权应用授予 | 系统内部特权权限 |
| internal | 仅系统内部使用 | BIND_DEVICE_ADMIN |
| special | 特殊权限,需要特殊授权流程 | SYSTEM_ALERT_WINDOW, MANAGE_EXTERNAL_STORAGE |
运行时权限组 (Android 6.0+):
| 权限组 | 包含权限 |
|---|---|
| CALENDAR | READ_CALENDAR, WRITE_CALENDAR |
| CAMERA | CAMERA |
| CONTACTS | READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS |
| LOCATION | ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, ACCESS_BACKGROUND_LOCATION |
| MICROPHONE | RECORD_AUDIO |
| PHONE | READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG 等 |
| SENSORS | BODY_SENSORS, ACTIVITY_RECOGNITION |
| SMS | SEND_SMS, RECEIVE_SMS, READ_SMS |
| STORAGE | READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO (Android 13+) |
Seccomp 沙盒
▼
Seccomp (Secure Computing) 是 Linux 内核提供的系统调用过滤机制,限制进程可使用的系统调用。
密钥库系统
▼
Android 密钥库提供硬件/软件加密密钥的安全存储,防止密钥被提取。
| 版本 | 实现 | 特点 |
|---|---|---|
| Keymaster 1-3 | C++ 实现 | 早期版本 |
| Keymaster 4 | HIDL HAL | Treble 架构下 |
| Keystore2 | Rust 实现 (Android 12+) | 内存安全、更强的隔离 |
密钥类型:AES、RSA、ECDSA、HMAC、Ed25519 等。支持密钥认证(Attestation)证明密钥存储在可信环境中。
📋 配置文件详解
build.prop 属性详解
▼
============= 设备身份信息 =============
ro.product.model
=
Pixel 8
设备型号名
ro.product.brand
=
品牌
ro.product.name
=
shiba
产品代号
ro.product.device
=
shiba
设备代号
ro.product.board
=
shiba
主板代号
ro.product.manufacturer
=
制造商
============= 系统版本信息 =============
ro.build.id
=
UP1A.231005.007
Build ID
ro.build.display.id
=
UP1A.231005.007
显示版本
ro.build.version.incremental
=
10852558
增量版本
ro.build.version.sdk
=
34
API Level
ro.build.version.release
=
14
Android 版本号
ro.build.version.security_patch
=
2024-01-05
安全补丁日期
ro.build.date
=
Wed Oct 4 19:01:37 UTC 2023
ro.build.type
=
user
user/userdebug/eng
ro.build.tags
=
release-keys
签名标签
ro.build.fingerprint
=
google/shiba/shiba:14/...:user/release-keys
============= 硬件信息 =============
ro.hardware
=
taro
硬件平台
ro.board.platform
=
taro
芯片平台
ro.soc.model
=
Tensor G3
SoC 型号
============= 显示与UI =============
ro.sf.lcd_density
=
420
屏幕密度 DPI
persist.sys.timezone
=
Asia/Shanghai
时区
persist.sys.language
=
zh
语言
============= 功能开关 =============
persist.sys.usb.config
=
mtp,adb
USB 配置
ro.debuggable
=
0
是否可调试
ro.adb.secure
=
1
ADB 安全认证
ro.config.ringtone
=
Your_new_adventure.ogg
dalvik.vm.heapsize
=
512m
VM 最大堆内存
dalvik.vm.heapgrowthlimit
=
256m
VM 堆增长限制
dalvik.vm.heapstartsize
=
8m
VM 初始堆大小
属性分类:
| 前缀 | 说明 | 持久性 |
|---|---|---|
| ro.* | 只读属性,启动时设定,不可修改 | 固定 |
| persist.* | 持久属性,修改后保存到 /data/property/ | 重启保留 |
| sys.* | 系统运行时属性 | 重启丢失 |
| init.* | init 进程相关属性 | 重启丢失 |
| dalvik.vm.* | Dalvik/ART 虚拟机配置 | 取决于来源 |
| net.* | 网络相关属性 | 运行时 |
| dhcp.* | DHCP 配置 | 运行时 |
重要 XML 配置文件
▼
| 文件 | 路径 | 说明 |
|---|---|---|
| platform.xml | /system/etc/permissions/ | 权限与 GID 映射 |
| privapp-permissions-*.xml | /system/etc/permissions/ | 特权应用权限白名单 |
| media_codecs.xml | /vendor/etc/ | 媒体编解码器能力声明 |
| audio_policy_configuration.xml | /vendor/etc/ | 音频路由策略 |
| manifest.xml (VINTF) | /vendor/etc/vintf/ | HAL 接口清单 |
| compatibility_matrix.xml | /system/etc/vintf/ | 兼容性矩阵 |
| apns-conf.xml | /system/etc/ | 运营商 APN 数据库 |
| apex_manifest.json | 每个 APEX 内 | APEX 模块清单 |
| fonts.xml | /system/etc/ | 字体映射配置 |
| hiddenapi-*.csv | /system/etc/sysconfig/ | 隐藏 API 策略 |
packages.xml 结构分析
▼
/data/system/packages.xml 是 PMS 的核心数据文件,记录了所有已安装包的完整信息。
<?xml version='1.0' encoding='UTF-8'?>
<packages>
<!-- 权限定义 -->
<permission
name
=
"android.permission.INTERNET"
package
=
"android"
protection
=
"normal"
/>
<!-- 安装包信息 -->
<package
name
=
"com.example.app"
codePath
=
"/data/app/com.example.app-1/base.apk"
nativeLibraryPath
=
"/data/app/.../lib/arm64"
primaryCpuAbi
=
"arm64-v8a"
version
=
"100"
userId
=
"10123"
installer
=
"com.android.vending"
installTime
=
"1699999999"
<sigs
count
=
"1"
<cert
index
=
"0"
key
=
"..."
/>
</sigs>
<perms>
<item
name
=
"android.permission.INTERNET"
granted
=
"true"
/>
<item
name
=
"android.permission.CAMERA"
granted
=
"false"
/>
</perms>
</package>
</packages>
🎨 图形与媒体系统
图形渲染管线 — SurfaceFlinger
▼
Android 图形渲染管线: ┌─────────────────────────────────────────────────────────────────┐ │ 应用层 │ │ View.invalidate() → ViewRootImpl.draw() → RenderThread │ └─────────────────────────────┬───────────────────────────────────┘ │ 生成 GraphicBuffer ↓ ┌─────────────────────────────────────────────────────────────────┐ │ SurfaceFlinger (合成器) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Layer 1 │ │ Layer 2 │ │ Layer 3 │ │ Layer 4 │ │ │ │(App UI) │ │(StatusBar│ │(Keyboard)│ │(Dialog) │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ └─────────┬──┴─────────┬──┴──────────┬──┘ │ │ │ Compose │ │ │ │ ↓ ↓ ↓ │ │ ┌──────────────────────────────────────────┐ │ │ │ HWC (Hardware Composer) — GPU/HWC 合成 │ │ │ └────────────────────┬─────────────────────┘ │ └────────────────────────────────┼────────────────────────────────┘ │ ↓ ┌────────────────────────┐ │ Display Panel (显示屏) │ │ 60/90/120/144Hz │ └────────────────────────┘ 关键组件: • Surface — 一块可绘制的缓冲区 • GraphicBuffer — 共享图形缓冲区 • BufferQueue — 生产者-消费者队列 • SurfaceFlinger — 合成所有 Layer 到显示屏 • HWC (Hardware Composer) — 硬件加速合成 • Skia — 2D 图形引擎 (CPU/GPU 渲染后端) • HWUI — 硬件加速渲染管线
音频系统架构
▼
Android 音频栈: ┌────────────────────────────────────────┐ │ 应用层 │ │ MediaPlayer / AudioTrack / SoundPool │ └──────────────────┬─────────────────────┘ ↓ ┌────────────────────────────────────────┐ │ Audio Framework (Java) │ │ AudioManager / AudioService │ └──────────────────┬─────────────────────┘ ↓ ┌────────────────────────────────────────┐ │ AudioFlinger (Native) │ │ 音频混合器、效果链、重采样 │ └──────────────────┬─────────────────────┘ ↓ ┌────────────────────────────────────────┐ │ Audio HAL (HIDL/AIDL) │ │ audio.primary, audio.usb 等 │ └──────────────────┬─────────────────────┘ ↓ ┌────────────────────────────────────────┐ │ ALSA / 内核音频驱动 │ │ Codec, Speaker, Mic 硬件 │ └────────────────────────────────────────┘
| 音频流类型 | 说明 | 典型用途 |
|---|---|---|
| STREAM_MUSIC | 媒体播放 | 音乐、视频、游戏音效 |
| STREAM_ALARM | 闹钟 | 闹钟应用 |
| STREAM_NOTIFICATION | 通知 | 消息提示音 |
| STREAM_RING | 铃声 | 来电铃声 |
| STREAM_SYSTEM | 系统 | 按键音、系统提示 |
| STREAM_VOICE_CALL | 通话 | 电话通话 |
| STREAM_DTMF | 拨号音 | 拨号键盘音 |
相机框架 (Camera2 / CameraX)
▼
Android Camera 架构 (Camera2 API): ┌──────────────────────────────────────┐ │ 应用层 │ │ Camera2 API / CameraX (Jetpack) │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ CameraService (系统服务) │ │ 相机资源管理、权限验证 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ Camera HAL (HIDL/AIDL) │ │ ICameraDevice@3.x / AIDL Camera │ │ 请求处理、结果回调 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 内核 Camera Driver │ │ V4L2 / 自定义驱动 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 相机硬件 (Sensor + ISP) │ └──────────────────────────────────────┘ Camera2 核心概念: • CameraManager — 相机管理器 • CameraDevice — 相机设备抽象 • CameraCaptureSession — 捕获会话 • CaptureRequest — 捕获请求(参数配置) • CaptureResult — 捕获结果(元数据) • ImageReader — 图像数据接收器
媒体编解码 — MediaCodec
▼
| 编解码器 | 类型 | 说明 |
|---|---|---|
| OMX.google.h264.decoder | 软件 | Google H.264 软解码 |
| OMX.qcom.video.decoder.avc | 硬件 | 高通 H.264 硬解码 |
| c2.android.aac.decoder | Codec2 软件 | Android AAC 解码 |
| c2.qti.avc.decoder | Codec2 硬件 | 高通 AVC 解码 |
OMX (OpenMAX) → Codec2 迁移:Android 10+ 使用 Codec2 框架替代旧的 OMX,提供更好的性能和灵活性。配置文件 media_codecs.xml 声明设备支持的编解码器列表。
📡 通信与连接
电话系统架构
▼
Android Telephony 架构: ┌─────────────────────────────────────────┐ │ 应用层 (Phone App / Dialer) │ │ TelecomManager / TelephonyManager │ └──────────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ Telecomm Framework │ │ TelecomService / Call 管理 │ └──────────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ Telephony Framework │ │ Phone / ServiceStateTracker │ └──────────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ Radio Interface Layer (RIL) │ │ RILD 守护进程 (C) │ │ 与 Modem 通信 │ └──────────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ HAL (IRadio@1.x) │ │ 与基带处理器通信 │ └──────────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ Modem / Baseband Processor │ │ 2G/3G/4G/5G 协议栈 │ └─────────────────────────────────────────┘
WiFi 系统架构
▼
Android WiFi 架构 (Android 12+): ┌─────────────────────────────────────────┐ │ 应用层 │ │ WifiManager API │ └──────────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ WifiService (SystemServer) │ │ WifiServiceImpl │ └──────────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ Wifi HAL (AIDL) │ │ IWifi.aidl │ └──────────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ wpa_supplicant / hostapd │ │ WPA 协议实现、热点管理 │ └──────────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ 内核 WiFi 驱动 (nl80211) │ └──────────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ WiFi 芯片固件 │ └─────────────────────────────────────────┘ 关键文件: • /data/misc/wifi/WifiConfigStore.xml — WiFi 配置存储 • /vendor/etc/wifi/wpa_supplicant.conf — supplicant 配置 • /vendor/firmware/wlan/ — WiFi 芯片固件
蓝牙协议栈
▼
Android 使用 Gabeldorsche(后更名为 Fluoride)蓝牙协议栈。
| 组件 | 说明 |
|---|---|
| BluetoothManagerService | 蓝牙管理服务 |
| AdapterService | 蓝牙适配器服务 |
| GattService | GATT (BLE) 服务 |
| A2dpService | 音频流服务 |
| HidDeviceService | HID 设备服务 |
| libbluetooth.so | 蓝牙 HAL 库 |
连接管理服务 (ConnectivityService)
▼
ConnectivityService 管理所有网络连接类型,处理网络策略和流量控制。
💾 存储与文件系统
vold — 卷管理守护进程
▼
vold (Volume Daemon) 负责管理所有存储设备的挂载、格式化、加密等操作。
| 职责 | 说明 |
|---|---|
| 存储设备检测 | 监听内核 uevent,检测 SD 卡、USB 存储设备插入 |
| 分区管理 | 管理存储分区(Primary、Adoptable) |
| 文件系统格式化 | 格式化分区为 ext4/f2fs/exFAT |
| 挂载管理 | 将分区挂载到正确的挂载点 |
| 加密管理 | 管理 FBE/FDE 加密 |
| OTG 支持 | 处理 USB OTG 存储设备 |
Android 使用的文件系统
▼
| 文件系统 | 用途 | 特点 |
|---|---|---|
| ext4 | /system, /vendor, /product | 稳定可靠,日志文件系统,支持 TRIM |
| f2fs | /data (闪存优化) | 专为闪存设计,更好的随机写性能 |
| erofs | 只读分区(部分设备) | 压缩只读文件系统,节省空间 |
| squashfs | 旧版只读分区 | 压缩只读文件系统(已被erofs替代) |
| tmpfs | /dev, /mnt | 内存文件系统,重启丢失 |
| proc | /proc | 进程信息伪文件系统 |
| sysfs | /sys | 内核设备信息伪文件系统 |
| exFAT | 外部 SD 卡 | 支持大文件(>4GB) |
OTA 升级机制
▼
| 方案 | 版本 | 说明 |
|---|---|---|
| Block-based OTA | Android 5.0+ | 按块差分更新 |
| A/B Seamless Updates | Android 7.0+ | 双槽位无缝升级,更新在后台完成 |
| Virtual A/B | Android 11+ | 结合动态分区,只有一个完整系统 |
| Virtual A/B Retrofit | Android 12+ | 优化存储空间使用 |
A/B 无缝升级流程: ┌─────────────────────────────────────────────┐ │ Slot A (当前活跃) │ Slot B (非活跃) │ │ system_a │ system_b (旧版) │ │ vendor_a │ vendor_b (旧版) │ │ boot_a ← 当前启动 │ boot_b │ └───────────────────────┴─────────────────────┘ 升级过程: 1. 下载 OTA 包到 /data 2. update_engine 解析更新 payload 3. 将更新写入 Slot B (非活跃槽位) 4. 验证 Slot B 完整性 5. 标记 Slot B 为可启动 6. 重启,Bootloader 选择 Slot B 7. 系统从 Slot B 启动 8. 标记 Slot B 为活跃 回滚机制: • 如果新系统启动失败,自动回退到 Slot A • Bootloader 维护 slot 状态和优先级
📖 教程与实践
编译 AOSP 教程
▼
环境要求:
编译步骤:
1. 安装依赖
sudo apt-get install
git-core gnupg flex bison build-essential \ zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \ libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev \ lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip \ fontconfig python3
2. 安装 repo 工具
mkdir
~/bin
curl
https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod
a+x ~/bin/repo
export
PATH
=~/bin:$PATH
3. 配置 git
git config --global user.email "you@example.com" git config --global user.name "Your Name"
4. 初始化 repo (以 Android 14 为例)
mkdir
aosp &&
cd
aosp repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r1
5. 同步源码 (耗时 1-3 小时)
repo sync -c -j8 --no-tags
6. 设置编译环境
source build/envsetup.sh
7. 选择编译目标
lunch aosp_oriole-userdebug
Pixel 6
或: lunch aosp_arm64-eng (模拟器)
8. 开始编译
m -j$(nproc)
使用所有 CPU 核心
或: make -j16
编译产物位置:
out/target/product/oriole/
├── system.img (系统镜像)
├── vendor.img
├── boot.img
└── userdata.img
AOSP 源码树导航
▼
aosp/
├──
art/
ART 运行时源码
├──
bionic/
Android C 库 (libc, libm, linker)
├──
bootable/
引导相关 (recovery, bootloader)
├──
build/
构建系统 (makefile, Soong)
│ └──
make/
├──
compatibility/
兼容性测试
├──
cts/
CTS 兼容性测试套件
├──
dalvik/
Dalvik VM (旧版)
├──
developers/
开发者示例
├──
development/
开发工具
├──
device/
设备特定配置
│ ├──
google/
Google Pixel 设备
│ └──
generic/
通用设备配置
├──
external/
第三方开源库
│ ├──
zlib/
zlib 压缩
│ ├──
sqlite/
SQLite
│ ├──
boringssl/
BoringSSL (Google fork of OpenSSL)
│ ├──
icu/
ICU 国际化
│ └──
skia/
Skia 图形引擎
├──
frameworks/
Android 框架源码 (最重要)
│ ├──
base/
基础框架
│ │ ├──
core/
核心 Java API
│ │ ├──
services/
系统服务实现
│ │ │ ├──
core/
AMS, PMS, WMS
│ │ │ └──
java/
Java 服务代码
│ │ └──
cmds/
命令行工具
│ ├──
native/
Native 框架
│ │ ├──
libs/
Native 库
│ │ │ ├──
gui/
GUI 库 (Surface)
│ │ │ ├──
binder/
Binder 实现
│ │ │ └──
ui/
UI 库
│ │ └──
services/
Native 服务
│ │ ├──
surfaceflinger/
SurfaceFlinger
│ │ └──
audioflinger/
AudioFlinger
│ ├──
av/
音视频框架
│ │ ├──
media/
媒体库
│ │ └──
services/
媒体服务
│ └──
opt/
可选组件
├──
hardware/
HAL 接口定义
│ ├──
interfaces/
HIDL/AIDL HAL 接口
│ │ ├──
camera/
相机 HAL
│ │ ├──
audio/
音频 HAL
│ │ ├──
graphics/
图形 HAL
│ │ └──
wifi/
WiFi HAL
│ └──
libhardware/
HAL 加载库
├──
kernel/
内核源码
├──
libcore/
Java 核心库 (OpenJDK)
├──
packages/
预装应用
│ ├──
apps/
普通应用
│ │ ├──
Settings/
系统设置
│ │ ├──
Launcher3/
启动器
│ │ └──
SystemUI/
系统 UI
│ ├──
providers/
内容提供者
│ │ ├──
ContactsProvider/
联系人
│ │ ├──
MediaProvider/
媒体
│ │ └──
TelephonyProvider/
电话
│ └──
services/
系统服务应用
├──
platform_testing/
平台测试
├──
prebuilts/
预编译工具
│ ├──
clang/
Clang 编译器
│ └──
jdk/
JDK
├──
system/
底层系统组件
│ ├──
core/
核心工具 (init, logcat)
│ ├──
sepolicy/
SELinux 策略
│ ├──
vold/
卷管理
│ └──
netd/
网络守护
├──
tools/
开发工具
│ ├──
adb/
ADB 源码
│ └──
apkparser/
APK 解析工具
└──
vendor/
厂商代码
调试工具使用指南
▼
| 工具 | 用途 | 常用命令 |
|---|---|---|
| adb | Android 调试桥 | adb devices — 列出设备 adb shell — 进入 Shell adb logcat — 查看日志 adb push/pull — 文件传输 adb install — 安装 APK adb reboot — 重启设备 |
| logcat | 日志系统 | logcat -v time — 带时间戳 logcat *:E — 仅显示 Error logcat -s TAG — 按标签过滤 logcat -c — 清除日志 |
| dumpsys | 服务状态转储 | dumpsys activity — Activity 状态 dumpsys meminfo — 内存信息 dumpsys battery — 电池信息 dumpsys window — 窗口信息 |
| getprop/setprop | 属性管理 | getprop — 列出所有属性 getprop ro.build.version.sdk setprop debug.xxx 1 |
| top | 进程监控 | top -m 10 — 前10进程 top -d 1 — 1秒刷新 |
| ps | 进程列表 | ps -A — 所有进程 ps -ef — 完整信息 |
| strace | 系统调用跟踪 | strace -p PID |
| bugreport | 完整 Bug 报告 | adb bugreport ./output.zip |
日志分析方法
▼
Logcat 日志级别:
| 级别 | 缩写 | 说明 |
|---|---|---|
| Verbose | V | 最详细,仅开发调试 |
| Debug | D | 调试信息 |
| Info | I | 一般信息 |
| Warning | W | 警告,可能有问题 |
| Error | E | 错误,功能失败 |
| Assert | A | 断言失败,严重错误 |
| Silent | S | 不输出 |
日志格式说明:
典型 logcat 输出格式
12-15 14:32:01.234 1234 5678 I ActivityManager: Start proc com.example.app │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── 日志消息 │ │ │ │ │ │ │ └── 日志标签 │ │ │ │ │ │ └── 日志级别 │ │ │ │ │ └── 线程 ID (TID) │ │ │ │ └── 进程 ID (PID) │ │ │ └── 毫秒 │ │ └── 秒:分 │ └── 时:分 └── 月-日
日志缓冲区
main — 应用日志(默认) system — 系统服务日志 radio — 电话/射频日志 events — 事件日志 crash — 崩溃日志 kernel — 内核日志
Android 版本完整对照表
▼
| 版本 | 代号 | API Level | 关键特性 | 发布年份 |
|---|---|---|---|---|
| Android 16 | - | 36 | 预测性返回动画、Health Connect 扩展 | 2026 |
| Android 15 | Vanilla Ice Cream | 35 | 卫星通信、Private Space、16KB 页面 | 2024 |
| Android 14 | Upside Down Cake | 34 | Ultra HDR、Path APIs、Health Connect | 2023 |
| Android 13 | Tiramisu | 33 | 细化媒体权限、Themed Icons | 2022 |
| Android 12L | Snow Cone v2 | 32 | 大屏优化 | 2022 |
| Android 12 | Snow Cone | 31 | Material You、AIDL HAL | 2021 |
| Android 11 | Red Velvet Cake | 30 | 一次性权限、Scoped Storage 强制 | 2020 |
| Android 10 | Quince Tart | 29 | APEX 模块化、手势导航 | 2019 |
| Android 9 | Pie | 28 | AI 自适应电池、Digital Wellbeing | 2018 |
| Android 8.1 | Oreo MR1 | 27 | Neural Networks API | 2017 |
| Android 8.0 | Oreo | 26 | Project Treble、通知频道 | 2017 |
| Android 7.1 | Nougat MR1 | 25 | 圆形图标、Daydream VR | 2016 |
| Android 7.0 | Nougat | 24 | A/B 升级、Vulkan、分屏 | 2016 |
| Android 6.0 | Marshmallow | 23 | 运行时权限、Doze、指纹 | 2015 |
| Android 5.1 | Lollipop MR1 | 22 | 多 SIM 卡、设备保护 | 2015 |
| Android 5.0 | Lollipop | 21 | ART、Material Design、64位 | 2014 |
| Android 4.4 | KitKat | 19 | 低内存优化、打印框架 | 2013 |
| Android 4.3 | Jelly Bean MR2 | 18 | BLE、DRM、限制配置 | 2013 |
| Android 4.2 | Jelly Bean MR1 | 17 | 多用户、Daydream、锁屏 Widget | 2012 |
| Android 4.1 | Jelly Bean | 16 | Project Butter (60fps) | 2012 |
| Android 4.0 | Ice Cream Sandwich | 14-15 | Holo Design、统一手机平板 | 2011 |
| Android 3.0 | Honeycomb | 11-13 | 平板专用、Fragment | 2011 |
| Android 2.3 | Gingerbread | 9-10 | NFC、下载管理、复制粘贴 | 2010 |
| Android 2.2 | Froyo | 8 | JIT 编译、USB 热点 | 2010 |
| Android 2.0-2.1 | Éclair | 5-7 | 多账户、动态壁纸 | 2009 |
| Android 1.6 | Donut | 4 | CDMA 支持、手势 | 2009 |
| Android 1.5 | Cupcake | 3 | 软键盘、Widget、视频录制 | 2009 |
| Android 1.0-1.1 | - | 1-2 | 基础 Android 功能 | 2008 |
术语表 (Glossary)
▼
| 缩写 | 全称 | 说明 |
|---|---|---|
| AOSP | Android Open Source Project | Android 开源项目 |
| AMS | ActivityManagerService | 活动管理器服务 |
| WMS | WindowManagerService | 窗口管理器服务 |
| PMS | PackageManagerService | 包管理器服务 |
| HAL | Hardware Abstraction Layer | 硬件抽象层 |
| HIDL | HAL Interface Definition Language | HAL 接口定义语言 |
| AIDL | Android Interface Definition Language | Android 接口定义语言 |
| VNDK | Vendor Native Development Kit | 厂商 Native 开发工具包 |
| GSI | Generic System Image | 通用系统镜像 |
| ART | Android Runtime | Android 运行时 |
| DEX | Dalvik Executable | Dalvik 可执行文件 |
| OAT | Optimized Android Toolkit | ART 优化后的文件 |
| AVB | Android Verified Boot | Android 验证启动 |
| FBE | File-Based Encryption | 文件级加密 |
| FDE | Full Disk Encryption | 全盘加密 |
| SELinux | Security-Enhanced Linux | 安全增强 Linux |
| APEX | Android Pony EXpression | Android 模块化包格式 |
| OTA | Over-The-Air | 空中下载升级 |
| CTS | Compatibility Test Suite | 兼容性测试套件 |
| VTS | Vendor Test Suite | 厂商测试套件 |
| GMS | Google Mobile Services | Google 移动服务 |
| RIL | Radio Interface Layer | 射频接口层 |
| HWC | Hardware Composer | 硬件合成器 |
| JNI | Java Native Interface | Java Native 接口 |
| Binder | - | Android IPC 机制 |
| Soong | - | Android 构建系统 (替代 Make) |
| VINTF | Vendor Interface Object | 厂商接口对象 |
| ANR | Application Not Responding | 应用无响应 |
| OOM | Out Of Memory | 内存溢出 |
| LMK | Low Memory Killer | 低内存杀手 |
| TEE | Trusted Execution Environment | 可信执行环境 |
| TZ | TrustZone | ARM TrustZone 安全区 |