简介
Gradle是一种依赖管理工具,基于Groovy语言,与maven相比可以不再使用xml进行配置,变得更加简单,清晰。
Android Studio中使用的是gralde插件编译项目,因此整个项目是基于gradle管理。
Gradle生命周期
- 初始化:创建project 实例
- 配置:创建、配置task任务
- 执行:执行task任务
gradle插件中的基本tasks
- assemble 构建各个版本的APK一般使用assembleRelease/assembleDebug
- clean 删除构建文件
- check 尝试去编译task而不去真正的执行,当构建失败时抛出异常停止任务
- build check&assemble
- connectedCheck 跑测试用例
- installDebug 编译安装debug包到连接设备
Gradle 仓库依赖管理
repositories {
mavenCentral()
jcenter()
mavenLocal()
}
这里mavenLocal()使用的是本地的maven仓库,装过maven仓库的人都知道,默认情况下,mac/linux下的本地仓库在:~/.m2/;windowx下默认仓库在%UserProfile%.m2
repositories {
maven { url"http://repo.acmecorp.com/maven2" }
}
这里maven执行一个自定义的远程仓库,不过要注意的是这个仓库支持匿名访问,如果要是自己的私人仓库的话则为以下写法:
repositories {
maven { url "http://repo.acmecorp.com/maven2"
credentials {
username 'user'
password 'secretpassword' }
} }
当然也可以指定本地某一个仓库路径:
 repositories {
maven {
url "../repo"
}
}
Gradle 添加依赖库
依赖库的话分为.so native库,Java源代码库以及 aar/jar包
添加jar包:
dependencies { compile files('libs/domoarigato.jar') } dependencies { compile fileTree('libs') } dependencies { compile fileTree(dir: 'libs', include: ['*.jar’],exclude:[‘xxx.jar']) }
添加native 依赖:
android { sourceSets.main { jniLibs.srcDir 'src/main/libs' } }
添加插件引用:
apply plugin: 'com.android.library'
添加library module引用
- 在setting.gradle中添加include ‘:library’
在build.gradle中添加
dependencies { compile project(':library') }
版本依赖
dependencies { compile 'com.android.support:support-v4:22.2.+' compile 'com.android.support:appcompat-v7:22.2+' compile 'com.android.support:recyclerview-v7:+' }
这里我们用了+,22.2.+表示22.2.?最新的版本,而只有一个+表示该依赖的最新版本,这里要注意一点,每次编译的时候gradle都会去找最新的版本,那么这样就会出现一个问题,如果新版本与老版本中的某些接口变动了,则会导致编译失败
Gradle 如何打渠道包
android
{ productFlavors
{ red
{ applicationId 'com.gradleforandroid.red'
minSdkVersion 17
versionCode 4 } 
blue
{
applicationId 'com.gradleforandroid.blue'
minSdkVersion 14
versionCode 4
} } }
可以在productFlavors
这个闭包中定制自己的渠道包。这里提到了一个闭包的概念,我认为闭包主要有两个作用:
- 闭包外可以访问闭包中的成员变量
- 闭包可以作为一个参数进行传递
这里添加了两个渠道包,可以执行assembleRelease构建出两个渠道包:red&blue,但是如果只想构建一个怎么做,这里有两种方法:
执行assemble${productFlavorName}Release,这里的productFlavorName指的是需要构建的渠道包名称,比如red的渠道包:assembleredRelease
使用
android.variantFilter
这个方法android.variantFilter { variant -> if(variant.buildType.name.equals('release')) { variant.getFlavors().each() { flavor -> if (flavor.name.equals('blue')) { variant.setIgnore(true); } } }}
将blue渠道包忽略掉
Tasks基础
task hello { println 'Hello, world!' }
Output:
$ gradlew hello
Hello, world!
:hello
这里我们可以看到即使定义了这个Task,但是输出是在编译阶段。
task hello << { println 'Execution' }
hello { println 'Configuration' }
Output:
$ gradlew hello
Configuration
:hello
Execution
加上<<则在执行阶段执行,而<<则是doLast的缩写。
task hello {
println 'Configuration'
doLast { println 'Goodbye' }
doFirst { println 'Hello' } }
Output:
$ gradlew hello
Configuration
:hello
Hello
Goodbye
上面这个task比较清楚了,先执行编译阶段的println 'Configuration'
,而后先执行doFirst方法,接着doLast方法
task mindTheOrder {
doFirst { println 'Not really first.' }
doFirst { println 'First!' }
doLast { println 'Not really last.' }
doLast { println 'Last!' } }
$gradlew mindTheOrder
:mindTheOrder
First!
Not really first.
Not really last.
Last!
这个task比较有意思,如果定义多个doFirst和多个doLast的话是如何执行的呢?那么doFirst以最后定义的那个doFirst先执行,而doLast则是最后一个定义的最后执行
Others
android.applicationVariants.all
android.applicationVariants.all { variant -> …..}
- 触发时机:编译阶段
- 作用:通过variant可以获取一些task进行更改,比如更改mergeResources,需要注意的是,variant并不能获取所有定义的task,详请见user-guide.
tasks.whenTaskAdded
- 触发时机:当每添加一个任务时触发此操作
- 作用:可以使用这个方法在编译阶段更改某些tasks,使其在真正执行的时候达到自己的目的。不过需要注意的是,task定义需要在tasks.whenTaskAdded 之后。
转载请注明出处:
http://blog.csdn.net/sanyinchen/article/details/50901584