Gradle的一些特性列表
- 一个像 ant 一样,通用的灵活的构建工具
- 一种可切换的,像 maven 一样的基于约定约定优于配置的构建框架
- 声明式的构建以及基于约定的构建;
- 基于编程的依赖语言;
- 结构化构建:能够大显著的效率提升;
- 多项目构建:项目依赖,Gradle对多项目构建的支持非常出色。
- 多种方式去管理依赖:远程Maven和Ivy仓库、本地文件系统上的jar包或目录
- 支持传递性依赖管理,而不需要远程仓库或者 pom.xml 或者 ivy 配置文件
- ant 式的任务和构建是 gradle 的第一公民
- 基于 groovy,其 build 脚本使用 groovy dsl 编写
具有广泛的领域模型支持你的构建
每一个项目都由一个或多个任务组成。一个任务表示构建执行的一些原子工作,比如编译一些类,创建一个JAR包,生成javadoc,或者是把一些档案发布到仓库中。
Gradle 的核心在于基于 Groovy 的丰富而可扩展的域描述语言(DSL)。
构建基础
projects 和 tasks是 Gradle 中最重要的两个概念。每个 project 都由多个 tasks 组成。每个 task 都代表了构建执行过程中的一个原子性操作。如编译,打包,生成 javadoc,发布到某个仓库等操作。
快速定义任务:
task hello << {
println 'Hello world!'
}
> gradle -q hello
Hello world!
一个基本 Java 项目
apply plugin: 'java'
> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Total time: 1 secs
其他tasks
- clean:删除 build 目录以及所有构建完成的文件。
- assemble:编译并打包 jar 文件,但不会执行单元测试。
- check:编译并测试代码。
其他
1.添加maven库
repositories {
mavenCentral()
}
2.添加依赖
dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
3.发布jar包
uploadArchives {
repositories {
flatDir {
dirs 'repos'
}
}
}
执行 gradle uploadArchives 以发布 jar 包。
4.多项目构建配置settings.gradle:
include "shared", "api", "services:webservice", "services:shared"
- 依赖配置
compile :编译范围依赖在所有的 classpath 中可用,同时它们也会被打包
runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。
testCompile:测试期编译需要的附加依赖
使用 Maven 中央仓库:
repositories {
mavenCentral()
// 可以添加其他库
google()
}
其他
- 创建目录:使用 mkdir 创建目录
classesDir = new File('build/classes')
task resources << {
classesDir.mkdirs()
// do something
}
- 使用 gradle.properties 文件设置属性
gradlePropertiesProp=gradlePropertiesValue
systemProjectProp=shouldBeOverWrittenBySystemProp
envProjectProp=shouldBeOverWrittenByEnvProp
systemProp.system=systemValue
使用hasProperty('propertyName') 来进行检查属性是否存在
缓存
为了提高响应速度,默认情况下 Gradle 会缓存所有已编译的脚本。这包括所有构建脚本,初始化脚本和其他脚本。你第一次运行一个项目构建时, Gradle 会创建 .gradle 目录,用于存放已编译的脚本。下次你运行此构建时, 如果该脚本自它编译后没有被修改,Gradle 会使用这个已编译的脚本。否则该脚本会重新编译,并把最新版本存在缓存中。如果您通过 --recompile-scripts 选项运行 Gradle ,会丢弃缓存的脚本,然后重新编译此脚本并将其存在缓存中。通过这种方式,您可以强制 Gradle 重新生成缓存。
gradle 日志输出:
- --stacktrace
输出截断的栈跟踪。我们推荐使用这一个选项而不是打印全栈的跟踪信息。Groovy 的全栈跟踪非常冗长 (由于其潜在的动态调用机制,然而他们通常不包含你的的代码中哪里错了的相关信息。) - --full-stacktrace
打印全栈的跟踪信息。
通过 gradle.properties 配置构建环境
- org.gradle.daemon
当设置为 true 时,Gradle 守护进程会运行构建。对于本地开发者的构建而言,这是我们最喜欢的属性。开发人员的环境在速度和反馈上会优化,所以我们几乎总是使用守护进程运行 Gradle 作业。 - org.gradle.java.home 为 Gradle 构建进程指定 java home 目录。
- org.gradle.jvmargs 指定用于该守护进程的 jvmargs。该设置对调整内存设置特别有用。目前的内存上的默认设置很大方。
- org.gradle.parallel
如果配置了这一个,Gradle 将在孵化的并行模式下运行。
android简单配置
- 1.apply节点
apply所标识的用以区分了application以及library。这个节点的作用就是用来区分当前module是可以作为应用程序还是作为一个应用程序的支持库module。
作为应用程序Application
apply plugin:'com.android.application'
作为库module使用
apply plugin: 'com.android.library'
- 2.android节点
packagingOptions:
packagingOptions {
pom.properties'
exclude 'project.properties'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/DEPENDENCIES'
}
lintOptions lint选项:
lintOptions {
disable 'MissingTranslation' //是否支持国际化
abortOnError false //lint检查时如果出现error是否需要中断
ignoreWarnings true //忽略警告
}
signingConfigs:签名配置
signingConfigs {
debug { //debug包签名
keyAlias 'android'
keyPassword 'android'
storeFile file('E:/debug.jks')
storePassword 'android'
}
release { //release包签名
keyAlias 'psw'
keyPassword 'psw'
storeFile file('keystore addresss')
storePassword 'psw'
}
}
compileSdkVersion 26 //编译SDk的版本号
buildToolsVersion "26.0.2" // 使用的编译工具版本号指定
defaultConfig {
applicationId "com.xxx"//app的唯一标识符,一般使用包名
minSdkVersion 14 //app要求最低的SDK版本号 对于应android可使用的最低系统版本
targetSdkVersion 26 //目标版本SDK版本号
versionCode 1 // app版本号
versionName "1.0.0" // app版本名称
// 多渠道打包默认渠道(以umeng为例)
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "GF"]
}
buildTypes设置编译对应的版本时所需的一些配置设置,
可以针对调试版和发布版进行不同的设置是否需要混淆、
是否需要压缩、是否需要删减无用资源等。
buildTypes {
debug {
minifyEnabled false
zipAlignEnabled false
shrinkResources false
}
release {
minifyEnabled true
zipAlignEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets用来设置项目对应文件资源的路径位置,比如
习惯平常的把jni文件so包存放在libs目录下
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
java.srcDirs = ['src/main/java']
renderscript.srcDirs = ['src/main']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['src/main/assets']
jniLibs.srcDirs = ['src/main/jniLibs']
jni.srcDirs = [] //不使用AS编译jni
}
}
productFlavors:提供了多渠道打包的渠道设置,成列了可生产的取到列表,
dependencies下面是项目的依赖第三方支持库存放,包括libs目录及目录树下子目录所有的jar包,以及按照jcenter仓库库命名的的三方支持库:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
compile 'com.squareup.picasso:picasso:2.5.2' //picasso
compile 'com.squareup.okio:okio:1.6.0' //okio
compile 'com.squareup:otto:1.3.8' //otto
compile 'com.alibaba:fastjson:1.2.7' //fastjson
}
2018-5-19 新增
六种依赖(Compile,Provided,APK,Test compile,Debug compile,Release compile)
- Compile:compile是对所有的build type以及favlors都会参与编译并且打包到最终的apk文件中。
- Provided:Provided 是对所有的 build type 以及 favlors 只在编译时使用,类似eclipse中的external-libs,只参与编译,不打包到最终apk
- APK:只会打包到 apk 文件中,而不参与编译,所以不能再代码中直接调用 jar 中的类或方法,否则在编译时会报错
- Test compile,Debug compile,Release compile分别是在不用环境使用
其实除了上面提供的6中依赖方式,还有一些支持的方式:android-apt、annotationProcessor 。
gradle升级3.0后替代:
- api 指令:完全等同于compile指令,没区别,你将所有的compile改成api,完全没有错。
- implementation指令:就是使用implementation指令的依赖不会传递只能在当前module使用,外部module引用不到
在Google IO 相关话题的中提到了一个建议,就是依赖首先应该设置为implementation的,如果没有错,那就用implementation,如果有错,那么使用api指令。使用implementation会使编译速度有所增快。
网友评论