关于Gradle

栏目: IOS · Android · 发布时间: 6年前

内容简介:Gradle是基于Apache Ant和Apache Maven概念的自动化构建工具。他使用一种基于Groovy的DSL来声明项目设置。Gradle能够:自动处理包相依关系(取自 Maven Repos 的概念)

什么是Gradle

Gradle是基于Apache Ant和Apache Maven概念的自动化构建工具。他使用一种基于Groovy的DSL来声明项目设置。

Gradle能够:

自动处理包相依关系(取自 Maven Repos 的概念)

自动处理布署问题(取自 Ant 的概念)

条件判断写法直觉(使用 Groovy 语言)

Gradle的编译过程

Gradle中有两个对象:Project、Task。

每个项目的编译至少有一个Project,一个build.gradle就代表一个project,每个project里面包含了多个task,task里包含了多格action。action包含了需要被执行的代码。

编译过程中,Gradle会根据build相关文件,聚合所有的project和task,执行task中的action。

执行顺序由依赖逻辑来保证。所有的task都需要依赖其他task来执行,没有被依赖的task首先被执行。

编译过程分为:

1.初始化阶段: 创建project对象。

2.配置阶段: 执行所有的编译脚本,同事创建project的所有task。

3.gradle根据传入的参数决定如何执行这些task。

Gradle Files

setting.gradle 用于定义加入编译过程的module

顶层的build.gradle 最终被应用到所有项目中

顶层的build.gradle

buildscript:定义了Android编译 工具 的类路径。

allprojects:定义的属性会被应用到所有module中。

每个项目的build.gradle

1.apply plugin:定义了gradle插件。

eg:

apply plugin "com.android.application"

2.android:用于配置android的所有特殊配置。这个是前年声明的plugin提供的

(1)defaultConfig:程序的默认配置。

(2)buildType:定义了编译类型。可以针对每个类型进行不同的配置。(release。debug等)

3.dependencies:是gradle的依赖配置。定义了当前项目需要依赖的其他库。

Gradle Wrapper

gradle wrapper用于处理对以往项目的兼容性问题。

Gradle basics

Gradle会根据build文件的配置生成不同的task。我们可以直接单独执行每个task。

可以使用 ./gradlew task 列出所有的task。如果想要列出每个task对应依赖的其他task,可以使用 ./gradlew task -all

Android tasks

基本的四个task:

1.assemble:对所有的buildType 生成apk包

2.clean:移除所有的编译输出文件,比如apk包

3.check:执行lint检测编译

4.build:同时执行assemble和check命令

Configuration

BuildConfig

可以在buildTypes中配置一些key-value对。他们会体现在BuildConfig中

repositories

Repositories:就是代码仓库,我们平时的添加的一些 dependency就是从这里下载的,Gradle 支持三种类型的仓库:Maven,Ivy和一些静态文件或者文件夹。

在执行阶段,gradle会从仓库中取出对应需要的依赖文件。

除了使用远程库以外,还可以使用相对路径配置本地仓库:

repositorys {
  flatDir {
    dirs "aars"
  }
}

Local dependencies

File dependencies

通过files()方法可以添加文件依赖,也可以通过fileTree()添加一个文件夹:

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
}

Native libraries

配置本地 .so 库:

android {
  sourceSets.main{
    jniLibs.srcDir 'src/main/libs'
  }
}

Library projects

如果要写一个library项目让其他项目引用,则需要使用一下plugin:

apply plugin: 'com.android.library'

Build Variants

编译时动态根据当前的编译类型输出不用样式的apk文件。这时候就需要使用buildType了

BuildType

Source Sets

每当创建新的build type的时候,gradle默认会创建一个信息source set。我们可以建立与main文件夹同级的文件夹,根据编译类型的不同可以选择对某些源码直接进行替换。

Product flavors

前面build type的做法能够对同一份源码编译同一个程序的不同类型,如果我们需要针对同一份源码编译不同的程序,就需要用到Product flavors;

所有的product flavor版本和defaultConfig共享所有属性

和build type一样,product flavor也有自己的source set文件夹。除此之外,build type和product flavor可以结合,他们的文件夹里面的文件优先级甚至高于单独的build type和product flavor文件夹的优先级。

android {
  flavorDimensions "color", "price"

  productFlavors {
    red {
      flavorDimension "color"
    }

    blue {
      flavorDimension "color"
    }
    free {
      flavorDimension "price"
    }

    paid {
      flavvorDimension "price"
    }
  }
}

Signing configurations

签名相关。

当我们打包市场版时,我们需要输入keystore数据,如果是debug版本系统会帮我们配置这些信息。这些信息在gradle中都配置在signingConfigs中:

android {
  signingConfigs {
    staging.initWith(signingConfigs.debug)

    release {
      storeFile file("release.keystore")
      storePassword "secretpassword"
      keyAlias "gradleforandroid"
      keyPassword "secretpassword"
    }
  }
}

配置之后可以再build type中直接使用

android {
  buildTypes {
    release {
      signingConfig signingConfigs.release
    }
  }
}

Optimize

Speeding up multimodule builds

可以通过以下方式加快gradle编译:

开启并行编译:在项目根目录下的gradle.properties中设置

org.gradle.parallel=true

开启编译守护进程:该进程在第一次启动后会一直存在,当第二次编译的时候,可以重用该进程。

org.gradle.daemon=true

加大可用编译内存:

org.gradle.jvmargs=-Xms256m -Xmx1024m

Reducing apk file

在编译时,我们可能会有很多资源并没有用到,此时可以通过 shrinkResources 来优化我们的资源文件,除去不必要的资源

android {
  buildTypes {
    release {
      minifyEnabled = true
      shrinkResources = true
    }
  }
}

某些情况下,一些资源需要通过动态加载的方式载入,这时候就需要在res/raw/下简历一个keep.xml文件,通过以下方式keep资源:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />

Manual shrinking

对于一些特殊文件或者文件夹,例如国际化资源文件、屏幕适配资源等。如果我们已经确定过了某种幸好,而不需要重新适配,就可以去掉不可能被适配的资源:

android{
  defaultConfig {
    resConfigs "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
  }
}

Profiling

当我们执行所有task的时候,都可以添加–profile参数生成一份执行报告在 reports/profile 中。

Practice

在开发中,我们可能需要自己自定义task。这就需要用到Groovy了。

Groovy

Groovy我打算专门去学习一下。这里就不记录了。

通过hook Android编译插件重命名apk

android.applicationVariants.all {
  variant.outputs.each { output ->
    def file = output.outputFile

    output.outputFile = new File(file.parent, file.name.replace(".apk", "-${variant.versionName}.apk"))
  }
}

学习资料来自: https://www.jianshu.com/p/9df3c3b6067a


以上所述就是小编给大家介绍的《关于Gradle》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Security, Privacy and Commerce, 2nd Edition

Web Security, Privacy and Commerce, 2nd Edition

Simson Garfinkel / O'Reilly Media / 2002-01-15 / USD 44.95

Since the first edition of this classic reference was published, World Wide Web use has exploded and e-commerce has become a daily part of business and personal life. As Web use has grown, so have ......一起来看看 《Web Security, Privacy and Commerce, 2nd Edition》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器