Groovy是基于JVM虚拟机的一种动态语言,支持闭包,支持DSL。
如何创建一个Task,如何配置它?
Task之间如何建立依赖关系
Task如何使用API控制和task之间的通信
自定义属性,如何控制,如何定义
一个子工程只有在Setting文件里配置了,gradle文件才会识别,才会在构建的时候被包含进去。
任务的doFirst和doLast分别代表任务执行前后做的操作。
- 如何对任务进行分组,排序。
<< 是操作符,在Gradle的task上是以doLast形式标记的,也就是说 << 可以替代doLast
插件的应用都是通过Project.apply()提供的,插件分为二进制插件和脚本插件
android {}这个配置块就是Android Gradle插件为Project对象添加的一个扩展。
Jekins可以为我们做什么?
1,从git版本库获取最新代码
2,对代码配置等进行预处理
3,执行Android Gradle的Task(编译,单元测试等)
4,生成单元测试报告和覆盖率文件等
5,触发代码静态检查
6,一些构建后的处理,比如发送通知邮件等
http://ask.android-studio.org/?/explore/category-gradle
加快apk的构建速度,如何把编译时间从130秒降到17秒:
gradle各种用法:
Android 彻底组件化番外篇-gradle3.0.0
在终端执行
gradle wrapper --gradle-version 3.3
输入这个命令,那么 distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip
就变成3.3了,直接决定你gradle wrapper依赖哪个版本。
强制刷新依赖(就是集成的第三方库)
gradle --refresh-dependencies assemble
Implementation
用它的好处:
使用了该命令编译的依赖,将该依赖隐藏在内部,而不对外部公开
会使编译速度有所增快
compileOnly
- 只在编译时有效,不会参与打包,不会包含到apk文件中。可以用来解决重复导入库的冲突
** 如implementation 'com.android.support:appcompat-v7:23.1.1',和androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.1',所依赖的com.android.support:support-annotations版本不同,导致冲突了,请问怎么办?
1,可以用exclude、force解决
2,统一为所有依赖指定support包的版本,不需要为每个依赖单独设置
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '26.1.0'
}
}
}
}
- AndroidManifest合并错误
在构建应用时,Gradle 构建会将所有清单文件合并到一个封装到 APK 的清单文件中。aar包的清单文件和我们的app清单文件属性冲突时:用tools:replace="属性名"解决。
applicationIdSuffix:应用id后缀
versionNameSuffix:版本名称后缀
debuggable:是否生成一个debug的apk
minifyEnabled:是否混淆
proguardFiles:混淆文件
signingConfig:签名配置
manifestPlaceholders:清单占位符
shrinkResources:是否去除未利用的资源,默认false,表示不去除。
zipAlignEnable:是否使用zipalign工具压缩。
multiDexEnabled:是否拆成多个Dex
multiDexKeepFile:指定文本文件编译进主Dex文件中
multiDexKeepProguard:指定混淆文件编译进主Dex文件中
引用位置
为什么有的引用是放在头部,有的引用需要放置在中间,这个取决于引用的插件是否需要读取application的配置信息,如果是tinker,必须放置在中间,因为它生成patch包需要获取很多application信息,如果是packer打包的话,则不需要,这个需要格外留意一下,不然会有很多莫名其妙的错误。
gradle build --stacktrace