Android中的Gradle之配置及构建优化

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

内容简介:Gradle是一种项目自动化构建工具,基于Groovy语言来声明项目设置,同时支持kotlin文件xxx.gradle.kts作为DSL(Domain Specified Language)。对与最直接的比较就是Gradle和Maven的比较,还有Ant,不过目前基本没有什么基于Ant构建的项目这里就不提了。首先Gradle的简易性比Maven要好的多。Groovy语法的书写和可读性要比Maven中的Xml方便很多。

Gradle是一种项目自动化构建工具,基于Groovy语言来声明项目设置,同时支持kotlin文件xxx.gradle.kts作为DSL(Domain Specified Language)。

2、对比其他构建工具

对与最直接的比较就是Gradle和Maven的比较,还有Ant,不过目前基本没有什么基于Ant构建的项目这里就不提了。

首先Gradle的简易性比Maven要好的多。Groovy语法的书写和可读性要比Maven中的Xml方便很多。

其次,Gradle中自定义功能要比Maven中方便很多。在Gradle中自定义Task即可,在Maven要写插件来实现。

3、Gradle的安装与配置

安装、配置环境变量、测试安装结果。具体参考Gradle官网gradle.org/install/

二、Gradle项目目录结构

1、基本gradle项目

新建build.gradle文件,进入该目录命令行执行 gradle build 便可生成.gradle隐藏文件。这就是基本的gradle项目。

Android中的Gradle之配置及构建优化

命令行执行 gradle wrapper 生成如下结构,该命令是同统一不同开发者使用相同的Gradle构建版本进行构建。

Android中的Gradle之配置及构建优化

如使用多项目构建还需使用setting.gradle等构建脚本,具体在android中的gradle进行介绍。

2、android studio中的gradle目录结构

这里需要一点。在android studio中,Gradle和Android独立运行,这意味着Android的构建并不依赖与IDE,可以配合Gradle单独完成项目的构建。android studio只不过是帮助我们生成了一个目录结构并界面化的处理Gradle中的任务。

我们先看一下新建andorid项目的目录结构

Android中的Gradle之配置及构建优化

三、构建配置文件解释

1、settings.gradle

该文件为gradle设置文件,位于项目根目录,配置项目的多模块构建, include ':app', ':example_module' 表示使用同级目录中的app模块、example_module模块。也可以具体制定模块路径。如下使用

include ':app'
include ':example_module'
project(':example_module').projectDir = new File(rootDir,'example/example_module')
复制代码
Android中的Gradle之配置及构建优化

2、gradle.properties,local.properties

该文件为项目属性文件,可用于保存key-value资源供项目使用。

gradle.properties中android studio会自动帮我们创建 org.gradle.jvmargs=-Xmx1536m 该属性为Gradle后台进程的最大堆大小,最小为1536m,我们也可以自定义修改该值 org.gradle.jvmargs = -Xmx2048m

我们也可以配置其他属性,如 org.gradle.caching=true 让gralde配置使用缓存,减少少编译时间。

其实还有很多属性可以配置具体可以看Gradle官网中的Build Environment docs.gradle.org/current/use…

local.properties中会填写本地的SDK、NDK路径,多人开发一般要加入.gitignore。

3、根目录build.gradle

项目级build.gradle 文件位于项目根目录,用于定义适用于项目中所有模块的构建配置。

/**
 * buildscript{}声明工程所需要的依赖,如在module中需要引用的插件 
 * 比如要在module中引用 apply :'com.android.application',
 * 需要在这里加入依赖 classpath 'com.android.tools.build:gradle:3.1.4'
 */

buildscript {
    /**
     * repositories{}声明了工程所需要的依赖库,供下面dependencies下载
     * 低版本gradle需要将google()改为
     * maven { url 'https://maven.google.com/' }
     */
    repositories {
        google()
        jcenter()
    }
     /**
      * dependencies{}声明了具体的依赖,使用[group]:[name]:[version]形式
      */
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'
    }
}

/**
 * allprojects{}定义了项目中所有module的配置
 * 此处所有module的远程仓库都添加了google()和jcenter()
 */
allprojects {
    repositories {
        google()
        jcenter()
    }
}

/**
 * 此处就是gradle中的一个task,名称为clean,
 * 使用Groovy语言实现,完全兼容java,
 * 可以跟进delete方法,内部就是一个用 java 实现的递归删除方法
 */
task clean(type: Delete) {
    delete rootProject.buildDir
}

复制代码

4、module中build.gradle

