Gradle编译时所有Task信息打印

news/2024/5/20 2:51:27 标签: gradle, android

————————————————
版权声明:本文为CSDN博主「拿节」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhejiang9/article/details/105241392

Gradle工程编译的过程,就是执行目标task的过程,如果task存在依赖,则先执行依赖task,如此反复,直到触达无依赖的task

就这样,从无依赖task -> 目标task的执行链即建立,接着依次执行task即可,每个task之间数据传输,主要是通过task inputsoutputs描述文件来完成的

所以,gradle编译所有task信息的打印,应该包含

  1. 按task执行顺序打印task name
  2. 可以打印task的 inputsoutputs 数据
  3. 输出json信息保存到本地文件

我写了一个gradle脚本来完成上述信息输出:

import groovy.json.JsonOutput

//输出数据结构
class TaskItem {
    String name
    List<String> inputs = new ArrayList<>()
    List<String> outputs = new ArrayList<>()
}

class Dumper {
    //正则表达式,用于过滤要dump inputs和outputs的task
    //这里配置名称包含Jni的task,大家可以根据需要自行配置
    String taskInOutDirDumpFilter = "^.*Jni.*|^.*transform.*"
    String type
    File logOutDir
    List<TaskItem> taskList = new ArrayList<>()
    File logfile
    boolean isAvaliable = false

    Dumper(String type, File dir) {
        this.type = type
        this.logOutDir = dir
    }

    def makeLogFile() {
        logfile = new File(logOutDir, "taskDump-${type}.json")
        if (!logOutDir.exists()) {
            logOutDir.mkdirs()
        }
        if (logfile.exists()) {
            logfile.delete()
        }

        logfile.createNewFile()
    }

    def collectData(Task t) {
        t.doFirst {
            try {
                if (name == "pre${type}Build" && !isAvaliable) {
                    isAvaliable = true
                    makeLogFile()
                }
            } catch (Exception ex) {
                ex.printStackTrace()
                return
            }

            if (!isAvaliable) {
                return
            }

            TaskItem item = taskList.find {
                it.name == path
            }

            if (item != null) {
                return
            }

            item = new TaskItem()
            item.name = path

            taskList.add(item)

            def matcher = name =~ taskInOutDirDumpFilter
            if (matcher.size() > 0) {
                println "-------match task path = ${path}"

                t.inputs.each {
                    it.files.each {
                        item.inputs.add(it.absolutePath)
                    }
                }

                t.outputs.each {
                    it.files.each {
                        item.outputs.add(it.absolutePath)
                    }
                }
            }
        }
    }

    def dumpData2File() {
//        println " ------- dumpData2File " + logfile.getPath()
        def s = JsonOutput.toJson(taskList)

        logfile.write(s)
    }
}

Map<String, Dumper> dumperMap = new HashMap<>()
//数据dump目录
def dumpDir = new File(buildDir, "taskDump")
if (!dumpDir.exists()) {
    dumpDir.mkdirs()
}

rootProject.childProjects.each {
    it.value.afterEvaluate { Project project ->
        def isAndroidLibrary = project.plugins.hasPlugin("com.android.library")
        def isApplication = project.plugins.hasPlugin("com.android.application")
        if (!(isAndroidLibrary || isApplication)) {
            println("dumpTask -> is not android module.")
            return
        }
        def variants = isAndroidLibrary ? project.android.libraryVariants : project.android.applicationVariants

        variants.all { def variant ->
            // Create variant and target names
            def targetName = variant.name.capitalize()
            def dumper = dumperMap.get(targetName)

            if (dumper == null) {
                dumper = new Dumper(targetName, dumpDir)
                dumperMap.put(targetName, dumper)
            }

            project.tasks.each {
                dumper.collectData(it)
            }
        }
    }
}

gradle.buildFinished {
    dumperMap.each {
        if (it.value.isAvaliable) {
            try {
                it.value.dumpData2File()
            } catch (Exception ex) {
                println ex.getMessage()
            }
        }
    }
}

