Gradle DSL Walle渠道包后安装启动APP

DSL(Domain-Specific Language)

Gradle 是一个编译打包工具,但实际上它也是一个编程框架。

Task 是 Gradle 中的一种数据类型,它代表了一些要执行或者要干的工作。不同的插件可以添加不同的 Task。每一个 Task 都需要和一个 Project 关联。

Task 的 API 文档位于:https://docs.gradle.org/current/dsl/org.gradle.api.Task.html

  • 任务创建
task hello {
    doLast {//doLast 可用 << 代替,不推荐此写法
        println "hello"//gradle运行阶段打印出来
    }
}

task hello {
    println "hello"//gradle配置阶段打印出来
}
  • 任务依赖
A 依赖 B,A 又同时依赖 C。但执行的结果可能是 B -> C -> A,我们想 C 在 B 之前执行,可以使用 mustRunAfter

task A << {println 'Hello from A'}
task B << {println 'Hello from B'}
task C << {println 'Hello from C'}
A.dependsOn B  //执行 A 之前会先执行 B
A.dependsOn C //执行 A 之前会先执行 C
B.mustRunAfter C    //B 必须在 C 之后执行

task autoSign { 
  //依赖于其他Task执行完,在执行本Task
  dependsOn ''

  //先执行
  doFirst{ }

  // 后执行
  doLast{ }
}

dependsOn出现如下异常时
A problem occurred evaluating script.
> Could not get unknown property 'installApk' for project ':app' of type org.gradle.api.Project.

解决方案:
  // 对project的生命周期进行监听
    this.afterEvaluate {
        setDependsOn([assembleDebugChannels])
    }

 

实例操作渠道包后自动安装并启动

  • 创建安装启动APP GRADLE
app中build.gradle中添加
apply from: rootProject.file('gradle/launchApp.gradle')
launchApp.gradle内容如下
// 一键安装渠道包 assembleDebugChannels --> installApk --> launchApp
task installApk() {
    // 对project的生命周期进行监听
    this.afterEvaluate {
        setDependsOn([assembleDebugChannels])
    }

    doLast {

        walle{
            // apk path
            def path = "${project.buildDir}/outputs/channels/xxx.apk"
            def command = "adb install -r ${path}"
            executeCommand(command)
            println "installApk success"
        }

    }
}

// 启动APP
task launchApp(dependsOn: installApk) {
    doLast {
        //指定要启动的Activity啦
        def command = "adb shell am  start com.example.xxx/.MainActivity"
        executeCommand(command)
        println "launchApk success"
    }
}


/**
 * 执行shell指令
 * @param command 命令
 * @return
 */
def executeCommand(String command) {
    try {
        exec {
            ExecSpec execSpec ->
                executable 'sh' args '-c', command
        }
    } catch (Exception e) {
        e.printStackTrace()
    }
}
上一篇:Android Build Gradle 升级常见问题


下一篇:redis启动出错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error(转)