fix(script): use compile instead analyze for scripts with deps (#1912)

This commit is contained in:
Skylot
2023-06-15 21:08:51 +01:00
parent 1a642108ef
commit 6f4451364b
11 changed files with 167 additions and 61 deletions
@@ -4,13 +4,13 @@ import jadx.api.plugins.JadxPluginContext
import jadx.plugins.script.runtime.JadxScriptData
import jadx.plugins.script.runtime.JadxScriptTemplate
import jadx.plugins.script.runtime.data.JadxScriptAllOptions
import kotlin.script.experimental.api.CompiledScript
import kotlin.script.experimental.api.EvaluationResult
import kotlin.script.experimental.api.ResultValue
import kotlin.script.experimental.api.ResultWithDiagnostics
import kotlin.script.experimental.api.ScriptCompilationConfiguration
import kotlin.script.experimental.api.ScriptDiagnostic.Severity
import kotlin.script.experimental.api.ScriptEvaluationConfiguration
import kotlin.script.experimental.api.compilerOptions
import kotlin.script.experimental.api.SourceCode
import kotlin.script.experimental.api.constructorArgs
import kotlin.script.experimental.host.toScriptSource
import kotlin.script.experimental.jvmhost.BasicJvmScriptingHost
@@ -22,7 +22,19 @@ import kotlin.time.toDuration
class ScriptEval {
private val scriptingHost = BasicJvmScriptingHost()
companion object {
val scriptingHost = BasicJvmScriptingHost()
val compileConf = createJvmCompilationConfigurationFromTemplate<JadxScriptTemplate>()
private val baseEvalConf = createJvmEvaluationConfigurationFromTemplate<JadxScriptTemplate>()
private fun buildEvalConf(scriptData: JadxScriptData): ScriptEvaluationConfiguration {
return ScriptEvaluationConfiguration(baseEvalConf) {
constructorArgs(scriptData)
}
}
}
fun process(init: JadxPluginContext, scriptOptions: JadxScriptAllOptions): List<JadxScriptData> {
val jadx = init.decompiler
@@ -39,26 +51,18 @@ class ScriptEval {
return scriptDataList
}
fun buildCompileConf(): ScriptCompilationConfiguration {
return createJvmCompilationConfigurationFromTemplate<JadxScriptTemplate> {
// forcing compiler to not use modules while building script classpath
// because shadow jar remove all modules-info.class (https://github.com/johnrengelman/shadow/issues/710)
compilerOptions("-Xjdk-release=1.8")
}
}
fun buildEvalConf(scriptData: JadxScriptData): ScriptEvaluationConfiguration {
return createJvmEvaluationConfigurationFromTemplate<JadxScriptTemplate> {
constructorArgs(scriptData)
}
suspend fun compile(script: SourceCode): ResultWithDiagnostics<CompiledScript> {
return scriptingHost.compiler(script, compileConf)
}
private fun eval(scriptData: JadxScriptData) {
scriptData.log.debug { "Loading script: ${scriptData.scriptFile.absolutePath}" }
val execTime = measureTimeMillis {
val compilationConf = buildCompileConf()
val evalConf = buildEvalConf(scriptData)
val result = scriptingHost.eval(scriptData.scriptFile.toScriptSource(), compilationConf, evalConf)
val result = scriptingHost.eval(
scriptData.scriptFile.toScriptSource(),
compileConf,
buildEvalConf(scriptData),
)
processEvalResult(result, scriptData)
}
scriptData.log.debug { "Script '${scriptData.scriptName}' executed in ${execTime.toDuration(DurationUnit.MILLISECONDS)}" }
@@ -17,6 +17,7 @@ class JadxScriptPluginTest {
args.inputFiles.run {
add(getSampleFile("hello.smali"))
add(getSampleFile("test.jadx.kts"))
add(getSampleFile("test-deps.jadx.kts"))
}
val elapsed = measureTimeMillis {
JadxDecompiler(args).use { jadx ->
@@ -0,0 +1,11 @@
@file:DependsOn("org.apache.commons:commons-text:1.10.0")
import org.apache.commons.text.StringEscapeUtils
val jadx = getJadxInstance()
jadx.afterLoad {
jadx.classes.forEach {
jadx.log.info { "Escaped name: ${StringEscapeUtils.escapeJava(it.fullName)}" }
}
}