1. AOSP 源码的主要目录结构
| 目录 | 说明 |
|---|---|
frameworks/ | Android Framework 核心代码(AMS、WMS、PMS、Binder 等) |
system/ | 系统底层服务(init、adb、logcat、core utils) |
packages/ | 系统应用(Settings、Launcher、SystemUI) |
hardware/ | HAL(硬件抽象层) (Camera、Audio、Sensor) |
kernel/ | Linux 内核(设备驱动、进程调度) |
art/ | Android Runtime(ART 虚拟机) |
external/ | 第三方开源库(OpenSSL、SQLite、FFmpeg) |
2. 如何抽离特定模块的代码?
方法 1:直接复制源码目录
如果你想研究 Framework(如 ActivityManagerService),可以直接复制 frameworks/base/ 到你的研究目录:
mkdir ~/android-research
cp -r ~/aosp/frameworks/base/ ~/android-research/android-framework
这样你就得到了一个独立的 android-framework 目录,可以单独分析。
方法 2:使用 repo 只同步部分代码
如果你只想下载 Framework 部分,可以修改 repo 的 manifest.xml:
cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r29 --depth=1
repo sync -j8 frameworks/base
这样只会下载 frameworks/base/,而不是整个 AOSP。
方法 3:使用 git 单独克隆某个模块
如果只需要某个子模块(如 Binder),可以直接用 git 克隆:
git clone https://android.googlesource.com/platform/frameworks/native
适用于只想研究 Binder、SurfaceFlinger 等模块的情况。
3. 如何分析抽离后的代码?
3.1 使用 Android Studio 导入
cd ~/aosp
make idegen # 生成 IDE 配置文件(运行后会在 AOSP 根目录生成 `android.ipr` 和 `android.iml`,供 Android Studio 导入)
development/tools/idegen/idegen.sh # 生成 Android Studio 项目
关键步骤:
1. 扫描源码目录:
- 解析 `Android.bp` 和 `Android.mk` 文件,确定哪些代码属于核心模块(如 `frameworks/base`)。
2. 排除非必要文件
- 忽略测试代码(`test/`)、生成文件(`out/`)、二进制文件等。
3. 生成 IDE 兼容格式:
- 转换为 Android Studio 支持的索引结构,确保代码跳转、搜索功能正常
执行后,用 Android Studio 直接打开 `android.ipr` 即可。
- `android.ipr`:Android Studio 项目配置文件。
- `android.iml`:模块依赖配置文件
然后用 Android Studio 打开 android.ipr,可以方便地跳转代码。
3.2 使用 VS Code + Ctags
cd ~/android-research/android-framework
ctags -R . # 生成代码索引
然后在 VS Code 中安装 C/C++、Java 插件,即可进行代码导航。
3.3 使用 grep 和 find 搜索关键代码
grep -r "ActivityManagerService" . # 查找所有 AMS 相关代码
find . -name "*.java" | xargs grep "onCreate" # 查找所有 onCreate 方法
4. 重点研究模块推荐
4.1 Framework 核心
| 模块 | 代码路径 | 研究重点 |
|---|---|---|
| ActivityManager | frameworks/base/services/core/java/com/android/server/am/ | Activity 生命周期、任务栈管理 |
| WindowManager | frameworks/base/services/core/java/com/android/server/wm/ | 窗口管理、Surface 渲染 |
| PackageManager | frameworks/base/services/core/java/com/android/server/pm/ | APK 安装、权限管理 |
| Binder | frameworks/native/libs/binder/ | IPC 通信机制 |
4.2 系统底层
| 模块 | 代码路径 | 研究重点 |
|---|---|---|
| Init 进程 | system/core/init/ | Android 启动流程 |
| Zygote | frameworks/base/core/java/com/android/internal/os/ | 应用进程孵化 |
| SurfaceFlinger | frameworks/native/services/surfaceflinger/ | 图形合成 |
5. 如何调试修改后的代码?
5.1 修改后重新编译
cd ~/aosp
source build/envsetup.sh
lunch aosp_x86_64-eng # 选择目标
make -j$(nproc) frameworks # 仅编译 Framework
`$(nproc)` 是一个 Linux/macOS 命令,用于获取当前系统的 CPU 核心数量
5.2 刷入真机或模拟器
adb reboot bootloader
fastboot flash system out/target/product/[设备代号]/system.img
fastboot reboot
6. 常见问题
Q1:如何只研究某个类(如 ActivityManagerService)?
-
方法:
find frameworks/base/ -name "ActivityManagerService.java"然后单独分析该文件。
Q2:如何查看某个方法的调用链?
-
使用
grep+call hierarchy(Android Studio 支持) :grep -r "startActivity" frameworks/base/