Android studio:Groovy 与 Gradle 基础【三】
转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=255064&extra=page%3D2%26filter%3Dauthor%26orderby%3Ddateline&_dsign=276e9e2e
问题与解决方案
- 原理不懂:学习 Groovy 与 Gradle 的基础原理
- Gradle 实践不懂:学会找示例,学习开源例子
- 方法和属性不懂:学会查文档
学习 GroovyGroovy 概述
简单的来讲 DSL 是一个面向特定小领域的语言,如常见的 HTML、CSS 都是 DSL,它通常是以配置的方式进行编程,与之相对的是通用语言(General Purpose Language),如 Java 等。
- 环境安装
- 语言基础
- 语言特性及其本质
环境安装
- Windows 下推荐 binary 包配置环境变量
- Mac 下推荐使用 sdkman 或者 Brew 进行安装
- Linux 下推荐 sdkman
- 嵌入在程序中,则推荐使用 Maven 远程依赖
- 下载安装 sdkman,执行下面命令,按照提示安装即可
| 1 | $ curl -s http://get.sdkman.io | bash |
- 使环境变量生效
| 1 | $ source "$HOME/.sdkman/bin/sdkman-init.sh" |
- 安装 Groovy
| 1 | $ sdk install groovy |
- 查看当前版本,如果能否运行且输出对应版本,就是成功了
| 1 2 |
$ groovy -version Groovy Version: 2.4.4 JVM: 1.8.0_25 Vendor: Oracle Corporation OS: Mac OS X |
初探
- 新建文件
| 1 | $ vim test.groovy |
- 在其中写上内容
| 1 | println "hello, world!" |
- 保存退出,执行
| 1 2 |
$ groovy test.groovy hello, world! |
语言基础
例子都已经传到 github 的 demo 项目中。第一次使用 demo 项目的时候,需要等待自动下载几个远程包。
笔者一个 Java 程序员,可以你能够看到很多 Java 的习性还是留在代码中。
文件与类,变量与函数
ScriptClass.groovy
| 1 | println 'hello,world' |
groovy/build/classes/main/io/kvh/as/groovy/ScriptClass.class
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class ScriptClass extends Script { public ScriptClass() { CallSite[] var1 = $getCallSiteArray(); } public ScriptClass(Binding context) { public static void main(String... args) { public Object run() {//关键方法 |
VarAndMethod.groovy
| 1 2 3 4 5 6 7 8 9 10 |
def varAndMethod() { def a = 1//不显式声明变量类型 a = "abc"//运行时改变类型 println a//无需;结束一行代码 println ret//输出4 |
字符串
Quoted.groovy
| 1 2 3 4 5 6 7 8 9 10 |
def quoted() { def singleQ = 'hello, single quot'// 声明为java.lang.String def doubleQ = "hello, double quot ${singleQ}"// 如果有${},则为groovy.lang.GString,支持变量替换;否则为java.lang.String def tripleQ = '''hello, triple quot'''// 允许多行,而不需要+号 println singleQ |
| 1 2 3 |
"""...""" /.../ $/.../$ |
List,Array 和 Map
Collections.groovy
| 1 2 3 4 5 6 7 |
def playList() { def lst = ["a",2,true]//支持不同类型元素 println(lst) playList() |
| 1 2 3 4 5 6 7 8 9 |
def playArray() { def intArr = [1, 2, 3] as int[]//显示声明 String[] strArr = ["a", "b"]//另外一种方式 println(intArr) playArray() |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def playMap() { def map = [a: "a", b: "b"] println(map) def key = "name" def map2 = [key: 'a']//未使用 def map3 = [(key): 'a']//使用 println(map2) playMap() |
import
- 默认 import,这些类都是被默认 import 到代码中的,可以直接使用
| 1 2 3 4 5 6 7 8 |
import java.lang.* import java.util.* import java.io.* import java.net.* import groovy.lang.* import groovy.util.* import java.math.BigInteger import java.math.BigDecimal |
- import alias
Import.groovy
| 1 2 3 |
import java.lang.String as KString
println(new KString("aaa")) |
语言特性及其本质Closure(闭包)
| 1 | { [closureParameters -> ] statements } |
Closure.groovy
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def defaultIt() { 3.times { println it //默认参数 it } } defaultIt() closureObj() |
面向对象特性
- 定义和实例化一个类
GroovyCLass.groovy
| 1 2 3 4 5 6 7 |
class People{ String name int age } People p1 = new People(); |
- 方法的默认参数
| 1 2 3 4 5 6 |
def foo(String p1, int p2 = 1) { println(p1) println(p2) } foo("hello") |
- Field 和 Property
| 1 2 3 4 |
class People{ String name int age } |
- Trait
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
trait Fly { void fly() { println("fly") } } trait Walk { class Duck implements Fly, Walk { } Duck duck = new Duck() |
Groovy 基础小结
学习 GradleGradle 安装
- 下载 zip 安装包
- Mac 下使用 home brew
| 1 | brew install gradle |
- 推荐:使用 IntelliJ IDEA(Android Studio)自带的 wrapper 结构来下载 Gradle
Wrapper 是为了让不同版本的插件能够使用其对应版本的 Gradle 的一个机制Gradle Wrapper 会把不同的版本 Gradle 安装在:
| 1 | $USER_HOME/.gradle/wrapper/dists |
Gradle Build 的生命周期
| 1 2 3 4 5 6 7 8 |
. ├── app //app module │ ├── build.gradle //app module 的 build.gradle ├── build.gradle //项目 build.gradle,通常配置项目全局配置,如 repositories 和 dependencies ├── gradle.properties //项目属性文件,通常可以放置一些常量 ├── lib //lib module │ ├── build.gradle //lib module 的 build.gradle └── settings.gradle //项目总体设置,通常是配置项目中所有的 module |
Gradle 构建三个阶段:
- 初始化:Gradle 支持单 module 构建和多 module 构建(Android Studio 创建的项目默认是多 module)。初始化阶段,Gradle 会为每一个 module 中的 build.gradle 文件创建一个 Project 实例。
- 配置:项目根目录的 build.gradle 会首先被执行
- 执行:执行所选取的 task
Settings.gradle
settings.gradle
| 1 2 3 |
include ':app', ':groovy'
println 'print in settings.gradle' |
| 1 | ./gradlew -p groovy build |
Task
groovy/build.gradle
| 1 2 3 4 5 |
task hello { doLast { println 'Hello,' } } |
| 1 2 |
$ ./gradlew hello Hello, |
| 1 2 3 |
task World << { println 'World!' } |
| 1 2 3 |
task hi { println 'description hi' } |
| 1 | println 'hi' |
| 1 2 3 4 5 6 7 8 9 10 11 |
task hello { doLast { println 'Hello,' } } task intro(dependsOn: hello) << { World.finalizedBy hello |
Plugin
| 1 | apply plugin: java |
| 1 | apply from: 'file_uri.gradle' |
Gradle 实践参考
| 1 2 3 4 5 6 7 8 9 10 11 12 13 |
android.applicationVariants.all { variant ->//获取 variant 参数,就是 productFlavor x buildType variant.outputs.each { output ->//获取输出文件 def file = output.outputFile//修改实例 output.outputFile = new File( (String) file.parent, (String) file.name.replace( file.name, // alter this string to change output file name "Your_Apk_Name_" + variant.name + "_" + variant.versionName + ".apk" ) ) } } |
总结
Android studio:Groovy 与 Gradle 基础【三】的更多相关文章
- 拥抱 Android Studio 之五:Gradle 插件开发
实践出真知 笔者有位朋友,每次新学一门语言,都会用来写一个贪吃蛇游戏,以此来检验自己学习的成果.笔者也有类似体会.所谓纸上得来终觉浅,绝知此事要躬行.这一章,笔者将以开发和发布一个 Gradle 插件 ...
- 关于Android Studio里的Gradle,你所需要知道的都在这里了
Gradle介绍 Gradle是一个先进的build toolkit,可以方便的管理依赖包和定义自己的build逻辑.到底有多先进,Android Studio官方集成Gradle,Google还专门 ...
- [Learn Android Studio 汉化教程]第三章:使用 Android Studio 编程
[Learn Android Studio 汉化教程]第三章:使用 Android Studio 编程 本章包含如何在 Android Studio 中书写或生成代码. Android Studio ...
- android studio中为gradle指定cmake版本
Android Studio相当于是Intellij基础上写了一个AS插件,这个插件使用gradle作为构建系统,因此构建出现问题先考虑gradle的文档. gradle可以使用native buil ...
- 【Android Studio安装部署系列】三十、从Android studio2.2.2升级到Android studio3.0之路
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 Android Studio 3.0的新功能 https://mp.weixin.qq.com/s/2XmVG4mKEDX6-bvZ ...
- Android Studio之回退Gradle版本方法
Android Studio之回退Gradle版本方法 (Minimum supported Gradle version is 4.10.1. Current version is 4.6.) ...
- Android : Android Studio 更新至gradle 4.10.1后Variants API变化
同步警告: WARNING: API 'variantOutput.getPackageApplication()' is obsolete and has been replaced with 'v ...
- 【已解决】Android Studio下,gradle project sync failed 错误
原文:[已解决]Android Studio下,gradle project sync failed 错误 Android studio下突然报错 gradle project sync failed ...
- Android studio第一次使用配置(三)gradle项目构建
1.gradle的概念 2.gradle配置jar包.和libs目录导入jar包的差别 3.签名打包: (1)Studio (2)命令行 (3)gradle wrapper的原理 4.BuildCon ...
随机推荐
- Location of several networks in brain
Source: Naci, L., et al. (2014). "A common neural code for similar conscious experiences in dif ...
- bootstrap div 弹出与关闭
html <div id="myModal" class="modal" tabindex="-1" role="dialo ...
- python处理经过gzip压缩的网页内容
Python在进行网页抓取时,有时会获取到经过gzip压缩后的数据(体积小,传输快),导致无法阅读和使用. 如图所示,为http原始报文.可以看到,header区域的“Content-Encoding ...
- sublime 函数跳转插件 — ctags 安装和使用
ctags 是 sublime 下一个函数跳转的插件,可以让你方便地从函数调用的位置跳到函数定义的位置.相对于其他插件,ctags 的安装稍微有点复杂,这里记录下备忘. 首先,假设已经安装 Packa ...
- GitHub中国区前100名到底是什么样的人?
本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百名的用户属性,剖析这些活跃在技术社区的牛人到底是何许人也!后续会根据我的一些经验出品<技术人员 ...
- Linux进程间通信之管道
1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共 ...
- web安全——代理(nginx)
场景 过滤非正常用户使用的http请求. 限制正常用户使用的范围(下载速度.访问频率等). 通过架构规划来提升安全. 能自动解决http请求问题. 解决方案 代理自身的安全 千万不要使用root启动! ...
- 备忘:powerbroker运行一个命令
pbrun su<space>-<space><taget user name> example: pbrun su - pmsdev
- Oracle中修改表名遇到“ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”
Oracle 11g中想修改表名: rename ASSETPORJECT to ASSETPROJECT; 结果提示:ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超 ...
- java机器学习工具包
下面是25个Java机器学习的工具&&库列表: 1. Weka 是一个数据挖掘任务机器学习算法的集合.这些算法可以直接应用于数据集或者在你自己的Java代码中调用.Weka 包含 数据 ...