美文网首页Android studioAndroid知识Android开发
android开发 之 Gradle以及编译优化

android开发 之 Gradle以及编译优化

作者: 诺之林 | 来源:发表于2016-09-22 17:11 被阅读1198次

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

    目录

    什么是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项目的典型目录结构如下

    gradle_01.png

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

    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来加快编译速度

    gradle_03.png

    参考

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

    相关文章

      网友评论

        本文标题:android开发 之 Gradle以及编译优化

        本文链接:https://www.haomeiwen.com/subject/qyrzettx.html