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

xiaoxiao2021-02-28  105

一、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

 

转载请注明原文地址: https://www.6miu.com/read-32440.html

最新回复(0)