使用Android NDK的本机代码的代码覆盖率

时间:2017-12-30 10:43:11

标签: android android-ndk clang code-coverage

我正在使用Android NDK r16为我的Android项目构建我的本机代码。我希望能够获得我的原生单元测试的代码覆盖率。这可能吗?

根据我的研究,似乎Android默认情况下不提供此功能,我们需要在Clang中使用自定义编译器/链接器标志(-fprofile-arcs -ftest-coverage)。

我发现以下文章似乎很有希望。 http://logan.tw/posts/2015/04/28/check-code-coverage-with-clang-and-lcov/

但是,它与Android无关。我真的希望有一篇专门针对Android的文章,并证明可以使用最新的NDK / CMake工具。

有人知道这样的文章吗?

1 个答案:

答案 0 :(得分:0)

[将此视为评论我会在澄清后删除它以遵守网站指南]

我可以跟进这个的确切实施吗?我正在尝试使用ndk 14b和CMake完成相同的过程。我们对原生图层进行了单元测试,但无法从测试运行中提取任何覆盖率指标。

在cmakeList.txt文件中设置所描述的标志,如下所示,遗憾的是为先前构建的项目引入了未定义的引用错误。

CMake的

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage -fprofile-arcs -ftest-coverage")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage -fprofile-arcs -ftest-coverage")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage -fprofile-arcs -ftest-coverage")

ERROR:

[3/3] Linking CXX shared library ../../../../build/intermediates/cmake/project/debug/obj/armeabi/libscanhwl_camif.so
  FAILED: : && /home/user/tools/android-ndk-r14b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++  --target=armv5te-none-linux-androideabi --gcc-toolchain=/home/user/tools/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 --sysroot=/home/user/tools/android-ndk-r14b/sysroot -fPIC -isystem /home/user/tools/android-ndk-r14b/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=19 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -D__STDC_FORMAT_MACROS  -fexceptions -frtti --coverage -fprofile-arcs -ftest-coverage -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot /home/user/tools/android-ndk-r14b/platforms/android-19/arch-arm -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libscanhwl_camif.so -o <This was a list of files> -latomic -lm "/home/user/tools/android-ndk-r14b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/libgnustl_static.a" && :
  out/stage2/soong/ndk/sysroot/usr/include/string.h:348: error: undefined reference to '__strncpy_chk2'
  clang++: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.

这些标志是否需要在别处定义?或者我完全偏离某个地方?