HarmonyOS 鸿蒙Next中如何获取C++代码覆盖率
HarmonyOS 鸿蒙Next中如何获取C++代码覆盖率 参考 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-instrument-test
对CMakeList.txt进行修改
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")
CPP代码里面也增加
char filename[256];
snprintf(filename, sizeof(filename), "/data/storage/el2/base/c++_coverage.profraw"); // 覆盖率报告文件路径和文件名,不可修改
__llvm_profile_set_filename(filename);
...
__llvm_profile_write_file();
通过nm命令也可以查询到编译器插桩成功了

但是hap运行页面展示后,通过调试确认自己相关的函数已经执行完毕,
但是在手机上找不到这个文件

更多关于HarmonyOS 鸿蒙Next中如何获取C++代码覆盖率的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者您好,
【解决方案】
ls命令可以使用ls /data/app/el2/100/base/包名/c++_coverage.profraw,包名替换为自己应用包名,关于应用沙箱路径和真实物理路径的对应关系可以参考:对应关系。
【背景知识】
应用沙箱是一种以安全防护为目的的隔离机制,避免数据受到恶意路径穿越访问。在这种沙箱的保护机制下,应用可见的目录范围即为“应用沙箱目录”。在应用沙箱路径下读写文件,经过映射转换,实际读写的是真实物理路径中的应用文件,应用沙箱路径与真实物理路径对应关系参考:对应关系。
更多关于HarmonyOS 鸿蒙Next中如何获取C++代码覆盖率的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
是不是这个文件被隐藏了呢,也有可能是权限不足导致的
在HarmonyOS Next中获取C++代码覆盖率,可通过ArkTS/JS调用Native C++接口实现。使用GCC/Clang的--coverage选项编译C++代码,生成.gcno文件。运行测试后生成.gcda文件,通过gcov工具生成覆盖率报告。具体步骤包括:配置Native工程编译选项,集成覆盖率收集库,执行测试用例,最后使用lcov或gcovr生成HTML格式报告。
在HarmonyOS Next中获取C++代码覆盖率,你已正确配置了编译插桩和代码中的覆盖率文件生成逻辑。根据你的描述,插桩成功但未生成c++_coverage.profraw文件,这通常是由于应用权限或文件路径访问问题导致的。
关键点在于:HarmonyOS Next的应用沙箱机制限制了文件访问。你使用的路径/data/storage/el2/base/是应用沙箱内的私有目录,但__llvm_profile_write_file()在默认情况下可能无法直接写入此位置,或需要显式权限。
解决方案:
-
确认并申请文件访问权限:
- 在
module.json5文件中,确保已声明必要的文件访问权限。例如,添加"requestPermissions"字段:
{ "module": { "requestPermissions": [ { "name": "ohos.permission.FILE_ACCESS_PERSIST", "reason": "用于保存代码覆盖率数据", "usedScene": { "abilities": [ "你的Ability名" ], "when": "always" } } ] } } - 在
-
使用正确的沙箱路径:
- 建议使用HarmonyOS提供的上下文(Context)来获取应用沙箱内的有效文件路径,确保可写。例如,在C++中通过Native API调用或通过ArkTS/JS侧传递路径:
// 假设从ArkTS侧获取到可写的沙箱路径,并通过Native接口传递到C++ // C++侧接收该路径并用于设置文件名 extern "C" void SetCoveragePath(const char* path) { __llvm_profile_set_filename(path); }- 在ArkTS侧,使用
context.filesDir(应用文件目录)或context.cacheDir(缓存目录)来构造一个可写的绝对路径,然后通过FFI(Foreign Function Interface)传递给C++代码。
-
确保文件写入时机:
- 在应用退出或覆盖率数据收集完成后,再调用
__llvm_profile_write_file()。可以考虑在aboutToTerminate生命周期或特定的测试结束点调用。
- 在应用退出或覆盖率数据收集完成后,再调用
-
验证文件是否生成:
- 写入文件后,可以通过
hilog打印日志确认是否执行成功,或尝试读取该文件验证是否存在。
- 写入文件后,可以通过
完成以上步骤后,覆盖率文件应能正常生成。之后,你可以将.profraw文件从设备中导出,在开发环境中使用llvm-profdata和llvm-cov工具生成可视化的覆盖率报告。

