【Android 项目构建】深入理解Gradle

一、Gradle基础

1、Gradle是什么?

        Gradle是以groovy为编程语言,面向java应用的自动化构建工具。

 

2、Gradle文件的三种类型:

(1)类型:settings.gradle、根目录下build.gradle、module目录下build.gradle。

(2)执行顺序:settings.gradle在初始化阶段执行,根目录下build.gradle和module目录下build.gradle在配置阶段进行配置,其中,根目录下build.gradle具有全局性。

 

3、build.gradle构建文件中五大基本元素

build.gradle文件中基本的元素有:defaultConfig(默认配置)、buildTypes(构建类型)、dependencies(依赖)、productFlavors(渠道包配置)、signingConfigs(签名配置)。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"

    defaultConfig {
        applicationId "com.ctrip.demo"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            buildConfigField "String", "API_URL", "\"http://example.com/api\""
            buildConfigField "boolean", "LOG_OUTPUT", "false"
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        staging {
            applicationIdSuffix ".colinambitious"
            versionNameSuffix "-staging"
        }
        debug {
            buildConfigField "String", "API_URL", "\"http://test.example.com/api\""
            buildConfigField "boolean", "LOG_OUTPUT", "true"
        }
    }

    productFlavors {
        red {
            applicationId 'com.colinambitious.red'
            versionCode 3
        }
        blue {
            applicationId 'com.colinambitious.blue'
            versionCode 4
        }
        free {
            applicationId 'com.colinambitious.free'
            versionCode 5
        }
        paid {
            applicationId 'com.colinambitious.paid'
            versionCode 6
        }
    }

    signingConfigs {
        staging.initWith(signingConfigs.debug)

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

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
    compile project(path: ':PublicProduct')
//    compile project(path: ':mylibrar')
    compile project(path: ':Tour')

}

 

二、依赖管理

    “依赖管理”主要包含两个方面:“仓库依赖”和“项目依赖”。“仓库依赖”指的是对仓库的定义,在定义好仓库之后,就可以在dependencies里通过类似如下代码的形式添加依赖了。

compile 'com.android.support:appcompat-v7:26.0.0-alpha1'

    “项目依赖”有两种方式:module依赖 和 aar包依赖。

 

 1、依赖仓库

        (1)预定义依赖仓库

        (2)远程仓库

        (3)本地仓库

repositories {
        jcenter()
        maven {
            url "http://maven.dev.sh.ctripcorp.com:8081/nexus/content/groups/public"
        }
        flatDir {
            dirs '../CTRepo'
        }
    }

jcenter()就是第一种仓库依赖,即预定义依赖仓库。一般我们在开发过程中想要把自己项目的jar包开源出来,就可以放到jcenter()上。

如上代码的第二种方式就是远程仓库的定义,可以看到代码里设置了自定义的maven仓库。

flatDir就是用来定义本地仓库的方式。

2、项目依赖

        (1)module依赖

            首先在settings.gradle中include进需要依赖的module,然后通过如下代码在需要依赖的module添加如下依赖 

dependencies {
    compile project(path: ':Business')
}

        (2).aar文件依赖

            首先通过flatDir定义本地仓库,然后在需要依赖的module下加入如下依赖(其中,name为aar的名字,ext为扩展名)

dependencies {
    compile(name:'myaar-release', ext:'aar')
}

 

三、Gradle任务

1、Groovy核心语法:

(1)build.gradle与project对象的关系:

每一个build.gradle都对应一个project对象。比如,我们apply "com.android.application"其实调用的是project.apply “com.android.application”。

 

(2)属性

为project对象定义属性的方法是

ext {
    app_name = "AndroidDemo_root"
}

 

(3)变量

    def localProperties = rootProject.file('local.properties')

 

(4)方法:

        (a)方法定义

int getApplicationID() {10752}

 

        (b)方法调用

def test = getApplicationID()

 

2、创建任务

(1)追加任务

task hello << {
    println "hello, world;root_project_name is ' + ${app_name}";
}

 

(2)创建任务

tasks.create(name: 'hello') << {
     println 'Hello, world!'
}

 

(3)依赖任务

hello.dependsOn test

 

3、执行任务

(1)task.execute()即可执行

(2)命令行执行 gradlew task

 

4、beforeEvaluate和afterEvaluate

分别在配置前和配置后执行

 

四、Gradle任务在实际项目中应用

1、在实际场景下经常有这样的需求:gradle中某个配置只有在debug模式下才能生效,那么这该如何实现呢?

最初想到的方案是,通过ext定义一个属性,在buildTypes在release里设置为true,在debug里设置为false,然后根据这个属性的值来判断是否引入。然而,gradle中代码是从上向下执行的,所以,这个变量就永远被置为false。

最终想到如下方案:

List<TaskExecutionRequest> taskRequests = gradle.startParameter.getTaskRequests();
if (taskRequests.size() > 0) {
    String args = taskRequests.get(0).toString();
    if (args.toLowerCase().contains("assembledebug")) {
        println  "test output test outpu test outpu "
        println  "test output test outpu test outpu "
        println  "test output test outpu test outpu "
    }
}

 

2、每定义一个Activity就要在manifest里注册一个Activity,这样是不是很烦?可以在gradle文件中实现。具体实现,等待我后续的blog吧~

 

 

五、最后

如果疑问,欢迎email联系我 zhshan@ctrip.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值