如何在 AOSP 中判断一个源文件属于哪个模块(以 CameraService 为例)

如何在 AOSP 中判断一个源文件属于哪个模块(以 CameraService 为例)

在 AOSP 开发中,经常需要修改底层 C++ 代码(如 CameraService.cpp),但很多人会遇到一个问题:

我修改了某个 .cpp 文件,该怎么知道它属于哪个模块?
我只想编译这个模块,而不是整个系统,怎么办?

本篇文章将以 AOSP 13 中的 CameraService 为例,系统讲解 如何判断源文件归属模块、如何单独编译、验证是否生效,适用于所有 AOSP native 开发场景。


📌 场景示例

假设你修改了以下文件:

frameworks/av/services/camera/libcameraservice/CameraService.cpp

你想知道:

  • 这个文件属于哪个编译模块(如 cameraserverlibcameraservice 等)?
  • 怎么只编译它对应的模块?
  • 怎么验证改动已生效?

✅ 方法一:从 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 中的 srcsshared_libs
编译对应模块m camerserver(或 m 模块名
推送验证adb push 后重启 cameraserver
日志确认生效`adb logcat

这套方法不仅适用于 CameraService,也适用于调试如 AudioFlingerInputDispatcherSurfaceFlinger 等系统服务模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值