《增量代码实时染色方案的闭环应用-张留涛.pdf》由会员分享,可在线阅读,更多相关《增量代码实时染色方案的闭环应用-张留涛.pdf(48页珍藏版)》请在三个皮匠报告上搜索。
1、增量代码实时染案的闭环应疆软件部落地经验/Tony Zhang本次都有哪些内容?概览:增量代码实时染案挑战:应对多仓库与多模块流程:与DevOps深度结合闭环:如何在作流中解读报告细节:些典型问题未来:挑战和机遇增量代码实时染案案概览什么是代码染代码染:为代码的运状态做颜标记:部分运绿:已运红:未运为什么要增量增量:精准测试,改什么测什么产品峰期,多达个版本并功能分散,交付质量差,靠QA兜底开发测的质量不稳定,漏测频发法在所有版本全量覆盖QA难以圈定测试例范围开发法确认测试全性可以量化的可以精准判断测试范围的技术段项 体量 功能多 全量测 成本当时临的现状问题归因解法为什么要增量基本流程概览演
2、示CompileRuntimeReport成插桩包成染数据成染报告输?输出报告源码字节码染数据JACOCOXML/HTMLCompileCompileRuntimeCompileRuntimeReport插桩产染数据产格式化报告收获 了解DIFF过程了解插桩过程了解插桩之后的字节码收获 了解染数据的收集过程了解染数据的上报过程了解染数据的件结构收获 了解染数据的应了解染数据的合并策略了解报告产的基本过程了解报告的实际运Compile阶段详解应对多仓库与多模块流程概览提取Git信息进DIFF插桩提取Git信息程Git Repo程Git Repo 1Git Repo 2Git Repo Nproj
3、ect 1project 2project 3project 4project Nsource_tree.jsonrepoUrlprojectListkeyvalueMAPgit ls-remote-get-url origingit rev-parse HEAD获得repoUrl获得Commit ID增量信息提取 Git diffrepoA.diff当前 commit ID对 commit IDgit diff and 写件modified files-和 a 代表对件+和 b 代表当前件“+”代表新增/修改“-”代表删除“”是差异结-1,12 源件第1开始的12+1,34 标件第1开始的3
4、4GIT DIFF 是基于本的对,核算法:求最公共序列得到 MapString,Set KEY:每个被修改的件 VALUE:新增的代码数数组正则解析两个产物:增量字节码+源码遍历 projectListval sourceMatches:MutableList by lazy /需要优先检测是否有src/main,如果没有再去检测src mutableListOf(/src/main/java,/src/main/kotlin,/src)val classMatches:MutableList by lazy mutableListOf(/intermediates/javac/,/tmp/k
5、otlin-classes/)字节码检索录源检索录git_dirs.json应DIFF信息增量插桩注字节码Transform Apioverride fun getInputTypes():MutableSet?return TransformManager.CONTENT_CLASSoverride fun getScopes():MutableSet return TransformManager.SCOPE_FULL_PROJECToverride fun isIncremental():Boolean return trueoverride fun transform(transfor
6、mInvocation:TransformInvocation)val instr=Instrumenter(OfflineInstrumentationAccessGenerator()val instrumented=instr.instrument(is,fileIn.name)os.write(instrumented).class 到 dex阶段定义输类型定义作范围是否持增量接收输的件,.class 和 jar两种类型 在此进字节码插桩识别修改的类,节约编译时间 单个类是全量插桩从 1.5.0-beta1 开始,Gradle 插件包含个 Transform API,允许 3rd 插件
7、在将编译的.class 类件转换为 dex 件之前对其进操作。多个Transform之间是串的,上个的输出作为下个的输。TASK:transformClassesWithJacocoInstrumentationForDebug欣赏下插桩后的字节码Compile阶段回顾source_tree.json.diffgit_dirs.jsonrepo url 仓库地址 commit id 提交索引git diff 源码修改信息bins 增量字节码件 src dirs 源码录任何迭代都会成,于随时被对染包迭代才会成,作为成报告时的输code_coverage_inputs.zip打包备 ZipClas
8、sesTask经过Compile,我们都得到了哪些产物?输?输出报告源码字节码染数据JACOCOXML/HTMLCompileCompileRuntimeRuntime阶段与Report阶段详解与DevOps深度结合在DevOps中的结合点览染数据上传染数据合并染报告定制作为提测卡点在DevOps中的结合点览染数据上传染数据合并染报告定制作为提测卡点外场测试处于状态,需在应中主动触发在DevOps中的结合点览染数据上传染数据合并染报告定制作为提测卡点外场测试处于状态,需在应中主动触发单版本内的数据可合并,多版本的数据可合并在DevOps中的结合点览染数据上传染数据合并染报告定制作为提测卡点外场
9、测试处于状态,需在应中主动触发单版本内的数据可合并,多版本的数据可合并结合项定制,级覆盖率统计,按仓库统计在DevOps中的结合点览染数据上传染数据合并染报告定制作为提测卡点新增代码覆盖率准出标准=90%外场测试处于状态,需在应中主动触发单版本内的数据可合并,多版本的数据可合并结合项定制,级覆盖率统计,按仓库统计回顾数据产与上传流程数据产1 法体开始,先去获取探针3 若则创建,三个参数classID、className、探针个数2 若有则返回4 为探针赋值,运过则标记为true每个类持有个boolean数组,内部类会有单独的数组离线模式类,由注代码直接调获取boolean 代理类,可以配置输出
10、模式,如写件或Socket,并且负责IExecutionDataVisitor ISessionInfoVisitor 的实现,组装EC件持有classId、className、probes 数据,个类对应个ExecutionData多个类的数据存储于HashMap中,key为classId染件.ec 的样六进制展示件结构展示-486980237117185957Lcom/dji/./MainActivity41-486980237114326524Lcom/dji/./OtherActivity68染数据上传初始化SDK,传packInfoId,与团结绑定在合适的时机存储并上传所有类的染数据
11、利gradlew-P 传递关键参数init 初始化时创建染件名 次启动只有个件利Gradle Plugin SDK动注将所有类的探针写件 多次写不会覆盖输?输出报告源码字节码染数据JACOCOXML/HTMLCompileCompileRuntime报告产准备AndroidCoverageReportApp 专来成报告的项染数据增量字节码源码+录团结染后端2.拉取3.传参ReportTask4.执1.上传CI 服务器Android Device染服务器报告产流程1 解析所有类的染数据&合并2 通过ASM和DIFF数据找到未修改的3 忽略掉未修改的染数据合并1 解析出单个数据2 存在则merge
12、3 兼容性判断4 取或运算输出报告源码字节码染数据JACOCOXML/HTMLCompileCompileRuntime如何在作流中解读报告报告解读我们关注什么 1.总项的覆盖率 提测卡点指标2.仓库的覆盖率 拆解到组3.件的覆盖率 拆解到个报告解读我们关注什么 1.总项的覆盖率 提测卡点指标2.仓库的覆盖率 拆解到组3.件的覆盖率 拆解到个染报告分析会议会议发起流程未覆盖的情况分类 1.插件bug,执了但是未染2.可增加测试进覆盖3.法通过测试覆盖,可增加单测覆盖4.认为需覆盖,且不对质量有任何影响兼容AAR、混淆的影响些典型问题兼容AAR如何在编译阶段得到 AAR 的 Git Repo 信
13、息呢?override fun getInputTypes():MutableSet returnTransformManager.CONTENT_RESOURCES Transform Api只有在resources录下的资源才能打进jar,并在transform中拿到,AAR其他位置存放资源法获得Inline法法被染?字节码中引关系Kotlin官染具:Kotlinx-koverInline法被编译后什么样混淆会影响报告吗?DesugarMergeJavaResCustom TransformsMergeClassesProfiling TransformsCheckDuplicateClassesJavaCodeShrinkerTransformResourcesShrinkerDexSplitterR8 or PROGUARD不会未来的挑战与机遇挑战智能的统计和任务分派智能的识别和剔除需测试的代码C+代码越来越多,需要融合基于Clang的染案机遇有效提升质量作的效搭配动化测试,将例和变更有效关联