我正在尝试使用 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 上为其他用户发布我的问题的答案。
安装覆盖工具:
sudo apt-get install lcov
(这应该安装 lcov-1.12)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)- 为 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 输出
这是包装所有这些命令的脚本: https://gist.github.com/pankajgangwar/f070b8b54e83543f8e3638dcd2cae1b8
关于android - Android 宋构建系统的 native 代码覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54422265/