转载: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" ) ) } } |
总结