当前位置: 首页 > news >正文

Android studio 工程的 module 依赖关系图绘制 、 Android Module 依赖关系的可视化实现

整体步骤:

  • 1、利用gradle脚本生成dot;

  • 2、利用graphviz将dot可视化转为图片

利用gradle脚本生成dot

下载projectDependencyGraph.gradle脚本

下载 projectDependencyGraph.gradle ,放在项目根目录,

源码如下:

task projectDependencyGraph {doLast {def dot = new File(rootProject.buildDir, 'reports/dependency-graph/project.dot')dot.parentFile.mkdirs()dot.delete()dot << 'digraph {\n'dot << "  graph [label=\"${rootProject.name}\\n \",labelloc=t,fontsize=30,ranksep=1.4];\n"dot << '  node [style=filled, fillcolor="#bbbbbb"];\n'dot << '  rankdir=TB;\n'def rootProjects = []def queue = [rootProject]while (!queue.isEmpty()) {def project = queue.remove(0)rootProjects.add(project)queue.addAll(project.childProjects.values())}def projects = new LinkedHashSet<Project>()def dependencies = new LinkedHashMap<Tuple2<Project, Project>, List<String>>()def multiplatformProjects = []def jsProjects = []def androidProjects = []def javaProjects = []queue = [rootProject]while (!queue.isEmpty()) {def project = queue.remove(0)queue.addAll(project.childProjects.values())if (project.plugins.hasPlugin('org.jetbrains.kotlin.multiplatform')) {multiplatformProjects.add(project)}if (project.plugins.hasPlugin('org.jetbrains.kotlin.js')) {jsProjects.add(project)}if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) {androidProjects.add(project)}if (project.plugins.hasPlugin('java-library') || project.plugins.hasPlugin('java')) {javaProjects.add(project)}project.configurations.all { config ->config.dependencies.withType(ProjectDependency).collect { it.dependencyProject }.each { dependency ->projects.add(project)projects.add(dependency)rootProjects.remove(dependency)def graphKey = new Tuple2<Project, Project>(project, dependency)def traits = dependencies.computeIfAbsent(graphKey) { new ArrayList<String>() }if (config.name.toLowerCase().endsWith('implementation')) {traits.add('style=dotted')}}}}projects = projects.sort { it.path }dot << '\n  # Projects\n\n'for (project in projects) {def traits = []if (rootProjects.contains(project)) {traits.add('shape=box')}if (multiplatformProjects.contains(project)) {traits.add('fillcolor="#ffd2b3"')} else if (jsProjects.contains(project)) {traits.add('fillcolor="#ffffba"')} else if (androidProjects.contains(project)) {traits.add('fillcolor="#baffc9"')} else if (javaProjects.contains(project)) {traits.add('fillcolor="#ffb3ba"')} else {traits.add('fillcolor="#eeeeee"')}dot << "  \"${project.path}\" [${traits.join(", ")}];\n"}dot << '\n  {rank = same;'for (project in projects) {if (rootProjects.contains(project)) {dot << " \"${project.path}\";"}}dot << '}\n'dot << '\n  # Dependencies\n\n'dependencies.forEach { key, traits ->dot << "  \"${key.first.path}\" -> \"${key.second.path}\""if (!traits.isEmpty()) {dot << " [${traits.join(", ")}]"}dot << '\n'}dot << '}\n'//        def p = 'dot -Tpng -O project.dot'.execute([], dot.parentFile)
//        p.waitFor()
//        if (p.exitValue() != 0) {
//            throw new RuntimeException(p.errorStream.text)
//        }
//
//        println("Project module dependency graph created at ${dot.absolutePath}.png")}
}

引用:

apply from: "${project.rootProject.file('projectDependencyGraph.gradle')}"

运行脚本 :

gradlew projectDependencyGraph

根目录会生成 build\reports\dependency-graph\project.dot

执行完命令后,会生成对应的dot文件
dot 是图形描述语言,简单来说就是用来描述一个图片的

查看

网页打开 .dot在线预览,复制.dot内容进入,即可查看

利用graphviz将dot可视化转为图片

为了把 dot 文件转 png 图片,你的机器上需要安装 GraphvizDownload | Graphviz。这玩意就是把 dot 转 png 的工具。

使用graphviz命令生成图即可,如下:

dot .\pp.dot -T jpg -o 11.jpg

若电脑上已安装Graphviz,可把上面脚本注释部分打开,即可把dot文件直接生成图片。

把上面脚本注释部分打开,电脑上未安装Graphviz,会报错 :

java.io.IOException:
Cannot run program “dot” (in directory “\build\reports\dependency-graph”):
CreateProcess error=2, 系统找不到指定的文件。

下载了Graphviz,命令行输入dot -V,若找不到命令需要配置环境变量。我这里是直接在path中添加bin目录即可。

http://www.lryc.cn/news/254386.html

相关文章:

  • Qt之QGraphicsView —— 笔记1.2:将QGraphicsView放置主窗口上,绘制简单图元(附完整源码)
  • linux的权限管理
  • 什么是 performance_schema ?
  • 软件多开助手的创新使用:在同一设备上玩转多个游戏
  • [linux] 输出文本文件的最后一列并去重
  • 新能源车交直流充电解释
  • Failed to connect to gitee.com port 443: Time out 连接超时提示【Bug已完美解决-鸿蒙开发】
  • 【开源】基于Vue+SpringBoot的智慧家政系统
  • javaee实验:文件上传及拦截器的使用
  • 二分查找19(Leetcode540有序数组中的单一元素)-1
  • 字节开源的netPoll底层LinkBuffer设计与实现
  • 《点云进阶》专栏文章目录
  • 二分查找算法-查找最接近的元素Python实现(题目来源dotcpp: 2926)
  • debian11,debian 如何删除虚拟内存,交换分区
  • 智能优化算法应用:基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码
  • 鼎捷受邀出席“中国制造业产品创新数字化国际峰会”,共话工业软件创新发展
  • 大话数据结构-查找-多路查找树
  • unity 2d 入门 飞翔小鸟 飞翔脚本(五)
  • Linux系统调试课:I2C tools调试工具
  • uniapp中解决swiper高度自适应内容高度
  • Contrast and Generation Make BART a Good Dialogue Emotion Recognizer
  • 图的深度优先搜索(数据结构实训)
  • VUEX使用总结
  • 指定分隔符对字符串进行分割 numpy.char.split()
  • Android12蓝牙框架
  • python文件docx转pdf
  • 9.基于SpringBoot3+I18N实现国际化
  • 27. 深度学习进阶 - 为什么RNN
  • 谈一谈柔性数组
  • <Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(1)》(25)