布景

大力教育下的Android工程代码,从出世开端都是组件化的结构,所以多module是必定的作业。伴随着模块的新增/删去/移动,都会导致之前梳理好的模块依托图变得老旧,需求额定的markdown语法人力去保护模块依托结构。特别是关于刚融入的新同学,参看这老版其他依托图,会有一定程度上的信息滞后。

那么是不是可github敞开私库以写一个这样的主动化东西,代替人力来动态保护module之间的markdown手机版依托联络?本文就根据lint方案,主动appointment完结模块之间的依托联络视图。

Lint

大家对Lint的认知,基本上都觉得它只是一个静态代码appear剖析东西,经过规则规范团队代码。但我想为Landroid平板电脑价格int证明:apple「只需你想不到,没有我做不到」的才华。Lint在工作期间一个重要环节,便markdown是什么是依托于gradle环境:

./gradlew lintDebug

已然运elements转在了gradle环境中,必approve定能够拿到不同模块之间的依托联络,该方案去做模块可视化,看去可行。

要害类:

  • Detector:文件检测类,能够扫描gradle/java/kt/res等等文件。

  • Issue:每个Detector重视的焦点问题。

这儿不多介绍Lint开发环境的树立,能够直接参看官方demo:github.com/googlesampl… 。 详细作用能够参看ToastDetector:提示Toast添加showmarkdown语法()方法。

Android Module依靠联系的可视化完结

要害方法:

Detector中有两个和project相关的方法:

  • beforeCapproveheckRootProject(context: Context),遍历根module之前的回调,即项目中最顶层app module

  • beforeCheckEachProject(context: Context),遍历每个子module之前的回调。

该两个方法中都有Context对应的上下文,在构造函数中惊奇的发现Project这个特色。

open class Context(
main: Projectelementary?,
project: Project?,
val file: File,
private var contents: CharElementSequence? = null
)

是不是感觉和gradle中的project很像?经过debug发现,该project确实包括了build.gradle中的demarkdown下载pedency信息,那么根据Linapplicationt方案的思路就必定能够落markdown手机版地了。窃窃自喜:「只需你想要,没有我给不了」。

要害代码:

