最近有需求要在客户端打包完成后去执行加固命令,因为加固方提供的是一个jar包,所以要我们要在打包结束后再去执行行java -jar命令调用加固。
从gradle官网上了解到是有一个task去执行cmd命令,于是尝试了一下,确实生效
参考让gradle执行cmd 或者其他exe命令的方法_道哥的技术博客 -CSDN博客_gradle执行cmd命令
但是如果我们的文件名是动态变化的,需要动态的传参,简单尝试之后发现用gradle这种通用传参方法是不生效的。(如下代码是不生效的)
task justEnhanceSoFileTask(type: Exec, description: '执行加固so File 操作'){
workingDir 'nboxSoFile'
def myCommond = [
commandLine ”cmd“, ”/c“,
"java",
"-jar", "${rootProject.rootDir}/app/tools/reinforce.jar",
"-p", "${param}",
"-d", "${param2}",
]
commandLine myCommond
}
又了解到可以直接调用shell脚本文件,于是产生如下想法 可以把参数直接传入到shell脚本中 但是没有实践,参考Gradle调用shell脚本和python脚本并传参 - 简书
task myPrebuildTask(type: Exec) {
workingDir "$projectDir/mySubDir"
if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
commandLine 'cmd', '/c', 'mycommand'
} else {
commandLine 'sh', '-c', 'mycommand'
}
}
因为grovvy是基于jvm的,可以完美的调用java的方法,从之前同事写的代码看到可以使用ProcessBuilder去直接在gradle文件中执行shell命令并打印出相关的日志,于是采用了如下方法:
tasks.whenTaskAdded { task ->
def taskName = task.name
if (taskName != "assembleRelease") {
return
}
task.doLast {
android.applicationVariants.all { variant ->
if (!variant.name.endsWith("Release")) {
return
}
......
// 加固apk
runCommand("java",
"-jar", "${rootProject.rootDir}/app/tools/reinforce.jar",
"-p", "${tempPath.getPath()}",
"-d", "${reinforceOutputPath.getPath()}")
......
}
}
}
def runCommand(String... command) {
ProcessBuilder processBuilder = new ProcessBuilder()
processBuilder.redirectErrorStream(true)
processBuilder.command(command)
Process process = processBuilder.start()
println("process start")
InputStreamReader inputReader = new InputStreamReader(process.getInputStream(), "UTF-8")
BufferedReader bufferedReader = new BufferedReader(inputReader)
String line
while ((line = bufferedReader.readLine()) != null) {
println(line)
}
process.waitFor()
println("process finish")
}