本机代码覆盖与android soong构建系统

Pan*_*kaj 6 android code-coverage gcov android-source android-soong

我正在尝试使用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",
    ],
Run Code Online (Sandbox Code Playgroud)

本地二进制单元测试覆盖是在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
Run Code Online (Sandbox Code Playgroud)

我试过下面的链接,但不知道如何继续:(

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

我不确定谷歌的vts框架是否可用于生成本机代码覆盖. https://codelabs.developers.google.com/codelabs/android-vts-8/#6

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

Pan*_*kaj 4

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

安装覆盖工具:

  1. sudo apt-get install lcov(这应该安装 lcov-1.12)
  2. sudo apt-get install gcc-4.6(Clang 生成大约等于 gcc 4.2 的 .gcno,但与 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)

  • 将 GCNO 文件从 GCNODIR (在 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

vhal 2.0 的样本覆盖率报告 这是包装所有这些命令的脚本: https://gist.github.com/pankajgangwar/f070b8b54e83543f8e3638dcd2cae1b8