Android源码初步探索-编译

319 阅读3分钟

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 核心

模块代码路径研究重点
ActivityManagerframeworks/base/services/core/java/com/android/server/am/Activity 生命周期、任务栈管理
WindowManagerframeworks/base/services/core/java/com/android/server/wm/窗口管理、Surface 渲染
PackageManagerframeworks/base/services/core/java/com/android/server/pm/APK 安装、权限管理
Binderframeworks/native/libs/binder/IPC 通信机制

4.2 系统底层

模块代码路径研究重点
Init 进程system/core/init/Android 启动流程
Zygoteframeworks/base/core/java/com/android/internal/os/应用进程孵化
SurfaceFlingerframeworks/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/