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目录即可。
相关文章:
Android studio 工程的 module 依赖关系图绘制 、 Android Module 依赖关系的可视化实现
整体步骤: 1、利用gradle脚本生成dot; 2、利用graphviz将dot可视化转为图片 利用gradle脚本生成dot 下载projectDependencyGraph.gradle脚本 下载 projectDependencyGraph.gradle ,放在项目根目录, 源码如下: t…...

Qt之QGraphicsView —— 笔记1.2:将QGraphicsView放置主窗口上,绘制简单图元(附完整源码)
效果 相关类介绍 QGraphicsView类提供了一个小部件,用于显示QGraphicsScene的内容。QGraphicsView在可滚动视口中可视化。QGraphicsView将滚动其视口,以确保该点在视图中居中。 QGraphicsScene类 提供了一个用于管理大量二维图形项的场景。请注意,QGraphicsScene没有自己的视…...
linux的权限管理
在Linux系统中,文件和目录的权限管理是通过用户、组以及其他用户对文件和目录的读(r)、写(w)和执行(x)权限来实现的。以下是有关Linux权限管理的详细解释: 文件和目录权限࿱…...
什么是 performance_schema ?
MySQL的performance_schema是运行在较低级别的用于监控MySQL Server运行过程中的资源消耗、资源等待等情况的一个功能特性,它具有以下特点。 performance_schema提供了一种在数据库运行时实时检查Server内部执行情况的方法。performance_schema数据库中的表使用per…...
软件多开助手的创新使用:在同一设备上玩转多个游戏
软件多开助手:在同一设备上玩转多个游戏的创新使用 随着科技的不断发展,手机和电脑已经成为我们生活中必不可少的工具。众多游戏爱好者也越来越追求在同一设备上同时体验多个游戏的乐趣。而软件多开助手的出现为这一需求提供了创新的解决方案。 传统上…...
[linux] 输出文本文件的最后一列并去重
使用 awk 命令来实现这个需求。下面是一个示例命令: awk -F , {print $NF} a.txt | sort -u解释一下这个命令: awk -F , {print $NF} a.txt:使用逗号作为字段分隔符(-F ,),打印每行的最后一个字段&#x…...

新能源车交直流充电解释
交流充电: 国家电网输出的电都是交流电,如下图所示,具有正弦切换规律的 而电动车的电池只能接受直流电,因此需要首先把交流电转换成直流电才能充进汽车电池,这就需要到了转换器OBC(on-board Charger&#…...

Failed to connect to gitee.com port 443: Time out 连接超时提示【Bug已完美解决-鸿蒙开发】
文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2:解决方案3:此Bug解决方案总结解决方案总结**心得体会:解决连接超时问题的三种方案**项目场景: 导入Sample时遇到导入失败的情况,并提示“Failed to connect to gitee.com port 443: Time out”连接超…...

【开源】基于Vue+SpringBoot的智慧家政系统
项目编号: S 063 ,文末获取源码。 \color{red}{项目编号:S063,文末获取源码。} 项目编号:S063,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服…...

javaee实验:文件上传及拦截器的使用
目录 文件上传ModelAttribute注解实验目的实验内容实验过程项目结构编写代码结果展示 文件上传 Spring MVC 提供 MultipartFile 接口作为参数来处理文件上传。 MultipartFile 提供以下方法来获取上传的文件信息: getOriginalFilename 获取上传的文件名字&#x…...
二分查找19(Leetcode540有序数组中的单一元素)-1
代码: 没用二分查找版: class Solution {public int singleNonDuplicate(int[] nums) {if(nums.length1){return nums[0];}for(int i1;i<nums.length-1;i){if(nums[i-1]nums[i]||nums[i]nums[i1]){continue;}else{return nums[i];}}if(nums[0]nums[…...

字节开源的netPoll底层LinkBuffer设计与实现
字节开源的netPoll底层LinkBuffer设计与实现 为什么需要LinkBuffer介绍设计思路数据结构LinkBufferNodeAPI LinkBuffer读 API写 APIbook / bookAck api 小结 本文基于字节开源的NetPoll版本进行讲解,对应官方文档链接为: Netpoll对应官方文档链接 netPoll底层有一个…...

《点云进阶》专栏文章目录
目录 一、PCL进阶篇* 二、Open3D进阶篇 一、PCL进阶篇 * PCL 最小二乘拟合二维直线PCL 最小二乘拟合空间直线PCL 计算点云的倒角距离(Chamfer Distance)PCL 点云配准精度评价——点到面的均方根误差PCL 可视化八叉树PCL 计算Hausdorff距离PCL 从变换矩…...
二分查找算法-查找最接近的元素Python实现(题目来源dotcpp: 2926)
题目描述 在一个非降序列中,查找与给定值最接近的元素。 输入格式 第一行包含一个整数n,为非降序列长度。1 < n < 100000。 第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。 第三行包含一个整数m&#x…...
debian11,debian 如何删除虚拟内存,交换分区
1.以管理员身份登录系统 2.输入以下命令以删除虚拟内存,该命令将关闭当前正在使用的虚拟内存。 sudo swapoff -a 3.输入以下命令以永久删除虚拟内存(硬盘内存文件): sudo rm /swapfile 4.重启系统 总结:以上步骤将删除 Debian 11 中的虚拟内存。请注意…...

智能优化算法应用:基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工大猩猩部队算法4.实验参数设…...

鼎捷受邀出席“中国制造业产品创新数字化国际峰会”,共话工业软件创新发展
11月30日, 由e-works数字化企业网、四川省智能制造创新中心、重庆制信信息技术服务有限公司主办的第十九届中国制造业产品创新数字化国际峰会在四川成都盛大开幕。 作为制造业研发信息化领域规模、影响力兼具的专业论坛,本届峰会以“构建基于数字底座的…...

大话数据结构-查找-多路查找树
注:本文同步发布于稀土掘金。 7 多路查找树 多路查找树(multi-way search tree),其每个结点的孩子可以多于两个,且每一个结点处可以存储多个元素。由于它是查找树,所有元素之间存在某种特定的排序关系。 …...

unity 2d 入门 飞翔小鸟 飞翔脚本(五)
新建c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : MonoBehaviour {//获取小鸟(刚体)private Rigidbody2D bird;//速度public float speed;// Start is called before the first frame up…...

Linux系统调试课:I2C tools调试工具
文章目录 一、如何使用I2C tools测试I2C外设1、I2C tools概述: 2、下载I2C tools源码:3、编译I2C tools源码: 4、i2cdetect 5、i2cget 6、i2cdump...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...