最近有需求要在客户端打包完成后去执行加固命令,因为加固方提供的是一个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") }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)