Gradle,Groovy与Android Studio中的Gradle详解
Gradle篇
Gralde简述
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。同时它也是一个编程框架,不能实现软件中的任何实际功能,Gradle支持Groovy,java,scala, Groovy写完就可以执行,Groovy将会被编译成Java class然后启动虚拟机来执行,gradle和其他插件一样独立于Android Studio 运行。
如果安装了Android Studio,那么在用户/.gradle/wrapper/dists下就已经安装好了Gradle。
学习gradle还是需要下载Gradle并配置Gradle的环境变量,Groovy语言的基础语法
Gradle基础知识
Gradle DSL官方文档https://docs.gradle.org/current/dsl/
整个构建脚本会委托给一个项目的对象,Gradle DSL中所有的关键字都是对象的属性或其中的方法
,gradle会进入到groovy的执行模型,并使用一种叫做抽象语法树转换的Groovy高级功能,因此调用task函数可以 task myTask。
下列是简单的gradle例子
project.task("task1")
task("task2")
task "Task3"
task Task4
task myTask{
description "a param"
group "a group"
doLast{
println "test"
}
}
Groovy篇
Groovy简述
Groovy 是Java平台上设计的面向对象编程语言。这门动态语言拥有类似Python、Ruby中的一些特性,可以作为Java 平台的脚本语言使用。 Groovy 的语法与Java 非常相似,绝大多数的Java 代码也是正确的Groovy 代码。Groovy 代码动态的被编译器转换成Java 字节码。由于其运行在JVM 上的特性,Groovy 可以使用其他Java 语言编写的库,Groovy非常适用于创建特定领域语言(DSL)。
只需要将Groovy代码置于创建的build.Gradle文件中,就可以要求Gradle执行该文件中的任何任务
Groovy基础知识:
用几个Gradle例子展示
先创建一个名字为==build.gradle==的文件,用文本编辑器写入下面的代码
例 1:
task helloWorld <<{}
println "Hello, World!"
然后用命令行输入 gradle helloWorld,执行上面的build.gradle文件
结果
用groovy编写Gradle
例 2:
task helloWorld <<{}
class GroovyCode{
public static void fun(){
System.out.println("this is groovy code")
}
}
GroovyCode groovyCode =new GroovyCode()
groovyCode.fun()
结果
groovy的变量,在gradle中可以给出变量的具体类型,也可以直接用def 关键字声明一个变量
用${ }创建一个块即可以在字符串中执行简单的grovvy代码,groovy允许将变量类型进行转换,例 3。
例 3:
task helloWorld <<{}
def n = 6.5 //声明变量n并赋值
println " foo has value: $n"
println " string 5+6=${5+6}"
n = "string"
println " n type is ${n.class} , n value is $n "
groovy的函数,def fun(n){ },def并不是函数的返回类型,函数也不需要返回语句,函数块中的最后一个表达式既是函数返回的内容。。。groovy函数调用无参函数需要加括号,调用带参数函数时通常可以省去括号!!,这在AndroidStudio Gradle中应用很多,参数之间要用”,”隔开,
groovy支持嵌套函数调用
AS的Gradle中 targetSdkVersion 25 既是调用了函数 targetSdkVersion(25)
例 4:
task helloWorld <<{}
def doubleN(n){
n*2
}
def index = 5
println "double $index = ${doubleN(index)}"
index = "abc123"
println "double $index = ${doubleN(index)}"
例 5:
task helloWorld <<{}
def noArgs(){
println "no args func"
}
def oneArgs(x){
println " 1 args func with $x"
x
}
def twoArgs(x,y){
println "two args func with $x and $y"
x+y
}
noArgs()
oneArgs 100
twoArgs 200,300
twoArgs oneArgs(200),300
Groovy闭包和高阶函数:
闭包实际上是一种不同的函数声明方式,他可以被打包,传递,赋值给变量的函数,他可以从封闭的环境中获取变量,闭包可以在不同变量之间传递,闭包为参数设置了不同的语法,把参数放在”->”的左边,def doubleN={ x->x*2 }。
Gradle允许高阶函数,即函数的参数为函数。
例 6:
task helloWorld <<{}
def doubleN = { x->x*2 } //将x变成2x的闭包
def funcTwice(func,arg){
func(func(arg))
}
def n=5
def nDoubleTwice = funcTwice(doubleN,n)
println"doubleN twice $n to $nDoubleTwice"
Groovy中的 List:
例 7:
task groovy <<{}
def myList=["Gradle","Groovy","Android"] //创建一个简单的列表
def printItem={item->println"list is : $item"}
myList.each(printItem)
Groovy中的类
Groovy 自动为所有成员变量设置get和set,实例 .变量的方式即可调用,闭包可以设置代表对象
例 8:
task aTest<< {}
class AClass{
String s ="a String" //变量
def printS(){ println "A String: $s"} //函数
}
def myClass=new AClass()
myClass.printS()
myClass.s ="My String "
myClass.printS()
例 9:
task aTest<< {}
class AClass{
String s ="a String"
def printS(){ println "A String: $s"}
}
def myClass=new AClass()
def sChange={
s ="A new String "
printS()
}
sChange.delegate=myClass //把ACLass的实例赋给闭包的委托对象
sChange()
Gradle在Android Studio中的应用
Gradle提供了构建Android应用的解决方案,从定义到集成软件交付流程各个部分的一站式服务。
构建流程涉及许多将项目转换成 Android 应用软件包 (APK) 的工具和流程如下
如上图所示,典型 Android 应用模块的构建流程通常依循下列步骤:
- 编译器将您的源代码转换成 DEX或ELF文件(其中包括运行在Android 设备上的字节码),将所有其他内容转换成已编译资源。
- APK 打包器将 DEX或ELF 文件和已编译资源合并成单个 APK。不过,必须先签署APK,才能将应用安装并部署到 Android 设备上。
-
APK 打包器使用调试或发布**库签署您的APK:
a. 如果您构建的是调试版本的应用(即专用于测试和分析的应用),打包器会使用调试**库签署您的应用。Android Studio 自动使用调试**库配置新项目。
b. 如果您构建的是打算向外发布的发布版本应用,打包器会使用发布**库签署您的应用。要创建发布**库,请阅读在 Android Studio 中签署您的应用。
- 在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,减少其在设备上运行时的内存占用。
构建流程结束时,您将获得可用来进行部署、测试的调试 APK,或者可用来发布给外部用户的发布 APK。
过去构建只是编译打包源代码,现在构建会从测试,多个路径的代码资源,生成文档,创建多个构建变种,发布应用程序和管理依赖库,可以不断更改,测试和发布应用。
Android Studio工程目录中的Gradle
在Android Studio创建的工程中, gradle文件被执行后会自动生成.gradle文件夹,储存了任务的输入内容和输出结果,另Android Studio中.idea文件夹储存了项目模块的位置,build目录储存了build输出任务
结果,build目录储存了wrapper JAR和wrapper属性,gradlew和gradlew.bat是两个wrapper的脚本
local.perties本地SDK位置
Android Studio中插件的功能
可以生成一个工程的多个版本,比如 release/debug,付费/免费。
可以使各版本之间共代码和其他资源变得容易
可以生成一个工程的多个版本,比如 release/debug,付费/免费。
可以使各版本之间共代码和其他资源变得容易
可以逐个管理依赖和更改manifest中的内容
Android默认的构建脚本比较复杂,它是个多项目构建,==Android本身是Gradle中的一个子项目==,其他项目可以为数据库,后端等。
例子说明Android Studio中各个gradle的作用
新建一个空工程
classpath ‘com.android.tools.build:gradle:3.0.0-beta2’ 这句话就是声明Android插件所在的位置。
jcenter()为每一个子项目添加jcenter仓库,意味着每个子项目都可以声明依赖关系,它们自动从jcenter中检索。
apply plugin: ‘com.android.application’是取自jcenter的Android插件。这里所有的配置都在Android配置程序块中进行,下面这两行是必须的,他们定义了SDk的版本和gradle的版本
compileSdkVersion 26 //sdk版本
buildToolsVersion "26.0.1" //工具版本
//默认配置程序块用于配置Android manifest的属性
defaultConfig {
applicationId "com.example.xiyu_sx.myapplication"
minSdkVersion 21
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
//依赖关系块可以声明libs目录中每一个jar文件和Android support 库编译时期的依赖关系
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.0.1'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.0'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.0'
}
buildTypes { //构建类型,当前为release版本
release {
minifyEnabled false //是否混淆
//混淆器位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
关于提高gradle编译速度
Gradle构建有一个生命周期,可以分为三个不同的阶段:
- 初始化 - 扫描项目,找出要构建的项目。
- 配置 - 运行build.gradle脚本并构建任务图。
- 执行 - Gradle实际构建您的应用程序的有用部分
网上方法有很多种,在新版本的gradle面前很多都已过时,我测试了多个方法,以下这些方法是提升较大的。
1. 提高gradle版本,gradle每次官方更新都会对构建速度进行优化
2. 让gradle预处理依赖库
3. 让gradle按需配置
3. 增加gradle的最大线程数 : 在执行构建过程中同时使用多个线程,好处是可以并行配置项目,快速构建没有更改的项目配置。
4. 开启守护进程 : 因为Gradle是需要启动的JVM进程,加载JVM,加载类,JIT等等。限制所有这些开销的影响正是Gradle守护进程所做的。
5. 电脑配置较高可以增加编译所需堆内存的大小,一个是android gradle下的,一个gradle下的gradle.properties
android{
...
dexOptions {
preDexLibraries true //预处理依赖
maxProcessCount 8 //最大线程数
javaMaxHeapSize "2048m" //内存大小
}
}
//gradle.properties文件里的更改是对整个项目有效
org.gradle.configureondemand=true //按需配置
org.gradle.jvmargs=-Xmx4096m //gradle项目分配堆内存大小
org.gradle.daemon=true //守护进程
上一篇: Eclipse中创建gradle项目
下一篇: 94.二叉树的中序遍历
推荐阅读
-
Gradle在Android Studio中的简单使用
-
Gradle在Android Studio中的应用技巧
-
Android Studio中Gradle使用详解
-
Android Studio中ButterKnife插件的安装与使用详解
-
详解Android中Glide与CircleImageView加载圆形图片的问题
-
Android编程中的四大基本组件与生命周期详解
-
Android 中Fragment与Activity通讯的详解
-
Android Studio中ButterKnife插件的安装与使用详解
-
Android如何在Gradle中更改APK文件名详解
-
详解Android中Glide与CircleImageView加载圆形图片的问题