| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 从精准化测试看ASM在Android中的强势插入-JaCoco初探,复习指南 -> 正文阅读 |
|
[移动开发]从精准化测试看ASM在Android中的强势插入-JaCoco初探,复习指南 |
官网镇楼 https://www.eclemma.org/jacoco/ 从官网上就能看出这是一个极具历史感的项目。最后生成的覆盖率文件,是在 源代码的基础上,用颜色标记不同的执行状态。 在上面这张图中,绿色代表已执行, 红色代表未执行, 黄色代表执行了一部分,这样就可以算出代码的覆盖率数据。 JaCoco默认的插桩方式是全部插桩,在Android项目中,要使用JaCoco的全量报表功能非常简单,因为JaCoco插件已经集成在Gradle中了,所以我们只需要开启JaCoco即可。 首先,在根目录gradle文件中加入JaCoco的依赖
然后在App的gradle文件中增加插件的依赖。 apply plugin: ‘jacoco’ 并在android标签中,增加开关。 testCoverageEnabled = true 接下来引入JaCoco的Report模块,同时exclude掉core,因为其在gradle中已经有依赖了。 implementation(‘org.jacoco:org.jacoco.report:0.8.4’) { exclude group: ‘org.jacoco’, module: ‘org.jacoco.core’ } 创建生成Report的Task def coverageSourceDirs = [’…/xxxx/src/main/java’] task jacocoTestReport(type: JacocoReport) { group = “Reporting” description = “Generate Jacoco coverage reports after running tests.” reports { xml.enabled = true html.enabled = true } classDirectories.setFrom(fileTree( dir: ‘./build/intermediates/javac/xxxxx’, excludes: [’**/R*.class’])) sourceDirectories.setFrom(files(coverageSourceDirs)) executionData.setFrom(files("$buildDir/outp
uts/code-coverage/connected/coverage.exec")) doFirst {new File("$buildDir/intermediates/javac/masterDebug/classes/com/qidian/QDReader").eachFileRecurse { file -> if (file.name.contains(’$$’)) { file.renameTo(file.path.replace(’$ ′ , ′ ', ' ′,′’)) } } } } 在项目中合适的地方来调用这两个方法,分别用来创建JaCoco的Exec文件和写入Exec文件。 private void createExecFile() { String DEFAULT_COVERAGE_FILE_PATH = “/mnt/sdcard/” + getPackageName(); String DEFAULT_COVERAGE_FILE = DEFAULT_COVERAGE_FILE_PATH + “/coverage.ec”; File file_path = new File(DEFAULT_COVERAGE_FILE_PATH); File file = new File(DEFAULT_COVERAGE_FILE); Log.d(TAG, "file_path = " + file_path); if (!file.exists()) { try { file_path.mkdirs(); file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } } private void writeExecFile() { OutputStream out = null; try { out = new FileOutputStream("/mnt/sdcard/" + getPackageName() + “/coverage.ec”, true); Object agent = Class.forName(“org.jacoco.agent.rt.RT”) .getMethod(“getAgent”) .invoke(null); out.write((byte[]) agent.getClass().getMethod(“getExecutionData”, boolean.class) .invoke(agent, false)); } catch (Exception e) { Log.d(TAG, e.toString(), e); e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:42:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |