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 ...
随机推荐
- XAMPP中proftpd的简明配置方法
XAMPP中proftpd的简明配置方法 用LAMPP的安装方法可以开一个默认的nobody用户,用lampp security就可以初始设置相应的默认用户密码.如果要有多用户,又怎样管理.目录怎 ...
- IE8 HACK介绍
1.‘\9’: eg:.test { color/*\**/: blue\9 }.header {width:300px;} /* 所有浏览器*/.header {width/*\**/:330px\ ...
- 用 Orchard 建立 Dynamics CRM 的入口网站
不知道国内用Orchard建网站的多不多,我个人强烈推荐这个CMS系统- 使用最新进的微软.Net 技术,而且免费!Orchard中文版在这里. 我之前写了一个基于Orchard的插件(Module) ...
- indows 8上强制Visual Studio以管理员身份运行
http://diaosbook.com/Post/2013/2/28/force-visual-studio-always-run-as-admin-on-windows-8 Windows 8的一 ...
- scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类
一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...
- ios蓝牙开发(四)app作为外设被连接的实现-转发
代码下载: 原博客中大部分示例代码都上传到了github,地址是:https://github.com/coolnameismy/demo. 再上一节说了app作为central连接periphera ...
- .NET MVC HtmlHepler
一.HtmlHepler 1.ActionLink() 动态生成 超链接:根据路由规则,生成对应的 html 代码. //1.注册路由信息 routes.MapRoute( name: "D ...
- DOM之parentNode与offsetParent
DOM中有两个属性parentNode和offsetParent,想必区别大家都是知道的,可用法上还是有一些需要注意的地方,尤其是后者,想知道吗?继续往下看咯. parentNode指的是父节点,el ...
- Windows Phone 8 下载文件进度
后台代码: public partial class MainPage : PhoneApplicationPage { private long siz; private long speed; p ...
- JavaScript学习笔记-元素在滚动条滑动一定高度后自动置顶
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...