Android Native C++代码覆盖率统计 Demo(基于NDK 21)

环境

macOS + Android Studio 4.0 + NDK 21.0.6113669

以下内容以64位so + clang为例。如项目涉及gcc,可以再做兼容。

 

创建一个空白的工程

Android Native C++代码覆盖率统计 Demo(基于NDK 21)

 

Android Native C++代码覆盖率统计 Demo(基于NDK 21)

 

Android Native C++代码覆盖率统计 Demo(基于NDK 21)

 

APP配置

  1. 在AndroidManifest.xml增加读写权限,否则后续profraw文件无法写入sdcard
  2. 修改MainActivity:增加jni接口声明、增加按钮用于触发覆盖率dump,具体如下:

Android Native C++代码覆盖率统计 Demo(基于NDK 21)

 

Native配置

修改app/src/main/cpp/CMakeLists.txt:增加编译参数。

通过NDK仓库issue得知,等到ndk版本22,lld才会成为默认的ld工具。

目前ndk最新版本为21,所以要加上"-fuse-ld=lld"这句强制指定ld工具,不然启动app时会崩溃(找不到__start___llvm_prf_vnds)

Android Native C++代码覆盖率统计 Demo(基于NDK 21)

修改app/src/main/cpp/native-lib.cpp,增加 覆盖率初始化 和 覆盖率dump 的实现函数

Android Native C++代码覆盖率统计 Demo(基于NDK 21)

 

Sync和Rebuild

 

执行测试

APP跑起来,点击按钮触发dump

 

生成报告

  1. 拉取/sdcard/test.profraw文件到电脑:adb pull /sdcard/test.profraw /tmp/
  2. 进入ndk工具目录:/Users/<用户名>/Library/Android/sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/darwin-x86_64/bin
  3. 执行merge命令:./llvm-profdata merge -output=/tmp/demo.profdata /tmp/test.profraw
  4. 执行报告生成命令:./llvm-cov show <demo项目根目录>/app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so -instr-profile=/tmp/demo.profdata -format=html -output-dir=<生成报告目录路径>