android开发 之 Gradle以及编译优化

本文Demo的完整工程代码, 参考这里的StudyPackage

目录

  • 什么是Gradle

  • 为什么是Gradle

  • Gradle的安装

  • Gradle项目结构

  • Gradle相关文件

    • build.gradle

    • settings.gradle

    • gradle.properties

    • local.properties

  • Gradle-Wrapper

    • 为什么要使用Gradle-Wrapper

    • Gradle-Wrapper需要哪些文件

    • Gradle-Wrapper的基本使用

  • Gradle编译优化

    • 配置编译选项

    • 使用最新版本的Gradle

    • Offline-work

什么是Gradle

虽然原文定义又长又晦涩, 但是为了准确性, 还是引用Wiki中Gradle的定义如下

Gradle is an open source build automation system that builds upon the concepts of Apache Ant and Apache Maven and introduces a Groovy-based domain-specific language (DSL) instead of the XML form used by Apache Maven of declaring the project configuration.[2] Gradle uses a directed acyclic graph ("DAG") to determine the order in which tasks can be run.

介绍完"学院派"的定义, 我们来看看"世俗派"的定义

Gradle是一种构建工具, 它可以帮你管理项目中的差异, 依赖, 编译, 打包, 部署......, 你可以定义满足自己需要的构建逻辑, 写入到build.gradle中供日后复用

更多可以参考如何通俗地理解 Gradle?

就我个人的理解

Gradle就是用来解决除Coding以外对开发的所有常见需求(差异, 依赖, 编译, 打包, 部署......)

为什么是Gradle

工具总是会有很多种, 那为什么偏偏就是Gradle呢? Gradle官方的解释如下

  • Polyglot Builds - 支持多种语言(例如Java, Scala, Python, C/C++, Android, IOS and many many more)

  • Tool Integrations - 集成开发工具

  • Robust Dependency Management - 强大的依赖管理

  • Powerful Yet Concise Logic - 简洁但强大的逻辑

  • High Performance Builds - 高性能构建

  • Build Reporting - 编译结果报告

介绍完"自卖自夸"的定义, 其实Marven与Gradle最核心的分歧在于

Marven基于XML, 而Gradle基于Groovy的DSL(Domain Specific Language) -- 一种图灵完备的构建语言

所以Gradle的表达更加

  • 简洁 - XML依赖的写法很繁琐, 而Gradle只要一句话, 例如
compile 'com.android.support:appcompat-v7:24.2.0'
  • 智能 - 例如Gradle支持动态版本依赖, 例如
testCompile ‘junit:junit:4.+'

Gradle的安装

使用Android Studio构建项目时, IDE会帮我们下载和安装Gradle

  • Mac上会默认下载到/Users/<用户名>/.gradle/wrapper/dists目录

  • Windows平台会默认下载到C:\Documents and Settings<用户名>.gradle\wrapper\dists目录

由于Gradle无法"正常访问"导致Android Studio会经常"假死", 所以可以离线下载(参考AndroidDevTools), 然后拷贝至相应目录

Gradle项目结构

使用Android Studio创建的Gradle项目的典型目录结构如下

android开发 之 Gradle以及编译优化_第1张图片
gradle_01.png

其中与Gradle相关的文件主要有

android开发 之 Gradle以及编译优化_第2张图片
gradle_02.png

Gradle相关文件

build.gradle

build.gradle是Gradle的核心配置文件, 它一般分为两种

  • 根目录配置文件, 例如build.gradle(Project: StudyPackage)
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

根目录配置文件中定义的是所有子模块的公共配置, 例如: 仓库源为jcenter(), android gradle plugin的版本

  • 模块的配置文件, 例如build.gradle(Module: app)
apply plugin: 'com.android.application' // 声明是Android程序

