fix(script): use compile instead analyze for scripts with deps (#1912)
This commit is contained in:
+22
-18
@@ -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 ->
|
||||
|
||||
+11
@@ -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)}" }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user