Skip to content

Commit 3056ca1

Browse files
committed
add dependency dump for JVM & Android tasks
1 parent 6a6b176 commit 3056ca1

7 files changed

Lines changed: 48 additions & 5 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@ junitVersion=5.10.0
3030
GROUP=io.github.tiktok.knit
3131
localPublish=true
3232
remoteKnitVersion=0.1.3
33-
knitVersion=0.1.4
33+
knitVersion=0.1.5
3434
projectGitUrl=https://github.com/tiktok/knit

knit-asm/src/main/java/tiktok/knit/plugin/writer/GlobalProvidesWriter.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import tiktok.knit.plugin.monitorOut
3535
import tiktok.knit.plugin.new
3636
import tiktok.knit.plugin.putStatic
3737
import tiktok.knit.plugin.sameFrame
38+
import tiktok.knit.plugin.sameFrame1Throwable
3839
import tiktok.knit.plugin.typedLoad
3940
import tiktok.knit.plugin.unaryPlus
4041

@@ -186,6 +187,7 @@ class GlobalProvidesWriter(private val context: KnitContext) {
186187

187188
if (singleton.threadSafe) {
188189
+handlerNode // catch {
190+
sameFrame1Throwable()
189191
astore(argCount + 1)
190192
ldc(lockType)
191193
monitorOut()
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (c) 2025 by TikTok Ltd., All rights reserved.
2+
// Licensed under the Apache License Version 2.0 that can be found in the
3+
// LICENSE file in the root directory of this source tree.
4+
5+
package tiktok.knit.plugin
6+
7+
import org.gradle.api.provider.Property
8+
9+
/**
10+
* Created by yuejunyu on 2025/8/14
11+
* Extension for configuring Knit plugin settings.
12+
*/
13+
interface KnitExtension {
14+
/**
15+
* The output path for the dependency tree JSON file.
16+
* Defaults to "build/knit/dependency-tree.json"
17+
*/
18+
val dependencyTreeOutputPath: Property<String>
19+
}

knit-plugin/src/main/java/tiktok/knit/plugin/KnitGradlePlugin.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,16 @@ import java.io.File
2121
*/
2222
abstract class KnitGradlePlugin : Plugin<Project> {
2323
override fun apply(target: Project) {
24+
val extension = target.extensions.create("KnitExtension", KnitExtension::class.java)
25+
extension.dependencyTreeOutputPath.convention("build/knit/dependency-tree.json")
2426
if (KnitAndroidConfig.tryConfigAndroid(target)) return
2527
if (target.tryConfigJvm()) return
2628
System.err.println("cannot found any knit target available.")
2729
}
2830

2931
private fun Project.tryConfigJvm(): Boolean {
3032
val jarTasks = tasks.withType(Jar::class.java)
31-
if (jarTasks.isNullOrEmpty()) return false
33+
if (jarTasks.isEmpty()) return false
3234
for (originJarTask in jarTasks) {
3335
val originOutput = originJarTask.archiveFile
3436
val originOutputFile = originOutput.get().asFile
@@ -55,9 +57,15 @@ abstract class KnitGradlePlugin : Plugin<Project> {
5557

5658
@TaskAction
5759
fun taskAction() {
60+
val dumpOutputFile = project.file(
61+
project.extensions.getByType(KnitExtension::class.java).dependencyTreeOutputPath,
62+
)
5863
val allJars = listOf(originJar.get().asFile)
5964
val outputJarFile = output.get().asFile
60-
val knitTask = KnitTask(allJars, emptyList(), outputJarFile, true)
65+
val knitTask = KnitTask(
66+
allJars, emptyList(), outputJarFile, true,
67+
dumpOutput = dumpOutputFile,
68+
)
6169
knitTask.execute()
6270
}
6371
}

knit-plugin/src/main/java/tiktok/knit/plugin/KnitPipeline.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package tiktok.knit.plugin
66

77
import org.objectweb.asm.Type
88
import org.objectweb.asm.tree.ClassNode
9+
import tiktok.knit.plugin.dump.KnitDumper
910
import tiktok.knit.plugin.element.BoundComponentClass
1011
import tiktok.knit.plugin.element.BoundComponentMapping
1112
import tiktok.knit.plugin.element.ComponentClass
@@ -19,13 +20,15 @@ import tiktok.knit.plugin.injection.InjectionBinder
1920
import tiktok.knit.plugin.injection.InjectionFactoryContext
2021
import tiktok.knit.plugin.writer.ComponentWriter
2122
import tiktok.knit.plugin.writer.GlobalProvidesWriter
23+
import java.io.File
2224

2325
/**
2426
* Created by yuejunyu on 2025/4/15
2527
* @author yuejunyu.0
2628
*/
2729
class KnitPipeline(
2830
private val useJrt: Boolean,
31+
private val dumpOutputFile: File,
2932
) {
3033
private class KnitContextImpl : KnitContext {
3134
override val componentMap: MutableMap<InternalName, ComponentClass> = mutableMapOf()
@@ -132,4 +135,8 @@ class KnitPipeline(
132135
it.attach2BoundMapping(mapping, map)
133136
}
134137
}
138+
139+
fun finish() {
140+
KnitDumper().dumpContext(knitContextImpl, dumpOutputFile)
141+
}
135142
}

knit-plugin/src/main/java/tiktok/knit/plugin/KnitTask.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@ class KnitTask(
2525
private val dirInputs: List<File>,
2626
private val outputJar: File,
2727
private val useJrt: Boolean,
28+
private val dumpOutput: File,
2829
) {
2930
fun execute() {
3031
val jarOutput = JarOutputStream(
3132
BufferedOutputStream(FileOutputStream(outputJar)),
3233
)
3334
val graphPipeline = GraphPipeline()
34-
val knitPipeline = KnitPipeline(useJrt)
35+
val knitPipeline = KnitPipeline(useJrt, dumpOutput)
3536

3637
val container = ContentContainer()
3738
val allClasses = container.getAllClasses(jarInputs, dirInputs, jarOutput)
@@ -53,6 +54,8 @@ class KnitTask(
5354
jarOutput.closeEntry()
5455
}
5556

57+
knitPipeline.finish()
58+
5659
container.closeAll()
5760
jarOutput.close()
5861
}

knit-plugin/src/main/java/tiktok/knit/plugin/android/KnitAndroidConfig.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.gradle.api.provider.ListProperty
1313
import org.gradle.api.tasks.InputFiles
1414
import org.gradle.api.tasks.OutputFile
1515
import org.gradle.api.tasks.TaskAction
16+
import tiktok.knit.plugin.KnitExtension
1617
import tiktok.knit.plugin.KnitTask
1718
import java.io.File
1819

@@ -58,10 +59,13 @@ internal object KnitAndroidConfig {
5859
@TaskAction
5960
fun taskAction() {
6061
val androidJarFile = findAndroidJar(project)
62+
val dumpOutputFile = project.file(
63+
project.extensions.getByType(KnitExtension::class.java).dependencyTreeOutputPath,
64+
)
6165
val allJars = allJars.get().map { it.asFile } + androidJarFile
6266
val allDirs = allDirectories.get().map { it.asFile }
6367
val outputJarFile = output.get().asFile
64-
val knitTask = KnitTask(allJars, allDirs, outputJarFile, false)
68+
val knitTask = KnitTask(allJars, allDirs, outputJarFile, false, dumpOutputFile)
6569
knitTask.execute()
6670
}
6771
}

0 commit comments

Comments
 (0)