如何在 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
等系統服務模塊。