美文网首页Studio
Gradle 自定义Task

Gradle 自定义Task

作者: 锋Plus | 来源:发表于2020-01-16 15:07 被阅读0次

Gradle 自定义Task

自定义task 实现自动化系统签名,push安装,重启设备等操作

Task 实现 apk系统签名

原先打系统apk包需要将build/outputs/apk下面的apk安装包拿出来,执行java命令java -jar signapk.jar platform.x509.pem platform.pk8 xxx.apk xxxSysSign.apk生成 xxxSysSign.apk的系统包。

现想法就是自定义一个task,能在assembleDebug执行系统签名操作。因为系统签名实质上就是执行一行java命令的操作。

先把系统签名需要的文件 signapk.jar platform.x509.pem platform.pk8 放到 app模块根目录下,也就是与app模块的build.gradle同级,然后在该build.gradle文件里新增一个task(与android {}同级,不要写在android{}里面),具体如下:

task autoSignDebug {
    def outputFileName = "WeierV1.0.0.0.apk"
    dependsOn 'assembleDebug'
    doLast { // 系统应用签名
        File file = new File("./app/build/outSignApk");
        if (!file.exists())
            file.mkdirs();
        def result = ("java -jar signapk.jar platform.x509.pem platform.pk8 ./build/outputs/apk/Weier.apk ./build/outSignApk/" + outputFileName).execute([], new File('./app/')).text.trim()
        println("apk系统签名完成 = " + result)
    }
 }

简单解释下:

  • dependsOn 'assembleDebug' 意思就是依赖于 assembleDebug task,这个task就是gradle自带的用来 生成 debug版安装包的 task。依赖于 assembleDebug ,就是指执行该task前将先执行assembleDebug 。同样也可以将代码里的assembleDebug替换成 assembleRelese

  • doLast{} doFirst和doLast中的代码,不执行这个任务时,是不会执行的,但是直接写在闭包中的,就也是在这两个函数外的代码,是在配置阶段就会执行的。运行任务时,doFirst中的代码最先执行,doLast中的代码最后执行。

  • 再解释下 "xxxx".execute([], new File('./app/')).text.trim()这个语句。查阅execute()方法源码,最终实现就是Runtime.java 里的 Process exec(String prog, String[] envp, File directory)方法,.text.trim()方法会返回执行命名行的结果。

所以这个autoSignDebug task,就是在assembleDebug之后执行 新建 outSignApk 文件夹,并生成 系统签名apk,最终打印结果 。

实现后续功能,push安装 、重启设备

push安装与重启,其实就是adb命令集,所以参照之前的思路就很简单了,只要再加一个doLast{}语句执行几个adb命令即可:

 doLast { //安装新应用
        def outputFilePath = "./build/outSignApk/" + outputFileName

        // 设备系统 暂时只支持push安装系统app
        ("adb root").execute([], new File('./')).text.trim()
        def result = ("adb push " + outputFilePath + " /wellcom/app/Weier/Weier.apk").execute([], new File('./app/')).text.trim()
        println("apk安装 完成=" + result)
        //伪重启
        ("adb shell stop").execute([], new File('./')).text.trim()
        ("adb shell start").execute([], new File('./')).text.trim()
 }

这里的push安装也可以换成install安装"adb install -r " + outputFilePath,还可以在安装前先执行卸载操作"adb uninstall " + android.defaultConfig.applicationId

所以最终task代码:

task autoSignDebug {
    def outputFileName = "WeierV1.0.0.0.apk"
    dependsOn 'assembleDebug'
    doLast { // 系统应用签名
        File file = new File("./app/build/outSignApk");
        if (!file.exists())
            file.mkdirs();

        def result = ("java -jar signapk.jar platform.x509.pem platform.pk8 ./build/outputs/apk/Weier.apk ./build/outSignApk/" + outputFileName).execute([], new File('./app/')).text.trim()
        println("apk系统签名完成 = " + result)
    }
    doLast { //卸载老应用
        //        commandLine 'adb', 'uninstall', android.defaultConfig.applicationId
//        ("adb uninstall " + android.defaultConfig.applicationId).execute([], new File('./'))
    }
    doLast { //安装新应用
        def outputFilePath = "./build/outSignApk/" + outputFileName
//        ("adb install -r " + outputFilePath).execute([], new File('./'))


        // 设备系统 暂时只支持push安装app
        ("adb root").execute([], new File('./')).text.trim()
        def result = ("adb push " + outputFilePath + " /wellcom/app/Weier/Weier.apk").execute([], new File('./app/')).text.trim()
        println("apk安装 完成=" + result)
        //重启
        ("adb shell stop").execute([], new File('./')).text.trim()
        ("adb shell start").execute([], new File('./')).text.trim()
    }
}

其实还可以做很多事情,比如统计每个命令的耗时,或者apk命名加上时间和版本号等简单功能。

相关文章

  • Gradle 自定义Task

    Gradle 自定义Task 自定义task 实现自动化系统签名,push安装,重启设备等操作 Task 实现 a...

  • 如何5分钟让你的 SDK 拥有热修复能力(原理篇)

    前言 看完本文可以达到什么程度 自顶向下分析 学会 hook task 学会自定义 task,自定义 gradle...

  • Gradle自定义插件

    1、自定义插件的方式 类似于自定义task,gradle自定义插件的方式也是三种,而且步骤和自定义task基本类似...

  • Gradle相关内容

    form: Gradle学习系列 扩展task属性/自定义task属性 使用DAG(有向非循环图)进行配置 gra...

  • Gradle快速入门

    Gradle快速入门创建Task的多种方法读懂Gradle语法增量式构建自定义Property使用java Plu...

  • 最近需要做的事

    技术上 学习tinker(使用+ 源码 + 自定义task) Gradle transform api使用 Gra...

  • Gradle学习

    Gradle基础 1、Task 在Gradle中一个原子性的操作叫做task,可以简单理解为task是Gradle...

  • Gradle —— 自定义 Plugin(1)

    自定义 Plugin 可以向任意一个 Gradle 类进行操作。比如向 Project 添加 Task、Confi...

  • Gradle:Task # finalizedBy()

    Gradle:Task # finalizedBy() 这篇文章对Gradle的Task对象的finalizedB...

  • Gradle Task 学习

    Task Task是Gradle中的最小执行单元,要学gradle那么对Task必须要了解先看一下 Task的构造...

网友评论

    本文标题:Gradle 自定义Task

    本文链接:https://www.haomeiwen.com/subject/vtbfzctx.html