androidTest包中ndk-stack所需obj文件位置及生成方法问询
解决AAR库模块Instrumented测试Native崩溃的符号化问题
嘿,我之前也碰到过类似的坑,aar模块的Native符号文件位置确实和普通apk项目不太一样,咱们一步步来解决:
为啥找不到你说的obj文件?
首先,aar模块的构建默认不会把debug符号文件(.o这类)打包到aar里,而且androidTest任务默认的构建路径和你想的根项目obj目录完全不是一回事——符号文件其实藏在库模块自己的build目录里。
正确的obj文件位置在哪?
针对你的:myLibrary模块,androidTest相关的Native符号文件路径应该是这两个中的一个:
- 如果你用的是ndkBuild:
MyProject/myLibrary/build/intermediates/ndkBuild/debug/obj/local/<ABI> - 如果你用的是CMake:
MyProject/myLibrary/build/intermediates/cmake/debug/obj/<ABI>
这里的debug是你的构建变体,要是你用了其他自定义变体,记得替换成对应的名字。
怎么确保androidTest任务生成这些符号文件?
关键是要让debug构建保留Native符号,同时让androidTest使用debug变体:
如果你用ndkBuild
- 检查你的
Android.mk,别加LOCAL_STRIP_MODULE := true这类会剥离符号的配置——debug构建默认会保留符号,但这个配置会覆盖它。 - 在库模块的
build.gradle里加上这些配置:android { buildTypes { debug { jniDebuggable true // 必须开这个,确保JNI调试符号不被剥离 } } externalNativeBuild { ndkBuild { path "src/main/cpp/Android.mk" } } testBuildType "debug" // 强制androidTest用debug构建变体 }
如果你用CMake
- 在
CMakeLists.txt里确保debug构建保留符号:set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g") - 同样在库模块的
build.gradle里开启JNI调试并指定测试构建类型:android { buildTypes { debug { jniDebuggable true } } externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" } } testBuildType "debug" }
额外要注意的小细节
- 运行测试前,先确保库模块的debug构建完成——要么手动跑
./gradlew :myLibrary:assembleDebug,要么直接运行测试任务,它会自动触发依赖的构建。 - 要是还是找不到文件,试试清理构建缓存:
./gradlew :myLibrary:clean,然后重新构建测试,有时候缓存会搞鬼。 - 用ndk-stack的时候,要把路径指对,比如针对arm64-v8a架构的符号文件,命令大概是:
ndk-stack -sym MyProject/myLibrary/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a -dump crash_log.txt
内容的提问来源于stack exchange,提问作者fredmaggiowski
相关产品推荐
相关产品推荐

