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命令也可以查询到编译器插桩成功了

cke_12142.png

但是hap运行页面展示后,通过调试确认自己相关的函数已经执行完毕,

但是在手机上找不到这个文件

cke_28419.png


更多关于HarmonyOS 鸿蒙Next中如何获取C++代码覆盖率的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

开发者您好,

【解决方案】

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工程编译选项,集成覆盖率收集库,执行测试用例,最后使用lcovgcovr生成HTML格式报告。

在HarmonyOS Next中获取C++代码覆盖率,你已正确配置了编译插桩和代码中的覆盖率文件生成逻辑。根据你的描述,插桩成功但未生成c++_coverage.profraw文件,这通常是由于应用权限或文件路径访问问题导致的。

关键点在于:HarmonyOS Next的应用沙箱机制限制了文件访问。你使用的路径/data/storage/el2/base/是应用沙箱内的私有目录,但__llvm_profile_write_file()在默认情况下可能无法直接写入此位置,或需要显式权限。

解决方案:

  1. 确认并申请文件访问权限

    • module.json5文件中,确保已声明必要的文件访问权限。例如,添加"requestPermissions"字段:
    {
      "module": {
        "requestPermissions": [
          {
            "name": "ohos.permission.FILE_ACCESS_PERSIST",
            "reason": "用于保存代码覆盖率数据",
            "usedScene": {
              "abilities": [
                "你的Ability名"
              ],
              "when": "always"
            }
          }
        ]
      }
    }
    
  2. 使用正确的沙箱路径

    • 建议使用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++代码。
  3. 确保文件写入时机

    • 在应用退出或覆盖率数据收集完成后,再调用__llvm_profile_write_file()。可以考虑在aboutToTerminate生命周期或特定的测试结束点调用。
  4. 验证文件是否生成

    • 写入文件后,可以通过hilog打印日志确认是否执行成功,或尝试读取该文件验证是否存在。

完成以上步骤后,覆盖率文件应能正常生成。之后,你可以将.profraw文件从设备中导出,在开发环境中使用llvm-profdatallvm-cov工具生成可视化的覆盖率报告。

回到顶部