Android9.0添加gtest单元测试和使用lcov覆盖率问题

前言,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 */


版权声明:本文为gaoyuekang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。