您的位置:首页 > 移动开发 > Android开发

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

2017-07-10 16:29 453 查看
一、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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: