【问题标题】:Native Code coverage with android soong build systemandroid soong 构建系统的原生代码覆盖率
【发布时间】:2019-06-22 15:39:19
【问题描述】:

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

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

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

native_coverage : true,

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

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

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

运行下面的命令会给我每个测试文件的 *.gcda 文件。

adb shell \
    GCOV_PREFIX=/data/local/tmp \
    GCOV_PREFIX_STRIP=`echo $ANDROID_BUILD_TOP | grep -o / | wc -l` \
    /data/local/tmp/unit-tests-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

【问题讨论】:

  • 我也在寻找解决方案,有更新吗?
  • "gcnodir" 实际上是一个 zip 文件,您可以将其解压缩然后获取 .gcno 文件。但我不知道该怎么做。
  • 检查我的答案@Ted

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


【解决方案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 以使 llvm-cov 工作:http://releases.llvm.org/download.html

所有本机单元测试用例,即检测二进制文件都需要在目标上执行。构建和发出 clang 的基于仪表的分析。示例:http://androidxref.com/9.0.0_r3/xref/hardware/interfaces/automotive/vehicle/2.0/default/Android.bp#82(重命名为 vehicle-manager-unit-test 以缩短名称)

  • 导出 NATIVE_COVERAGE=true
  • native_coverage: true添加到Android.bp中的测试模块
  • 转到:模块名称/测试
  • 使用 mm 或 make 命令构建原生二进制文件
  • 例如:对于硬件/接口/汽车/车辆/2.0/default/tests/: mma 或 makevehicle-manager-unit-test -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 *.gcda (https://llvm.org/docs/CommandGuide/llvm-cov.html)

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

  • genhtml cov.info -o output

这是包装所有这些命令的脚本: https://gist.github.com/pankajgangwar/f070b8b54e83543f8e3638dcd2cae1b8

【讨论】:

    【解决方案2】:

    here解释了如何生成覆盖率报告,这需要GTest

    这些flags 启用测试覆盖率的生成:-fprofile-arcs -ftest-coverage

    那么必须使用gcov: gcov main_test.cpp

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

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

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

    $ genhtml main_coverage.info --output-directory out
    

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


    您提供的链接中的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 命令应设置为构建后脚本,以便它们自动生成报告。

    【讨论】:

    • 嗨@Martin,感谢您的回答。我已经尝试过上述解决方案,但从未适用于 Android 生态系统。在使用 AOSP 构建并从 android 设备生成覆盖范围时,我需要知道如何使用 Android.bp 配置模块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2011-09-09
    相关资源
    最近更新 更多