class DependencyProjectDetectgithub永久回家地址or : Detector(), Detector.UastScanner {
// 各个module之间的依托树
private val treeMap = HashMap<String, ElementNode>()
// 根module结点
private var rootNode = Emarkdown是什么lementNode()
companion object {
const val TAG = "DependencyProjectDetector"
private val IMPLEMENTATION = Implementation(
DependencyProjectDetector::class.java,
Scope.JAVAmarkdown编辑器_FILE_SCOPE
)
val ISSUE: Issue = Issue
.create(
id = "DependencyProjectDandroid下载装置etector",
briefDescription = "app dependency relationship",
explanation = """
app dependency relatiogithub中文官网网页nship
""".trimandroid平板电脑多少钱Indent(),
category = Catmarkdown中文官网egory.markdown是什么CORRECTNESS,
priority = 9,
severity = Severity.FATAL,
androidSpecific = true,
imarkdown手机版mplementation = IMPLEMENTATION
)
}
//这儿能够随意,markdown笔记是什么意思首要是为了凭借遍历method的才华。
override fun getApplicableMethodNames(): List<String>? {
return listOf("a")
}
overrgithub是干什么的ide fun beforeCheckRootProject(context: Context) {
rootNode = collecelement滑板tNode(context.project.name)
super.beforeCheckRootProject(context)
}
//剖析当时模块依托状况,并搜集依托信息。
private fun analysisCurrentProjectDependency(project: Project) {
val projectName = project.name
val currentNelementui文档ode = collectNode(projectName)
val artifacmarkdown下载t = project.currenandroid平板电脑多少钱tVariant.mainArtifact
val list = project.directLibraries.fandroid12ilter { !ielementuit.isExternalLibrary }
list.forEach {
val childNode = collectNode(it.name)
ifappstore (!currentNode.dependencyNode.map { it.moduleName }.contains(childmarkdown编辑器Node.moduleName)) {
currentNode.dependencyNodelementary是什么意思e.add(childNode)
}
}
}
privapproachate fun collectNgithub打不开ode(moduleName: String): ElementNode {
vandroid平板电脑多少钱al currentNode = if (treeMap.containapplesKey(moduleName)) {
treeMap[moduleName]!!
} else {
ElementNode().apply {
this.moduleName = moduleName
treeMap[moduleName] = this
}
}
retAPPurn currentNode
}
//输出markdown格式的文本信息
private fun generateMamarkdown语法rkDowngithub中文官网网页Result() {
for (element: ElementNode in treeMap.values) {
removeUnnecessaryDepapp装置下载endency(element)
}
println("```mermaid")
val head = "graph Tmarkdown笔记是什么意思D"
println(head)
for (elmarkdown手机版ement: ElementNode in treeMap.values) {
val currentName = element.moduleName
for (childElement: ElementNode in element.dependencyNode) {
papp装置下载rmarkdown语法intln("${currentName}[${currentName}]-->${app装置下载childElement.moduleName}[${childElement.moduleName}]")
}
}
println("```")
}
/**
* 优化:移除不需求的依托,原则:currentNode的孩子行列,最短依托,有能够被非最短依托代替的,则删去最短依托。
*/
private fun removeUnnecegithub敞开私库ssaryDependency(currentNode: ElementNode) {
val dependencyList = currentNode.dependencyNode
//为了防止remove失败,创建了一个temp list
val tempDependencyList = ArrayList(dependencyList)
val iterator = tempDependencyList.itelementaryerator()
while (iterator.hamarkdown语法sNext()) {
val targetElement = iterator.next()
val leftTargetElelementuiements = tempDependencyList.elementuifilter { it != targetElement }
for (otherItapplicationem: ElementNode in leftTargetEMarkdownlementsapp装置下载) {
if (celementary是什么意思ontainNode(otherItem, targetElement)) {
dependencyList.remove(targgithub是干什么的etElement)
continue
}
}
}
}
/**
* rootNode下面是否包括targetNode结点
*markdown教程/
privatgithub打不开e fun containNode(rootNode: Elementgithub中文官网网页Node, targetNode: ElementNode): Boolean {
if (rootNode == targetNode) {
return true
}
val rootChElementildren = rootNode.dependencyNode
for (child: Eleandroid平板电脑价格mentNode in rootChildren) {
if (rootNode == child) {
return true
} else {
var result = containNode(child, targetNode)markdown是什么
if (result) {
return result
}
}
}
return faapprovelse
}
override fun beforeCheckEachProject(context: Contapp装置下载ext) {
if (context.project.isExternalLibramarkdown下载ry)elementui {
return
}
analysisAndroidCurrentProjectDeAPPpendency(context.project)
super.beforeCheckEachProject(context)
}
override fun afterCheckRootProject(context: Context) {
generateMarkDownResult()
super.afterCheckRootProject(context)
}
}

中心原理: 经过遍历project,搜集当时prmarkdown表格oject的projectNameprojectgithub是干什么的DepedencyList,最终把每个moelementsdule对应的project进行汇总,梳理出整个树状依托结构。已然整个依托数据结构已经有了,下一步是不android体系是要可视化输出了?

Markdown

为什么要挑选Markdown?东西Element不重要,中心是要能出图。根据以下原因考虑:

  1. android12解,不需求额定学习本钱。
  2. 简略,流程图语法参看:mermaid-js.github.io/mermaid/#/?… 。
  3. 满足我的需求,当下只需求流程图才华。
  4. 无缝链接编程言语,无需额定依托。

结果图:

经过一个demo来展现当时依github打不开托作用。

Android Module依靠联系的可视化完结

虽然只需几个模块,但由于一些重复依托的线条,导致该图不那么的清楚简练。所以做一些精简:

  1. app->account-api->common
  2. app->commogithub永久回家地址n

改进的原则:「保存多结点依托,删去直接依托」。也就是保存【1】,删去【2】,详细完结参看上述代码中的remoandroid下载veUnnecessaryDependency

改进后:

Android Module依靠联系的可视化完结

怎么样,模块依托是不是比较清楚?

Lint默许工作是不会跨module的,比如./appointmentgradlew lint,会对每个module进行独立的剖析和输出,这就导致每一份剖析结构都是针对当时module的,所以无法搜集相互之间的依托。解决方法github官网

lintOptions {
checkDependencies true
}

果不其然,api文档中也没有checkDependencies特色,google.github.io/Androidandroid-gra… 那只能你自己渐渐去debug吧。

lint在gappleradle插APP件的不同版别3.+和4.+上,会有很大的不同,所以你想要集成该才华,建议自己根据当时工程的gradle版markdown编辑器别,再做兼容调试。

价值

  1. 在新人的角度,能够快速获取最新依托图,加快对项目结构的了解。
  2. 在非新人的角度,定时输出依托图,剖析其Android间不合理的依托并及时改进。