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()
}
}

Gradle DSL Walle渠道包后安装启动APP的更多相关文章

  1. spring boot mybatis 打成可执行jar包后启动UnsatisfiedDependencyException异常

    我的spring boot + mybatis项目在idea里面执行正常,但发布测试环境打成可执行jar包后就启动失败,提示错误如下: [ ERROR] [2018-08-30 17:23:48] o ...

  2. 新一代开源Android渠道包生成工具Walle

    本文转自:http://tech.meituan.com/android-apk-v2-signature-scheme.html 新一代开源Android渠道包生成工具Walle 新的应用签名方案A ...

  3. [转]安卓新一代多渠道打包工具Walle 解决渠道包V2签名问题

    转自https://www.jianshu.com/p/572b59829a08 为什么要打多个渠道的包? 大家都知道,android应用商店大大小小有几百个,作为一个有志向的app,就需要做到统计各 ...

  4. mysql安装后服务启动不了(总结)

    mysql安装后服务启动不了 1.1 前言 最近真的是倒霉到家,装个mysql都能把所有的问题给问候了一遍······不过这也是一个宝贵的经验,得好好总结下,毕竟也不知道以后会不会再次遇到.如果有网友 ...

  5. Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析

    前言 前些天,测试MM发现了一个比较奇怪的bug. 具体表现是: 1.将app包通过电脑QQ传送到手机QQ上面,点击安装,安装后选择打开app (此间的应用逻辑应该是要触发 [闪屏页Activity] ...

  6. 【转载】Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析

    前言 前些天,测试MM发现了一个比较奇怪的bug. 具体表现是: 1.将app包通过电脑QQ传送到手机QQ上面,点击安装,安装后选择打开app (此间的应用逻辑应该是要触发 [闪屏页Activity] ...

  7. 免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动。

    免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动. 原因是:在启动tomcat是,需要读取环境变量和配置信息,缺少了这些信息,就不能登记环境变量,导致了t ...

  8. 安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案

    安装64位版Oracle11gR2后发现启动SQL Developer时弹出配置java.exe的路径,找到Oracle自带java.exe后产生的路径“C:\app\用户名\product\11.2 ...

  9. 安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案(原创) (2016-10-29 下午01:56)

    安装64位版Oracle11gR2后发现启动SQL Developer时弹出配置java.exe的路径,找到Oracle自带java.exe后产生的路径"C:\app\用户名\product ...

随机推荐

  1. jQuery.proxy(function,context)

    jQuery.proxy(function,context) 概述 jQuery 1.4 新增.返回一个新函数,并且这个函数始终保持了特定的作用域.大理石平台检定规程 当有事件处理函数要附加到元素上, ...

  2. seq2seq聊天模型(二)——Scheduled Sampling

    使用典型seq2seq模型,得到的结果欠佳,怎么解决 结果欠佳原因在这里 在训练阶段的decoder,是将目标样本["吃","兰州","拉面" ...

  3. c 判断数字是否无限

    /* isinf example */ #include <stdio.h> /* printf */ #include <math.h> /* isinf, sqrt */ ...

  4. 手游折扣app票选结果公布哪个好哪个靠谱一目了然

    2018年,是中国改革开放40年,也是中国互联网20年.“互联网推动了精神文明向更高水平的迈进,实现人的价值第一,创造美好生活,从生产高于生活.艺术高于成活,转向发现与实现生活本身美好,让想象成真.如 ...

  5. WIN10环境下点击通知栏图标时自动切换输入法导致图标位置变动

    这个问题由来已久,每当点击系统右下角任务栏中的按钮时,原本是搜狗输入法就会自动变成“US [ 中文(简体,中国) ]”,图标会自动错位,导致响应的是其他功能. 假设上图是正常的环境,此时我点击电池图标 ...

  6. js中判断对象类型的几种方法

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  7. tp中打印sql,查看语句信息

    $a = self::where($where)->fetchSql(true)->select(); dump($a);

  8. Qt:使用Model-View,动态的加载显示数据

    共有 main.cpp, Widget.h, Widget.cpp, Widget.ui, MyModel.h, MyModel.cpp 六个文件. 可从此下载整个工程文件: /Files/biao/ ...

  9. How to appraise Hearthstone card values

    https://elie.net/blog/hearthstone/how-to-appraise-hearthstone-card-values/ In 2014, I became an avid ...

  10. LeetCode —— 单词接龙(Python)

    使用字典,降低查找的复杂度.使用list会超时. class Solution: def nextWordsList(self, word, wordDict): res_list = [] for ...