如何在Android Studio中调试Android平台原生C++代码(以AudioTrack为例)
配置Android Studio调试Android平台原生C++代码(以AudioTrack为例)
前置准备:获取对应版本的源码和调试符号
你使用的是API 30的x86模拟器,需要匹配Android 11(API 30)x86架构的资源:
- 原生源码获取:SDK Manager默认只提供Java层平台源码,C++层源码需要拉取AOSP对应tag(android-11.0.0_r39,匹配API 30公开发布版)的相关目录即可,不需要同步全量AOSP。你需要的AudioTrack相关源码分布在
frameworks/av/media/libaudioclient/、frameworks/base/core/jni/两个路径下,将对应文件存放到本地目录,目录结构要和AOSP的目录结构完全一致,比如AudioTrack.cpp的本地路径要为{本地根目录}/frameworks/av/media/libaudioclient/AudioTrack.cpp。 - 调试符号获取:系统库的调试符号可以下载官方对应版本x86模拟器的符号包,也可以自行编译对应tag的x86模拟器镜像,编译产物的
out/target/product/generic_x86/symbols/system/lib/路径下就包含libandroid_runtime.so、libaudioclient.so等带完整调试信息的系统库,注意符号的版本、架构必须和你运行的模拟器镜像完全一致,否则会出现地址不匹配的问题。
配置Android Studio关联资源
不需要修改应用的编译配置,仅调整调试运行配置即可:
- 打开你应用的运行配置页面,确认调试器类型已经设置为
Dual (Java + Native) - 切换到「Debugger > Native」标签页,找到「Source Directories」配置项,点击加号将你存放AOSP原生源码的本地根目录添加进去
- 在同一标签页下找到「LLDB Startup Commands」配置项,添加以下两行命令,路径替换为你本地的实际路径:
# 配置调试符号的搜索路径 settings set target.exec-search-paths {你存放调试符号的根目录}/system/lib # 配置源码路径映射,前半段是AOSP编译时的源码根路径,后半段是你本地的源码根路径 settings set target.source-map /aosp/src/ {你存放原生源码的本地根目录}
如果不清楚编译时的源码根路径,可以在LLDB命中断点后执行image lookup -v -n android_media_AudioTrack_start,查看输出的CompileUnit字段里的路径前缀,替换到上面的映射规则里即可。
调试操作步骤
- 保存配置后,以调试模式启动应用到目标模拟器
- 正常单步调试到Java层的JNI调用处,比如
AudioTrack的native方法调用行 - 可以直接使用「Force Step Into」尝试跳转,也可以提前在LLDB控制台给对应JNI方法设置断点,比如
br set --name android_media_AudioTrack_start - 断点命中后,Android Studio会自动加载对应的C++源码、展示变量和调用栈信息,即可正常单步调试系统原生代码。
常见问题排查
- 如果断点命中后还是没有显示源码,先检查源码的目录结构是否和AOSP完全一致,再确认路径映射规则是否正确
- 如果变量信息显示不全,确认你使用的调试符号是未剥离的带调试信息版本,且和运行的镜像版本完全匹配
- 不需要给应用添加NDK、CMake相关的编译配置,仅调整调试配置即可正常调试系统原生代码。
内容的提问来源于stack exchange,提问作者Thomas McGuire
相关产品推荐
相关产品推荐

