Android Native C++代码覆盖率统计 Demo(基于NDK 21)
环境
macOS + Android Studio 4.0 + NDK 21.0.6113669
以下内容以64位so + clang为例。如项目涉及gcc,可以再做兼容。
创建一个空白的工程
APP配置
- 在AndroidManifest.xml增加读写权限,否则后续profraw文件无法写入sdcard
- 修改MainActivity:增加jni接口声明、增加按钮用于触发覆盖率dump,具体如下:
Native配置
修改app/src/main/cpp/CMakeLists.txt:增加编译参数。
通过NDK仓库issue得知,等到ndk版本22,lld才会成为默认的ld工具。
目前ndk最新版本为21,所以要加上"-fuse-ld=lld"这句强制指定ld工具,不然启动app时会崩溃(找不到__start___llvm_prf_vnds)
修改app/src/main/cpp/native-lib.cpp,增加 覆盖率初始化 和 覆盖率dump 的实现函数
Sync和Rebuild
执行测试
APP跑起来,点击按钮触发dump
生成报告
- 拉取/sdcard/test.profraw文件到电脑:adb pull /sdcard/test.profraw /tmp/
- 进入ndk工具目录:/Users/<用户名>/Library/Android/sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/darwin-x86_64/bin
- 执行merge命令:./llvm-profdata merge -output=/tmp/demo.profdata /tmp/test.profraw
- 执行报告生成命令:./llvm-cov show <demo项目根目录>/app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so -instr-profile=/tmp/demo.profdata -format=html -output-dir=<生成报告目录路径>