gradle执行cmd脚本

本文介绍了如何在Gradle中执行Java命令来调用加固工具,并处理动态参数问题。作者首先尝试使用gradle的task执行cmd命令,但发现无法处理动态文件名。然后,考虑使用shell脚本并通过ProcessBuilder实现动态参数传递,最终成功在打包后执行加固命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有需求要在客户端打包完成后去执行加固命令,因为加固方提供的是一个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")
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值