前言,Android的NDK编译原理,其实就是使用clang执行的C++编译。
下面是在AndroidStudio工程中如何添加gtest单元测试和使用lcov工具以及生成覆盖率报告
1. 编译AOSP/LINUX/android/external/googletest。确保通过
2. 在各自工程目录下创建test目录
3. test目录下创建Android.mk 和 Application.mk文件
## [Android.mk] 结构如下:
#####################################
LOCAL_PATH := $(call my-dir)
PRJ_INC_PATH += $(LOCAL_PATH)/xxx // 1这是源代码头文件目录,当前目录为创建的test目录
include $(CLEAR_VARS)
LOCAL_MODULE := xxxtest // 2自定义的可执行程序文件名
LOCAL_SRC_FILES := test/test_case.cpp
LOCAL_SRC_FILES += cpp/mtest.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/xxx // 3同注释1
LOCAL_STATIC_LIBRARIES := libgtest // *必写项
LOCAL_CFLAGS := --coverage // *必写项
LOCAL_LDFLAGS := --coverage // *必写项
include $(BUILD_EXECUTABLE)
## [Application.mk] 结构如下:
#####################################
APP_STL := c++_static
APP_OPTIM := debug
4. 修改 build.gradle 新增如下选项:
defaultConfig中添加:
externalNativeBuild {
ndkBuild {
cppFlags "-std=c++14" // 可看需求改为 c++11 等
}
}
android 中添加
externalNativeBuild {
ndkBuild {
path 'xxx/xxx/Android.mk'
}
}
完整如下:
android {
compileSdkVersion 29
buildToolsVersion "29.0.0"
defaultConfig {
applicationId "com.mygtest.mygtestapplication"
minSdkVersion 28
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
ndkBuild {
cppFlags "-std=c++14"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
ndkBuild {
path 'src/main/Android.mk'
}
}
}
5. 编译生成可执行文件
进入/home/xxx/LINUX/android 目录,依次执行
source build/envsetup.sh
lunch 61 后,进入AOSP编译环境
执行:mmm *第3步添加的Android.mk文件所在目录*
例如:mmm vendor/madison/packages/apps/MyGtestApplication/app/src/main
编译完成后,会在out/target/product/yebisu/system/bin/目录下生成 *可执行程序文件名*的可执行文件。
6. 将生成的可执行文件 push 进虚拟机,执行命令如下:
adb root; adb remount
adb push out/target/product/yebisu/system/bin/*可执行程序文件名称* /data
adb shell /data/*可执行程序文件名称*
adb pull /out/target/product/yebisu/obj/EXECUTABLES/*可执行程序文件名称*_intermediates out/target/product/yebisu/obj/EXECUTABLES/*可执行程序文件名称*_intermediates
7. 生成*.info文件
前提:{
1)进入本地计算机的/usr/bin目录,新建 llvm-cov.sh 文件,
sudo vi llvm-cov.sh 输入如下内容:
#!/bin/bash
exec /home/*本地计算机AOSP代码所在目录*/LINUX/android/prebuilts/clang/host/linux-x86/clang-4691093/bin/llvm-cov gcov "$@"
注:上面语句中的空格 不可以省略。
ESC shift+:wq enter。
2)下载lcov源码。下载lcov:http://ltp.sourceforge.net/coverage/lcov.php,有rpm包和源码包。(以源码包为例)
解压lcov-x.xx.tar.gz,进入源码包,执行vi bin/geninfo
找到 [our $gcov_tool = "gcov";] 这一行,将双引号后面的内容替换为 "llvm-cov.sh" 保存退出。
执行 sudo make install
}
进入/home/AOSP/LINUX/android/out/target/product/yebisu/obj/EXECUTABLES/*可执行程序文件名称*_intermediates 目录
执行生成*.info文件命令:
sudo lcov -d . -t *name* -o *name.info* -b . -c
例如:sudo lcov -d . -t myinfo -o myinfo.info -b . -c
8. 生成html文件
执行命令 genhtml -o result *.info。
例如: genhtml -o result myinfo.info
生成物在当前目录下的result目录中。双击打开index.html 即可看到测试覆盖率。
/* END */