模块级build.gradle文件位于每个module文件夹中,用于配置适用于其所在模块的构建设置,如自定义打包设置、引入模块内的依赖等。

/**
 * 引入所需插件 此处使用‘com.android.application’
 * 提供了android {} 配置的可用性,用户构建android项目
 */
apply plugin: 'com.android.application'

/**
 * android{}部分是根据com.android.application来配置的属性,
 * 包含了android项目配置的必要信息
 */
android {

  /**
   * compileSdkVersion 是gradle中用于构建使用的版本,
   * 可以使用该版本及以下的API特性
   *
   * buildToolsVersion 使用android SDK build tools的版本
   */
  compileSdkVersion 26
  buildToolsVersion "28.0.3"

  /**
   * 基本配置,某些配置会覆盖manifest中的配置
   */

  defaultConfig {

    /**
     * applicationId ,编译打包时会将该处配置覆盖到manifest中
     */

    applicationId 'com.example.myapp'

    // 定义最小运行的android版本
    minSdkVersion 15

    // 指定应用程序的API级别用来测试。
    targetSdkVersion 26

    // app的版本号,某些手机上安装应用会进行校验,不能降级安装
    versionCode 1

    // app的版本名称,一般使用三位数控制“1.1.0”
    versionName "1.0"
  }

  /**
   * buildTypes {} 声明了构建类型,默认包含了debug,release
   * 也可以增加自定义的构建类型
   */

  buildTypes {

    /**
     * 配置当构建类型为release时的选项,如是否开启混淆,及混淆规则文件
     * 也可以增加构建配置,如增加签名文件的相关配置
     */

    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }

  /**
   * productFlavors {}声明了不同的特色版本。
   * 这里的配置可以覆盖defaultConfig {}中的配置
   * 比如说这里的例子配置了一个付费的版本和一个免费的版本
   * 使用了不同的applicationId使两个项目可以同时运行在一个手机上
   */

  productFlavors {
    free {
      applicationId 'com.example.myapp.free'
    }

    paid {
      applicationId 'com.example.myapp.paid'
    }
  }

  /**
   * 多APK构建,根据屏幕的dpi或者系统的ABI来进行生成不同的apk
   * 使用不多,这里不做重点介绍
   */

  splits {
    // Screen density split settings
    density {

      // Enable or disable the density split mechanism
      enable false

      // Exclude these densities from splits
      exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
    }
  }
}

/**
 * dependencies {} 声明的module级别的依赖来实现对其他项目的调用
 */

dependencies {
    implementation project(":lib")
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}
复制代码

四、对于提高编译速度的建议

1、使用最新的Android gradle插件

Google tools team一直致力于提高android studio的编译速度,使用最新的gradle插件可以搞编译速度 在Android Gradle Plugin 3.0.0后,google推出了新的依赖方式,并强制要求废弃老的依赖方式,将原有的compile闭包方法,拆分成implementation,api以明确项目的依赖关系。

其中implementation仅对当前module依赖有效,api同compile,存在依赖的传递性。错误的使用则会导致依赖被加载两次,增加编译时间。

更多3.0.0之后的特性可以参考官方文档中的Dependency configurations部分 developer.android.com/studio/buil…

- compile 'com.android.support:appcompat-v7:27.1.1'
    + implementation 'com.android.support:appcompat-v7:27.1.1'

复制代码

2、避免使用multidex

当minSdkVersion为21以下的时候的时候(不包含21),则编译时间会大大增加。我们可以通过定制开发版本编译minSdkVersion为21来提高开发效率,具体配置如下:

android {
    defaultConfig {
        ...
        multiDexEnabled true
    }
    productFlavors {
        dev {
            minSdkVersion 21
        }
        prod {
            minSdkVersion your_minSDKVersion
        }
    }
	...
}

复制代码

3、避免使用multi-APK(不常使用)

当需要针对不同的ABI或dpi做支持,使用spilts{}对工程生成不同apk时可以使用该方法。

在开发调试的时候,关闭splits功能,具体配置如下:

android {
	...
   if (project.hasProperty(‘devBuild’)){
      splits.abi.enable = false
      splits.density.enable = false
   }
   ...
}
复制代码

使用命令行构建时使用这个命令:

./gradlew assembleDevelopmentDebug -PdevBuild
	// gradlew assembleDevelopmentDebug -PdevBuild
复制代码

当使用Android Studio构建可做以下配置:

打开Preferences -> Build, Execution, Deployment -> Compiler,再Command-line选项后填写-PdevBuild,如下图所示:

Android中的Gradle之配置及构建优化

