如何在 AOSP 中判断一个源文件属于哪个模块(以 CameraService 为例)
如何在 AOSP 中判断一个源文件属于哪个模块(以 CameraService 为例)
在 AOSP 开发中,经常需要修改底层 C++ 代码(如 CameraService.cpp
),但很多人会遇到一个问题:
我修改了某个
.cpp
文件,该怎么知道它属于哪个模块?
我只想编译这个模块,而不是整个系统,怎么办?
本篇文章将以 AOSP 13 中的 CameraService 为例,系统讲解 如何判断源文件归属模块、如何单独编译、验证是否生效,适用于所有 AOSP native 开发场景。
📌 场景示例
假设你修改了以下文件:
frameworks/av/services/camera/libcameraservice/CameraService.cpp
你想知道:
- 这个文件属于哪个编译模块(如
cameraserver
、libcameraservice
等)? - 怎么只编译它对应的模块?
- 怎么验证改动已生效?
✅ 方法一:从 Android.bp
反查依赖关系
进入 frameworks/av/camera/cameraserver/Android.bp
:
cc_binary {name: "cameraserver",srcs: ["main_cameraserver.cpp"],shared_libs: ["libcameraservice", // ✅ 引用了 libcameraservice...],
}
然后查看 libcameraservice
是如何定义的(位于 frameworks/av/services/camera/libcameraservice/Android.bp
):
cc_library_shared {name: "libcameraservice",srcs: ["CameraService.cpp",...],...
}
✅ 说明:你修改的
CameraService.cpp
属于libcameraservice
,最终被cameraserver
模块使用。
✅ 方法二:使用 m nothing
输出日志查模块归属
m nothing SHOW_COMMANDS=true > build.log 2>&1 &
grep CameraService.cpp build.log
你会看到日志中类似这样的一行:
[...]/CameraService.cpp → [...]/libcameraservice.so → camerserver
这说明最终链接目标是 cameraserver
。
✅ 方法三:编译 camerserver 模块验证修改
修改完后,只需执行以下命令即可编译:
# 设置环境
source build/envsetup.sh
lunch <your_target># 编译 camerserver(会自动包含 libcameraservice)
m camerserver
✅ 方法四:推送并重启验证
adb root
adb remount
adb push out/target/product/<device>/system/bin/cameraserver /system/bin/
adb shell stop cameraserver
adb shell start cameraserver
然后查看日志:
adb logcat | grep CameraService
🧠 延伸建议
- 想快速查找模块可使用 Soong module graph;
- 想可视化模块依赖,可运行:
m nothing SOONG_COLLECT_BUILDDIRS=1
🧾 小结
操作 | 方法 |
---|---|
判断文件属于哪个模块 | 查看 Android.bp 中的 srcs 和 shared_libs |
编译对应模块 | m camerserver (或 m 模块名 ) |
推送验证 | adb push 后重启 cameraserver |
日志确认生效 | `adb logcat |
这套方法不仅适用于 CameraService,也适用于调试如 AudioFlinger
、InputDispatcher
、SurfaceFlinger
等系统服务模块。