android {
    compileSdkVersion 24 // 编译SDK的版本
    buildToolsVersion "24.0.2" // build tools的版本
    defaultConfig {
        applicationId "com.example.yuanlin.studypackage" // 应用包名
        minSdkVersion 21
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false // 是否代码混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // 混淆文件的位置
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar']) // 编译libs目录下的所有jar包
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.0'
    testCompile 'junit:junit:4.12'
}

模块的配置文件中定义的都是当前模块的Gradle配置

settings.gradle

这是全局的项目配置文件, 里面声明了需要加入gradle的module, 例如

include ':app'

gradle.properties

gradle.properties是gradle的配置文件

其中可以定义一些常量供build.gradle使用, 比如可以配置签名相关信息如keystore位置, 密码, keyalias等, build.gradle就可以直接引用, 因此

gradle中的一些配置参数建议写到gradle.properties

例如google/iosched的gradle.properties中配置了

###############################################################################
# App variables.
###############################################################################
# If versions end in odd numbers they are development builds, even versions are release candidates.
# The AndroidManifest.xml must also be updated currently.
version_code = 333
version_name = 3.3.3

......

模块中的build.gradle就可以这样引用

......

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        version "${version_code}"
        versionName "${version_name}"
        minSdkVersion 14
        targetSdkVersion 22
        
        ......
    }
}

......

local.properties

该文件描述的是SDK的路径, 例如

sdk.dir=/Users/yuanlin/Workspace/android-sdk

需要注意的是

  • Android Studio会自动生成该该文件, 所以一般需要配置该文件, 只有当不使用Android Studio时, 才自己配置

该文件不需要添加到版本控制系统中

Gradle Wrapper

为什么要使用Gradle Wrapper

如果开发者配置了Gradle Wrapper, 那么在其他开发者构建该项目时, 可以直接执行如下命令

./gradlew [task] // Mac OS/Linux
gradlew [task] // Windows

当用户第一次执行上面的命令时, Wrapper会自动地下载并安装对应版本的Gradle, 这样

用户不必自己下载、安装、配置Gradle; 用户进行项目构建时能够确保使用正确的Gradle版本

Gradle Wrapper需要哪些文件

在配置了Wrapper的Gradle项目中, 有以下文件

|--gradle
|---- wrapper
|---- gradle-wrapper.jar
|---- gradle-wrapper.properties
|--gradlew (Mac OS/Linux)
|--gradlew.bat (Windows)

其中gradler-wrapper.properties文件的内容大概如下

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

以上文件都需要添加到版本控制系统中

Gradle Wrapper的基本使用

  • ./gradlew -v - 版本信息

  • ./gradlew clean - 清除build和app/build目录

  • ./gradlew build - 检查依赖并编译打包(注意这里会将debug、release包都打出来)

  • ./gradlew assembleDebug - 编译并打Debug包

  • ./gradlew assembleRelease - 编译并打Release的包

关于更多GradleWrapper的使用, 可以参考帮助: ./gradlew -h

Gradle编译优化

这里的优化方法主要参考Making Gradle builds faster

配置编译选项

  • --dry-run: Runs the builds with all task actions disabled

  • --configure-on-demand: Only relevant projects are configured in this build run. This means faster build for large multi-project builds

  • --daemon: Uses the Gradle daemon to run the build. Starts the daemon if not running

  • --parallel: Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use

这些配置选项还可以添加系统全局配置文件~/.gradle/gradle.properties中

echo 'org.gradle.configureondemand=true' >> ~/.gradle/gradle.properties
echo 'org.gradle.daemon=true' >> ~/.gradle/gradle.properties
echo 'org.gradle.parallel=true' >> ~/.gradle/gradle.properties

经过实际测试, 对编译速度有明显提升的主要还是--daemon

使用最新版本的Gradle

Offline work

如果项目的Gradle和依赖没有更新, 还可以勾选Offline work来加快编译速度

android开发 之 Gradle以及编译优化_第3张图片
gradle_03.png

参考

  • 什么是图灵完备?

  • 什么是图灵完备的编程语言?

  • gradle和ant等构建工具有什么核心优势?

  • Maven和Gradle对比

  • Difference between build.gradle(Project) and build.gradle(Module)

  • ANDROID STUDIO系列教程四--GRADLE基础

  • Gradle for Android 问题总结

  • Wrapper (gradlew)

  • Chapter 5. The Gradle Wrapper

  • Configure Your Build

  • Making Gradle builds faster

  • Gradle Build速度加快终极方法

更多文章, 请支持我的个人博客

你可能感兴趣的:(android开发 之 Gradle以及编译优化)