android - Android 宋构建系统的 native 代码覆盖率

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

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

我已经扩展了 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",
    ],

native 二进制文件 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

最佳答案

在 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-cov 下载 LLVM 3.8:http://releases.llvm.org/download.html

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

  • export NATIVE_COVERAGE=true
  • native_coverage: true添加到Android.bp中的测试模块
  • 转到:模块名称/测试
  • 使用 mm 或 make 命令构建原生二进制文件
  • 例如:对于 hardware/interfaces/automotive/vehicle/2.0/default/tests/: mma 或 make vehicle-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 外壳\ GCOV_PREFIX=/数据/本地/tmp\ GCOV_PREFIX_STRIP=回显 $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/.(目标文件夹)

  • 从 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 --目录。 --基本目录。 --gcov-tool/usr/bin/gcov-4.6 --capture -o cov.info ( http://ltp.sourceforge.net/coverage/lcov.php )

  • genhtml cov.info -o 输出

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

关于android - Android 宋构建系统的 native 代码覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54422265/

相关文章:

android - USB 键盘 - 在 android 中没有获得相同的扫描代码

android - android :windowBackground and android:colorBackground? 之间的区别

android - 将可渲染节点(相同的旋转、位置和比例)替换为 Sceneform sdk 中的另一个可渲染节点

android - 我的(非 Android)库内部使用的库未包含在 classes.dex 中

java - 缓冲读取器上的 NullPointerException

java - 在 Spring boot 中添加 catch block 的代码覆盖率

ruby rspec 不能与 simplecov 一起使用

security - 访问 `proc` 文件系统以从系统应用程序读取 `/proc/[pid]/some-file`

c++ - Visual Studio TDD 项目的代码覆盖工具

Android AOSP——android源码中扫描间隔和扫描窗口的定义