Android Soong构建系统的本机代码覆盖率

时间:2019-01-29 13:32:47

标签: android code-coverage android-source gcov android-soong

我正在尝试使用soong构建系统使用AOSP源代码为本机组件生成代码覆盖率报告。

我扩展了aosp vhal,但是单元测试用例与下面的链接相同。 http://androidxref.com/8.1.0_r33/xref/hardware/interfaces/automotive/vehicle/2.0/default/tests/

尝试将以下内容添加到android中的cc_test和cc_binary.bp

Subscription

本机二进制文件 units-tests-coverage 是在out / target / product中生成的,但我找不到 gcno 的中间体。

在以下命令中运行会为我提供每个测试文件的* .gcda文件。

native_coverage : true,

    cflags: [
         "-g",
         "-O0",
         "-fprofile-arcs",
         "-ftest-coverage",
    ],

     ldflags : [
        "-fprofile-arcs",
        "-ftest-coverage",
    ],

我尝试了以下链接,但不确定如何进行:(

http://logan.tw/posts/2015/04/28/check-code-coverage-with-clang-and-lcov/ https://android.googlesource.com/platform/bionic.git/+/master-soong https://android.googlesource.com/platform/build/soong/+/581341d%5E%21/ https://android.googlesource.com/platform/external/e2fsprogs/+/fedfb27%5E%21/ https://android.googlesource.com/platform/development/+/master/scripts/acov#23 http://androidxref.com/9.0.0_r3/xref/bionic/README.md#293

我不确定是否可以在这里使用Google的vts框架来生成本机代码覆盖率。 https://codelabs.developers.google.com/codelabs/android-vts-8/#6

gcnodir ”已生成,但不确定如何使用它。 /coverage/data/nativetest64/vehicle-unit-tests-coverage/unit-tests-coverage.gcnodir

2 个答案:

答案 0 :(得分:1)

在SO上为其他用户发布我的问题的答案。

安装覆盖率工具:

  1. sudo apt-get install lcov(这应该安装lcov-1.12)
  2. sudo apt-get install gcc-4.6(Clang生成的.gcno近似等于gcc 4.2,不兼容 使用gcov-4.8。安装gcc-4.6以获得gcov-4.6并使用'--gcov-tool /usr/bin/gcov-4.6'调用lcov)
  3. 下载LLVM 3.8 for llvm-cov可以工作:http://releases.llvm.org/download.html

所有本机单元测试用例(即,已检测二进制文件)都需要在目标上执行。构建和发出基于c的检测的配置文件。示例:http://androidxref.com/9.0.0_r3/xref/hardware/interfaces/automotive/vehicle/2.0/default/Android.bp#82(更名为“ manager-unit-test”)

  • 导出NATIVE_COVERAGE = true
  • 添加native_coverage: true以在Android.bp中测试模块
  • 转到:模块名称/测试
  • 使用mm或make命令构建本机二进制文件
  • 例如:对于硬件/接口/汽车/车辆/2.0/默认/测试/: mma或进行车辆管理器单元测试-j32
  • 将覆盖率范围内的已检测二进制文件复制到目标
  • adb push out/target/product/product_name/data/nativetest64/vendor/vehicle-manager-unit-test /data/nativetest64/vehicle-manager-unit-test adb shell chmod +x /data/nativetest64/vehicle-manager-unit-test

  • 运行测试用例并生成.gcda文件

    adb shell \ GCOV_PREFIX=/data/local/tmp \ GCOV_PREFIX_STRIP=echo $ANDROID_BUILD_TOP | grep -o / | wc -l \ /data/nativetest64/vehicle-manager-unit-test

  • adb shell find -iname *.gcda

  • adb pull /data/local/tmp/proc/self/cwd/out/soong/.intermediates/hardware/interfaces/automotive/vehicle/2.0/default/vehicle-manager-unit-test/android_x86_64_silvermont_vendor_cov/obj/hardware/interfaces/automotive/vehicle/2.0/default/tests/ .(Destination folder)

  • 从GCNODIR提取GCNO文件(在 out / overage / data / nativetest64 / vendor / vehicle-manager-unit-test)到 包含GCDA文件的文件夹

  • llvm-cov gcov -f -b *.gcdahttps://llvm.org/docs/CommandGuide/llvm-cov.html

  • lcov --directory . --base-directory . --gcov-tool /usr/bin/gcov-4.6 --capture -o cov.infohttp://ltp.sourceforge.net/coverage/lcov.php

  • genhtml cov.info -o output

sample coverage report for vhal 2.0 这是包装所有这些命令的脚本: https://gist.github.com/pankajgangwar/f070b8b54e83543f8e3638dcd2cae1b8

答案 1 :(得分:0)

here说明了如何生成覆盖率报告,但确实需要GTest

这些flags可以生成测试覆盖率:-fprofile-arcs -ftest-coverage

然后必须使用gcovgcov main_test.cpp

然后可以将其输出传递到lcov(对于reference):

$ lcov --coverage --directory . --output-file main_coverage.info

可以从中生成lcov格式的HTML覆盖率报告:

$ genhtml main_coverage.info --output-directory out

.gcnodir中的这些.gcda文件是gcov数据文件。 gcov还有一个输出选项--json-format,当想要通过Web服务使用coverage数据时,该选项可能会派上用场。


您提供的链接中的

one of the examples可用于为整个项目生成它:

收集代码覆盖率结果:

$ lcov --directory . \
   --base-directory . \
   --gcov-tool gcov.sh \
   --capture -o cov.info

生成HTML文件:

$ genhtml cov.info -o output

唯一的区别是,需要调整包装脚本以调用gcov。也许甚至可以忽略通过选项--gcov-tool传递的包装器,因为应该直接调用它。


由于只能通过添加编译器标志来准备覆盖率报告,因此应将gcovlcov命令设置为构建后脚本,以便它们可以自动生成报告。