4、减少打包的资源文件

在我们进行开发调试的时候,没有必要对所有的资源文件进行编译,通常只选择一种可以减少编译时间,具体配置如下:

android{
	...
	productFlavors {
  		development {
    		minSdkVersion 21
    		//only package english translations, and xxhdpi resources   
    		resConfigs (“en”, “xxhdpi”)
  		}
	}
	...
}

复制代码

5、禁用PNG压缩

android构建的时候默认开启了PNG压缩,在开发调试时,可以将PNG压缩关闭,具体配置如下:

android {
	...
	if (project.hasProperty(‘devBuild’)){
		aaptOptions.cruncherEnabled = false
	}
	...
}

复制代码

6、使用Instant run

andorid studio 3.0之后对instant run进行了很大的优化,之前的版本出现过更新的代码没有运行到手机上,所以一直关闭着。现在可以尝试使用。

7、不在gradle中定义动态变量

在开发调试的情况下,不要使用动态定义

// def buildDateTime = new Date().format(‘yyMMddHHmm’).toInteger()
def buildDateTime = project.hasProperty(‘devBuild’) ? 100 : new Date().format(‘yyMMddHHmm’).toInteger()
android {
  defaultConfig {
    versionCode buildDateTime
 }
}
复制代码

8、不要使用动态依赖版本

项目在构建的过程中具有不确定性,可能因为网络问题导致编译时间过长或编译失败。并且Gradle会每24小时检查一次新的依赖版本从而增加依赖解析时间。

不要使用下面的依赖方式

// 错误的示范
	implementation 'com.appadhoc:abtest:latest'
	implementation 'com.android.support:appcompat-v7:27+'

复制代码

9、对Gradle后台进程的最大堆大小的分配

分配更大的内存可能会对大的项目的构建有时间上的减少,具体还要看电脑的配置等其他因素,具体可以参考gradle官网 Configuring JVM memory: docs.gradle.org/current/use…

新版本配置时在gradle.properties中配置

org.gradle.jvmargs=-Xmx1536m

复制代码

不要在使用老版本的在build.gradle中配置

dexOptions {
		javaMaxHeapSize = ‘4g’
	}
复制代码

10、使用Gradle缓存

Gradle缓存是Gradle 3.5的新特性,当缓存开启时,Gradle将缓存并重用之前构建的结果。具体在gradle.properties中增加如下配置:

org.gradle.caching=true

复制代码

以上几点出自google 2017 I/O大会,具体可参看会议视频 www.youtube.com/watch?v=7ll…

11、针对项目构建时间具体进行优化

针对每个项目的构建呢,具体的优化也不会相同,我们可以将我们项目的具体构建时间输出成文档,具体分析哪块的构建时间过长,来针对性的优化。具体命令如下:

gradlew --profile --recompile-scripts --offline --rerun-tasks assembleFlavorDebug
复制代码
  • --profile:启用分析
  • --recompile-scripts:在绕过缓存时强制重新编译脚本。
  • --offline:禁止 Gradle 提取在线依赖项。这样可以确保 Gradle 在尝试更新依赖项时引起的任何延迟都不会干扰您的分析数据。您应当已将项目构建一次,以便确保 Gradle 已经下载和缓存您的依赖项。
  • --rerun-tasks:强制 Gradle 重新运行所有任务并忽略任何任务优化。 构建完成后,在_project-root_/build/reports/profile/ 目录下使用浏览器打开生成的profile- timestamp .html即可看到具体的构建时间报告。

五、总结

通过上面的文章,我们就已经了解了如何配置gradle来对android项目进行构建,以及对项目构建进行部分优化,但是我们对于原理部分还所知甚少,比如为什么可以在build.gradle中定义android{}这部分代码,为什么这里就可以实现对项目的配置,本着知其然,知其所以然的态度,我们要继续对gradle进行探索,了解groovy语法,了解gradle中的task,及使用自定义构建功能及自定义插件。

参考文档: andorid官方文档——配置构建 developer.android.com/studio/buil…

gradle官方文档——Building Android Apps guides.gradle.org/building-an…

Google I/O中提到的提高Android studio的编译速度的几个建议 blog.csdn.net/sd19871122/…


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

查看所有标签

猜你喜欢:

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

The Creative Curve

The Creative Curve

Allen Gannett / Knopf Doubleday Publishing Group / 2018-6-12

Big data entrepreneur Allen Gannett overturns the mythology around creative genius, and reveals the science and secrets behind achieving breakout commercial success in any field. We have been s......一起来看看 《The Creative Curve》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具