美文网首页Android
Gradle基本认识及理解

Gradle基本认识及理解

作者: 常兴E站 | 来源:发表于2016-12-15 14:39 被阅读26次

    date: 2016-12-09 16:39:53

    A build system that we think is a quantum leap for build technology in the Java (JVM) world.
    gradle是java编译技术领域中一个跨越性飞跃。

    Hello gradle!

    Gradle是什么?

    gradle首先可以理解为一个项目构建工具,或者理解深入点,是一种编程框架,安卓项目最流行的也是google官方推荐的安卓项目编译工具。官方介绍如下:

    可见gradle有多么高的认可度,所以是值得java程序员特别android程序员熟练掌握并应用的一项技能!

    Gradle 强大再哪里?为何选择她?

    优势(gradle provides):

    • 比ant, maven更加灵活强大且简单的构建能力
    • 强大(powerful support)的多项目(multi-project)编译支持
    • 强大的项目依赖关系管理
    • 完善的maven 库支持(repository infrastructure)
    • 简单强大的Groovy语言
    • 技术成熟,可以处理大规模构建
    • 可定制插件(plugin),自定义能力强
    • 总之,是java程序员首先编译工具~

    Gradle安装及环境部署

    安装

    下载地址:https://gradle.org/gradle-download/?_ga=1.168710433.1636299837.1479991326

    文档位置:https://docs.gradle.org/current/userguide/installation.html

    下载后解压到制定pc位置,然后配置环境变量即可。
    当然也可以用sudo apt来安装,免去手动配置环境变量。

    Gradle Wrapper

    Gradle的本地包装,可以省去在PC上安装gradle.Google 推出了 Gradle Wrapper 的概念,就是他在你每个项目都配置了一个指定版本的 Gradle ,你可以理解为每个 Android 项目本地都有一个小型的 Gradle ,通过这个每个项目你可以支持用不同的 Gradle 版本来构建项目,这样wrapper跟随项目同步保存,就可以在其他pc机器上免安装gradle,并且用统一的gradle版本。。

    如何创建自己的gradlw wrapper?

    先在自己项目下添加 build.gradlw 文件

    task createWrapper( type: Wrapper){
        gradleVersion = '2.1-preview-1'
    }
    

    执行 gradle cW 就生成了我们想要的wrapper,目录结构及代码如下图:

    wrapper.png

    项目结构基本认识

    Gradle项目有两个概念,project和task, Project为一个项目,Task为一次构建任务中的一个个别任务,Task是隶属与project的,每次build可以有多个project. Gradle以module为单位来管理project.

    这里我们已一个安卓项目来说明gradle的基本项目构建结果。

    Gradle管理的Android项目基本结构

    project.png

    一个项目的根目录下放置了整个项目构建的相关配置,除了gradle wrapper相关文件外,放置了整个项目的相关配置。

    app目录为项目主目录,主项目module放在里面,submodule目录下可以放多个附属项目。每个module项目根目录有个build.gradle文件,定义了该module是如何编译的。

    1 settings.gradle为整个项目的多个module配置,如:

    include ':App', ':WaveProgress'
    include ':SwitchButton'
    
    project(':SwitchButton').projectDir = new File('submodules/SwitchButton')
    project(':WaveProgress').projectDir = new File('submodules/Waveprogress/app')
    
    

    如何各个module的根目录即为整个项目的根目录,则不用指定projectDir.

    2 local.properties 为放置本地pc相关配置路径,如相关sdk保存路径,此文件无需同步保存。

    ndk.dir=/home/android-sdk-linux/ndk-bundle
    sdk.dir=/home/android-sdk-linux
    

    3 gradle.properties 为gradle设置或赋值一些变量

    ## Project-wide Gradle settings.
    #
    # For more details on how to configure your build environment visit
    # http://www.gradle.org/docs/current/userguide/build_environment.html
    #
    # Specifies the JVM arguments used for the daemon process.
    # The setting is particularly useful for tweaking memory settings.
    # Default value: -Xmx10248m -XX:MaxPermSize=256m
    # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
    #
    # When configured, Gradle will run in incubating parallel mode.
    # This option should only be used with decoupled projects. More details, visit
    # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
    # org.gradle.parallel=true
    #Thu Jan 21 20:02:21 CST 2016
    systemProp.http.proxyHost=127.0.0.1
    systemProp.http.proxyPort=8118
    
    

    4 根目录下build.gradle

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.1.2'
        }
    }
    
    allprojects {
        repositories {
            jcenter()
        }
    }
    
    

    这里定义了整个项目的相关全局变量及引用,默认android项目会在这里引用jcenter()代码仓库。gradle有三种仓库可以在这里设置,maven ivy 及本地 flat仓库。

    maven{
        url '...'
        }
    ivy{
        url '...'
        }
    flatDir{
        url '...'
        }
    

    当然这些仓库可以定义别名,直接引用别名更方便如:

     repositories {
            jcenter()
        }
    
    

    有些场景maven也需要引用本地库,如java项目中引用一些android库。maven也可以设置m2repository目录,如:

        maven {
            url "/home/android-sdk-linux/extras/android/m2repository"
        }
    

    5 android编译文件build.gradle

    //添加插件
    apply plugin: 'com.android.application' //安卓项目插件
    apply plugin: 'com.neenbedankt.android-apt' //可以添加多个插件
    
    android {
        compileSdkVersion 24 //编译版本
        buildToolsVersion deps.bTVersion //编译工具版本
        defaultConfig { //项目默认配置,会应用到buildTypes相关版本上
            applicationId "com.canking.bind.cxinjectdemo"
            minSdkVersion 15
            targetSdkVersion 24
            versionCode 1
            versionName "1.0"
        }
        buildTypes {//编译版本控制,可以配置多个
            release {
                minifyEnabled false //混淆
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {//依赖模块
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile deps.supportCompat
        compile deps.supportv7
    
        testCompile 'junit:junit:4.12'
        compile project(':bindview')
        compile project(':annimationlib')
        apt project(':javabind')
    }
    
    

    Gradle任务

    gradle的安卓插件提供了4个定级任务:

    assemble 构建项目输出
    check 运行检测和测试任务
    build 为assemble和check接合体
    clean 清理任务
    

    定级任务回合buildTypes中不同版本组合为新的不同任务。
    如:

    ./gradlew assembleDebug
    

    细心的同学会在介绍Gradle Wrapper的时候发现,gradle命令是支持首字母简写的,如:

    gradlw cW
    ./gradlw aD
    

    通过 gradle tasks 可以查看项目多有的task任务。

    tasks.png

    问题

    gradle项目编译如何自定义化,比如项目build.gradle如何扩展,如何如自己打包逻辑等待,想掌握这些技能就需要学习gradle的编写语言Groovy,更灵活的构建系统,帮助我们构建更复杂的项目。
    所有,下节将一起学习Groovy语音的基础,深入了解Gradle.

    作者主页:http:www.canking.win

    Github:https://github.com/CankingApp

    新浪:http://weibo.com/canking666

    相关文章

      网友评论

        本文标题:Gradle基本认识及理解

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