当前位置: 首页 > news >正文

如何在 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 等系统服务模块。

http://www.xdnf.cn/news/557443.html

相关文章:

  • 首次中医知识问答模型微调
  • CSS display有几种属性值
  • 深入理解 Python 中的几种方法:实例方法、类方法、静态方法与特殊方法
  • leetcode 162. Find Peak Element
  • python新手学习笔记①
  • Linux探秘:驾驭开源,解锁高效能——基础指令
  • Git命令使用全攻略:从创建分支到合并的完整流程
  • 大模型高效微调技术全面解析:从PEFT原理到实战应用
  • 项目进度延误,如何按时交付?
  • 预训练模型:深度学习的通用特征引擎
  • Greenplum数据库维护篇之常用操作指导
  • TripGenie:畅游济南旅行规划助手:个人工作纪实(十八)
  • Windows逆向工程提升之IMAGE_DOS_HEADER
  • 定时任务延迟任务
  • linux内核编译学习笔记
  • Java异常处理与File类终极指南
  • 【基础知识】SPI协议的种类及异同
  • 数据库 1.0.1
  • DAY28类
  • MYSQL备份恢复知识:第四章:备份锁
  • 【优秀三方库研读】在 quill 开源库中为什么封装 safe_fwrite,而不是直接使用系统 fwrite
  • MySQL中添加一个具有创建数据库权限的用户
  • Java并发进阶系列:深度讨论jdk1.8 ConcurrentHashMap并发环境下transfer方法桶位分配过程
  • C/C++ Select Poll Epoll 多路转接
  • python -> matplotlib简单用法
  • Unity3D仿星露谷物语开发47之砍树时落叶特效
  • Wan2.1 加速推理方法
  • 使用cursor自动生成前后端分离的web应用程序
  • ROS2 pkg 创建功能包
  • [ 计算机网络 ] 深入理解OSI七层模型