将脚本命名并保存到工程目录下,比如 dumptask.gradle,并保存道app module的根目录,接着再app module的build.gradle引入

apply from: “dumpTask.gradle

接着执行

./gradlew assembleDebug

执行结束后, dump信息保存到如下文件

app/build/taskDump/taskDump-Debug.json

[
  ...
  {
    "contentHash": "c01a300bf2fd522b5c9c92944ade0672",
    "originalClassName": "TaskItem",
    "inputs": [],
    "outputs": [],
    "name": ":Media:prepareLintJarForPublish"
  },
  {
    "contentHash": "c01a300bf2fd522b5c9c92944ade0672",
    "originalClassName": "TaskItem",
    "inputs": [
      "/Users/likunlun/Android/Projects/DeveloperDocuments/AndroidStudy/Modules/Media/build/intermediates/stripped_native_libs/debug/out"
    ],
    "outputs": [
      "/Users/likunlun/Android/Projects/DeveloperDocuments/AndroidStudy/Modules/Media/build/intermediates/library_jni/debug/jni"
    ],
    "name": ":Media:copyDebugJniLibsProjectOnly"
  },
  ...
]

http://www.niftyadmin.cn/n/1268726.html

相关文章

Leetcode 943:最短超级串(超详细的解法!!!)

给定一个字符串数组 A&#xff0c;找到以 A 中每个字符串作为子字符串的最短字符串。 我们可以假设 A 中没有字符串是 A 中另一个字符串的子字符串。 示例 1&#xff1a; 输入&#xff1a;["alex","loves","leetcode"] 输出&#xff1a;"…

通过电脑向手机输入框输入特殊字符及中文

adb shell 输入文字 通过adb shell指令向手机输入框输入指定的内容&#xff0c;包括特性字符、中文等。 adb shell ime使用 usage: ime list [-a] [-s]ime enable IDime disable IDime set IDThe list command prints all enabled input methods. Use the -a option to see…

Leetcode 96:不同的二叉搜索树(超详细的解法!!!)

给定一个整数 n&#xff0c;求以 1 … n 为节点组成的二叉搜索树有多少种&#xff1f; 示例: 输入: 3 输出: 5 解释: 给定 n 3, 一共有 5 种不同结构的二叉搜索树:1 3 3 2 1\ / / / \ \3 2 1 1 3 2/ / …

Android 循环录制最近一段时间的视频

Android 循环录制最近一段时间的视频 在日常开发测试中&#xff0c;往往发生问题了再去想办法复现录屏、抓取日志的工作&#xff0c;往往会出现偶现问题很难复现&#xff0c;导致问题很难定位。在这里给出一个能抓取历史操作视频的解决方案&#xff1a; 将录屏的视频帧数据一…

Leetcode 95:不同的二叉搜索树 II(超详细的解法!!!)

给定一个整数 n&#xff0c;生成所有由 1 … n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树&#xff1a;1 3 3 2 …

Leetcode 241:为运算表达式设计优先级(超详细的解法!!!)

给定一个含有数字和运算符的字符串&#xff0c;为表达式添加括号&#xff0c;改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 , - 以及 * 。 示例 1: 输入: "2-1-1" 输出: [0, 2] 解释: ((2-1)-1) 0 (2-(1-1)) 2示例 …

上传artifacts到maven仓库

上传artifacts到maven仓库 简单介绍几种上传jar/aar到maven仓库的方法。 Maven Publish Properties PropertyDescriptionartifactsThe complete set of artifacts for this publication.groupIdThe groupId for this publication.artifactIdThe artifactId for this public…

Leetcode 97:交错字符串(超详细的解法!!!)

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。 示例 1: 输入: s1 "aabcc", s2 "dbbca", s3 "aadbbcbcac" 输出: true示例 2: 输入: s1 "aabcc", s2 "dbbca", s3 "aadbbbaccc" 输出…