欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Gradle,Groovy与Android Studio中的Gradle详解

程序员文章站 2024-01-11 16:29:16
...

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) 的工具和流程如下

Gradle,Groovy与Android Studio中的Gradle详解

如上图所示,典型 Android 应用模块的构建流程通常依循下列步骤:

  1. 编译器将您的源代码转换成 DEX或ELF文件(其中包括运行在Android 设备上的字节码),将所有其他内容转换成已编译资源。
  2. APK 打包器将 DEX或ELF 文件和已编译资源合并成单个 APK。不过,必须先签署APK,才能将应用安装并部署到 Android 设备上。
  3. APK 打包器使用调试或发布**库签署您的APK:

    a. 如果您构建的是调试版本的应用(即专用于测试和分析的应用),打包器会使用调试**库签署您的应用。Android Studio 自动使用调试**库配置新项目。

    b. 如果您构建的是打算向外发布的发布版本应用,打包器会使用发布**库签署您的应用。要创建发布**库,请阅读在 Android Studio 中签署您的应用。

  4. 在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,减少其在设备上运行时的内存占用。
    构建流程结束时,您将获得可用来进行部署、测试的调试 APK,或者可用来发布给外部用户的发布 APK。

Gradle,Groovy与Android Studio中的Gradle详解
过去构建只是编译打包源代码,现在构建会从测试,多个路径的代码资源,生成文档,创建多个构建变种,发布应用程序和管理依赖库,可以不断更改,测试和发布应用。
Gradle,Groovy与Android Studio中的Gradle详解

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的作用

新建一个空工程

Gradle,Groovy与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构建有一个生命周期,可以分为三个不同的阶段:

  1. 初始化 - 扫描项目,找出要构建的项目。
  2. 配置 - 运行build.gradle脚本并构建任务图。
  3. 执行 - 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          //守护进程
  1. 使用开源增量编译工具,比如freeline,是一款阿里巴巴的开元工具,可以多任务并发,多级缓存,增量范围最小化,懒加载,基于长链接无安装式运行期动态替换,基线对齐触发机制,可调试多任务并发,github地址网上教程
  2. 项目组件化,利于gradle构建。