Android 组件依赖对比工具and-deps-diff

1,083 阅读3分钟

android-deps-diff

对比Android工程两个分支的组件依赖差异,并生成报告存档。

背景

Android的组件依赖主要通过Maven来管理依赖,而Maven依赖是可以传递的,
例如:Project A 依赖 libB,libB 依赖 libC,那么当新版libB升级了libC,ProjectA升级了libB之后,可能会出现开发人员对libC的升级并不知情;
会造成以下几个问题:

  • 对于RD,组件库出现非透明的修改或移除;
  • 对于QA,测试覆盖范围遗漏,存在隐藏风险;
  • 组件库间版本冲突、兼容问题;
  • 组件库依赖源头难以定位,组件库被动升级后,难以梳理清导致升级的源头;
  • 组件库升级无记录,无法轻松追溯组件库是在哪个版本被升级;

解决的问题

  • 解决从开发到测试链路中组件依赖变更不透明问题,防止有隐藏问题存在;
  • 归档每个版本组件依赖的变更记录,做到组件升级有记录可查;
  • 可以对依赖元数据进行二次开发,例如:测试团队根据依赖元数据生成需要二轮回归的组件的TODO LIST;
  • 工具具备通用性,其他Android项目也可以0侵入使用此工具;

工具特点

依赖对比工具具备以下几点:

  • 对源码工程0侵入,使用工具时不需要涉及源码工程任何改动;
  • 工具对运行环境的要求低,能在绝大多数平台可以轻松运行,除Android编译和Python环境,不需要额外配置其他的环境;
  • 可以导出依赖信息的元数据,以便其他需求的二次开发;
  • 依赖分析和报告展示分离开,使用C/S架构,以便依赖分析CoreApi修改和报告样式升级互不影响;
  • 可以轻松配置在ci中运行,以及本地运行;

依赖对比报告具备以下几点:

  • 可以导出HTML格式报告,以便在其他框架平台中轻松增加报告超链接或直接展示报告;
  • 报告中可以清晰展示变更、新增、删除、无变更的组件;
  • 报告中可以清晰展示宿主工程最终依赖组件版本的依赖关系;
  • 报告中可以排查组件不同版本的依赖关系及详细信息;

工具基本原理

  • 利用Python开发依赖对比CoreApi,并输出Json格式的元数据;
  • HTML+JS 根据Json元数据进行数据分析和展示,形成依赖对比报告;
  • Gradle 生成每个分支的依赖详细报告,同时保留Json格式的元数据;

工具效果展示

基于https://github.com/iceCola7/WanAndroid 工程对 v1.1.8v1.0.0 生成组件依赖对比报告:
点击查看网页效果

image.png

image.png

使用方式

  1. clone 工程
git clone https://github.com/wei120698598/android-deps-diff.git

执行脚本方式可选方式

  1. 在Terminal中执行
# project_path: 工程路径
# module_name : module名称
# branch_1    : 对比的分支1
# branch_2    : 对比的分支2
# gradle_args : gradle命令参数,-Pxxx=xxx
python diff.py project_path module_name branch_1 branch_2 gradle_args
  1. 配合ci
    除了上面通过命令参数传递,也可以通过环境传递参数;
    如果ci中project_path、module_name、branch_1、branch_2为环境变量,
    可以打开diff.py中代码的注释
diff(os.getenv("project_path"), os.getenv("module_name"), os.getenv("branch_1"), os.getenv("branch_2"), os.getenv("gradle_args"))

Jenkins HTML Report

Jenkins展示HTML Report无法加载CSS、JS 在Build构建流程中增加Execute system Groovy script,执行Groovy command:

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")