整体参考 developer.huawei.com/consumer/cn…
构建方法
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-instr-generate")
如果依赖第三方库
三方源码路径注意下,最好别放到工程外的路径(也可以使用静态链接方式)
add_library(XXXX STATIC ${SRC_FILES})
或者放到third_party目录下
entry/src/main/cpp/
├── CMakeLists.txt # 总控构建脚本
├── build-profile.json5
├── index.cpp # NAPI 桥接代码
├── my_module/ # 你自己的业务逻辑
│ ├── src/
│ └── include/
└── third_party/ # 【新增】第三方库源码目录
└── ThirdPartyLib/ # 假设这是解压后的源码
├── CMakeLists.txt # (可选) 如果它自带 CMake
├── src/
│ ├── lib_core.cpp
│ └── ...
└── include/
└── lib_core.h
由于hap在启动的后不会正常退出,导致覆盖率信息文件没有生成
char filename[256];
snprintf(filename, sizeof(filename), "/data/storage/el2/base/c++_coverage.profraw"); // 覆盖率报告文件路径和文件名,不可修改
__llvm_profile_set_filename(filename);
...
__llvm_profile_write_file();
重点是__llvm_profile_write_file(); 需要在确认所有C++代码执行结束的地方粘贴。
查看代码覆盖率
由于hap是在沙箱机制运行,/data/storage/el2/base/c++_coverage.profraw实际对应的路径是
/data/app/el2/100/base/com.xxxx.xxxx 目录下生成c++_coverage.profraw
hdc file recv /data/app/el2/100/base/com.xxxx.xxxx/c++_coverage.profraw
export PATH=/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native/llvm/bin:$PATH
llvm-profdata merge -spare --output=cov.profdata c++_coverage.profraw
llvm-cov show <your_path>/libentry.so -instr-profile=cov.profdata -format=html -output-dir=report_folder
如果想换成lcov的
llvm-cov export -format=lcov -instr-profile=coverage.profdata <your_path>/libentry.so > coverage.info
genhtml -o cov_dir coverage.info --ignore-errors inconsistent --ignore-errors corrupt