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 ...
随机推荐
- 用Docker封装一个web应用(Django)
一.复用以前一个封装了SSH的镜像,如果没有封装SSH,可以使用自己的镜像或参考我以前博文:叫板OpenStack:用Docker实现私有云 的前五步 接下来便是正题. 二.部署过程 1.查看镜像 R ...
- 一个screen的简单配置。。
# Start message startup_message off defencoding utf- encoding utf- utf- shell bash hardstatus always ...
- java工程中的.classpath<转载>
第一部分:classpath是系统的环境变量,就是说JVM加载类的时候要按这个路径下去找,当然这个路径下可以有jar包,那么就是jar包里所有的class. eclipse build path是ec ...
- 【转】【MySQL】mysql 通过bin-log恢复数据方法详解
mysql中bin-log在mysql默认状态下是没有打开的,我们要先打开mysql 开启bin-log功能,然后再通过备份的bin-log进行数据库恢复了. 具体的操作是通过mysqlbinlog这 ...
- Framework/base 下添加自定义模块的步骤
在Android源码编译成功的基础上,重新编译带自己API的android.jar需要进行以下几个步骤操作:1.添加自己的源代码,在android源码的frameworks/base目录下新建一个文件 ...
- 利用Spring MVC搭建REST Service
之前写过一篇 利用JAX-RS快速开发RESTful 服务 今天来看下spring-mvc框架如何实现类似的功能: 一.pom.xml <?xml version="1.0" ...
- stringstream的用法【转】
[本文来自]http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alantop/archive/2007/07/ ...
- 工作随笔——一次简单的Maven加速构建实战
注意:所有的编译.打包.部署全部是通过Jenkins完成的. 公司内部有一个项目,开始做的时候已经预计到会有很多客服端.所以开发就搞了如下的结构: fft-api # 公用的API,所有的程序都必须使 ...
- Struts2 动态结果和带参数的跳转
完整代码:Struts16ActionResultsDemo.rar 1.动态结果. 有时我们需要在Action里取得我个要转跳的页面 看一下我们的struts.xml <?xml versio ...
- Javascript的精华啊【如果以后我看到了或者想到了再继续补吧】
我不过略有一些讨人喜欢的地方而已,怎么会有什么迷人的魔力呢? 一.语法 JS只有一个数字类型,64位浮点数,所以1和1.0是相同的.为什么这么设计:防止短整型的溢出. 二.对象 1.通常将一个对象的值 ...