android soong 构建系统的本机代码覆盖率
Native Code coverage with android soong build system
我正在尝试使用 soong 构建系统使用 AOSP 源代码为我的本机组件生成代码覆盖率报告。
我已经扩展了 aosp vhal,但单元测试用例与下面的相同 link。
http://androidxref.com/8.1.0_r33/xref/hardware/interfaces/automotive/vehicle/2.0/default/tests/
尝试将以下添加到 cc_test、cc_binary 到 Android.bp
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
我已经尝试了 links 但不确定如何继续:(
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
here it is explaned how to generate coverage reports, which do require GTest:
这些 flags 启用测试覆盖率的生成:-fprofile-arcs -ftest-coverage
然后必须使用 gcov: gcov main_test.cpp
然后可以将其输出传递给 lcov (for 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
传递的包装器,因为它应该被直接调用。
因为只能通过添加编译器标志来准备覆盖率报告,所以 gcov
和 lcov
命令应该设置为 post-build 脚本,这样它们会自动生成报告。
在 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 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中的测试模块
- 转到:module-name/test
- 使用 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 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
我正在尝试使用 soong 构建系统使用 AOSP 源代码为我的本机组件生成代码覆盖率报告。
我已经扩展了 aosp vhal,但单元测试用例与下面的相同 link。 http://androidxref.com/8.1.0_r33/xref/hardware/interfaces/automotive/vehicle/2.0/default/tests/
尝试将以下添加到 cc_test、cc_binary 到 Android.bp
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
我已经尝试了 links 但不确定如何继续:(
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
here it is explaned how to generate coverage reports, which do require GTest:
这些 flags 启用测试覆盖率的生成:-fprofile-arcs -ftest-coverage
然后必须使用 gcov: gcov main_test.cpp
然后可以将其输出传递给 lcov (for 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
传递的包装器,因为它应该被直接调用。
因为只能通过添加编译器标志来准备覆盖率报告,所以 gcov
和 lcov
命令应该设置为 post-build 脚本,这样它们会自动生成报告。
在 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 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中的测试模块 - 转到:module-name/test
- 使用 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 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