diff --git a/booster-cha/build.gradle b/booster-cha/build.gradle index 59824ae7c..47d49c6e5 100644 --- a/booster-cha/build.gradle +++ b/booster-cha/build.gradle @@ -1,5 +1,6 @@ apply from: "$rootDir/gradle/booster.gradle" dependencies { + api project(':booster-command') api project(':booster-transform-util') } diff --git a/booster-cha/src/main/kotlin/com/didiglobal/booster/cha/graph/dot/DotGraph.kt b/booster-cha/src/main/kotlin/com/didiglobal/booster/cha/graph/dot/DotGraph.kt index 741e0512b..48256da06 100644 --- a/booster-cha/src/main/kotlin/com/didiglobal/booster/cha/graph/dot/DotGraph.kt +++ b/booster-cha/src/main/kotlin/com/didiglobal/booster/cha/graph/dot/DotGraph.kt @@ -1,8 +1,17 @@ package com.didiglobal.booster.cha.graph.dot -import com.didiglobal.booster.kotlinx.RGB import com.didiglobal.booster.cha.graph.CallGraph import com.didiglobal.booster.cha.graph.CallGraphRenderer +import com.didiglobal.booster.command.Command +import com.didiglobal.booster.command.CommandService +import com.didiglobal.booster.kotlinx.OS +import com.didiglobal.booster.kotlinx.RGB +import com.didiglobal.booster.kotlinx.execute +import com.didiglobal.booster.kotlinx.stderr +import com.didiglobal.booster.kotlinx.touch +import java.io.File +import java.io.FileNotFoundException +import java.io.IOException /** * Represents the graph type @@ -40,4 +49,16 @@ sealed class DotGraph : CallGraphRenderer { } + fun visualize(graph: CallGraph, output: File, format: String = "png", dot: Command = CommandService.fromPath("dot${OS.executableSuffix}")) { + output.touch().writeText(render(graph).toString()) + dot.location.file.let(::File).takeIf(File::exists)?.let { + "${it.canonicalPath} -T${format} -O ${output.canonicalPath}".also(::println).execute() + }?.let { p -> + p.waitFor() + if (p.exitValue() != 0) { + throw IOException(p.stderr) + } + } ?: throw FileNotFoundException(dot.location.file) + } + } diff --git a/booster-task-graph/src/main/kotlin/com/didiglobal/booster/task/graph/TaskGraphVariantProcessor.kt b/booster-task-graph/src/main/kotlin/com/didiglobal/booster/task/graph/TaskGraphVariantProcessor.kt index cc7e5ffd1..490421cc7 100644 --- a/booster-task-graph/src/main/kotlin/com/didiglobal/booster/task/graph/TaskGraphVariantProcessor.kt +++ b/booster-task-graph/src/main/kotlin/com/didiglobal/booster/task/graph/TaskGraphVariantProcessor.kt @@ -3,19 +3,12 @@ package com.didiglobal.booster.task.graph import com.android.build.gradle.api.BaseVariant import com.didiglobal.booster.cha.graph.CallGraph import com.didiglobal.booster.cha.graph.dot.DotGraph -import com.didiglobal.booster.command.CommandService import com.didiglobal.booster.gradle.project -import com.didiglobal.booster.kotlinx.OS -import com.didiglobal.booster.kotlinx.execute import com.didiglobal.booster.kotlinx.file import com.didiglobal.booster.task.spi.VariantProcessor import com.google.auto.service.AutoService -import java.io.BufferedReader -import java.io.File import java.util.concurrent.atomic.AtomicBoolean -private val DOT = "dot${OS.executableSuffix}" - @AutoService(VariantProcessor::class) class TaskGraphVariantProcessor : VariantProcessor { @@ -41,20 +34,11 @@ class TaskGraphVariantProcessor : VariantProcessor { builder }.build() - // write dot file - dot.writeText(DotGraph.DIGRAPH.render(graph).toString()) - - // convert dot to png - CommandService.fromPath(DOT).location.file.let(::File).takeIf(File::exists)?.let { - val cmdline = "${it.canonicalPath} -Tpng -O ${dot.canonicalPath}" - project.logger.info(cmdline) - cmdline.execute() - }?.let { p -> - p.waitFor() - if (p.exitValue() != 0) { - project.logger.error(p.errorStream.bufferedReader().use(BufferedReader::readText)) - } - } ?: project.logger.warn("Command `${DOT}` not found") + try { + DotGraph.DIGRAPH.visualize(graph, dot) + } catch (e: Exception) { + project.logger.error(e.message) + } } }