详解Android Gradle插件3.0挖坑日记
作者:小之丶 发布时间:2022-02-06 09:03:19
为了提升编译速度,这几天用上了 AS 3.0 和 Gradle 3.0 插件,不得不说不论是 AS 3.0,还是 Gradle 3.0 都变化非常大,具体的更新日志参考下官网,其中 Gradle 3.0的配置和可能遇到的问题可以说是非常详细了。Gradle 4.1-all 官方下载速度很慢,我直接放出来下载地址和相关官方文档地址吧。
Gradle 4.1
Android Studio
Gradle
配置属性
下面来列决下我遇到的坑和解决方法:
配置属性的改动
Gradle 3.0 和之前有一点很大的不同就是配置属性的变化,详情可以参考上面列出的配置属性链接,这里我再具体的把两个关键字implementation和api解释一下。这里我使用的插件版本为build:gradle:3.0.0-beta5
api
api你可以简单的理解为之前的compile。举个例子,你使用api在lib.A下的build.gradle引用一个本地lib包,这里假设名为lib.A,那么当lib.B有改动的时候,重新编译不仅会编译lib.B,还会编译包括lib.A的所有通过api引用它的包。使用api进行引用,相当于把lib.B对外暴露了接口,这时候,假使有一个lib.C引用了lib.A,那么lib.C是可以直接使用lib.B的代码的。简单的画个图来解释下。
可以看到,通过api来引用实际上是和原来的compile一样的,虽然可以让lib.B的接口让lib.C来使用,但当lib.B有代码改动的时候,lib.A和lib.C都需要重新编译,无疑编译速度大大降低了。
implementation
如下图所示。implementation 引用的 lib 不会对外暴露自己的接口,也就是说,当lib.A implementation lib.B,lib.C implementation lib.A 的时候,如果lib.B发生了改变,那么只有lib.A会重新编译,lib.C将不会编译!这将大大减少编译时间。
总而言之,更好的方式就是尽量使用implementation来进行依赖,这样会大大改善工程的构建时间,除非你明确需要向外暴露当前 lib 依赖的接口时,才需要使用 api 依赖。
官方的 Maven 库
之后很多官方库的最新版本比如multidex等等,都会在官方的 Maven 库中进行更新,所以,如果你需要引用这些最新版本的库,你就需要配置官方的 Maven 地址
maven {
url "https://maven.google.com"
}
如果你使用的是 4.0 版本以上的 gradle,那么可以直接使用 google() 来配置仓库:
repositories {
google()
}
一些报错
1. Error:Could not get unknown property ‘apkVariantData' for object of type com.android.build.gradle.internal.api.ApplicationVariantImpl.
Gradle 3.0 的 api 有一些变化,所以如果你项目中引用了一些第三方 gradle 插件使用了一些旧的api,就会导致报错,比如这里就是因为apkVariantData这个指令已经从 gradle 3.0 剔除了。
解决方法首先是看看你引用的包的最新版本有没有适配3.0的。如果没有,要么你去下载它的插件源码,升级它的 gradle 插件到 3.0 ,再自己把过时的 api 换掉,要不就先暂时在项目中注释掉相关插件代码。
比如我这里就是因为AndResGuard使用了这个老 api 导致的报错。
2. Error:The specified Android SDK Build Tools version (23.0.1) is ignored, as it is below the minimum supported version (25.0.0) for Android Gradle Plugin 3.0.0-beta5.Android SDK Build Tools 26.0.0 will be used.
Gradle 3.0 的最低支持 SDK Build Tools 版本为 25.0.0,所以如果你的项目中的 application 和 library 使用了比它低的版本,就会报这个错误。
3. Error:Removing unused resources requires unused code shrinking to be turned on. See http://d.android.com/r/tools/shrink-resources.html for more information.
官网的说明很清楚了:
资源压缩只与代码压缩协同工作。代码压缩器移除所有未使用的代码后,资源压缩器便可确定应用仍然使用的资源。这在您添加包含资源的代码库时体现得尤为明显 - 您必须移除未使用的库代码,使库资源变为未引用资源,才能通过资源压缩器将它们移除。
要启用资源压缩,请在 build.gradle 文件中将 shrinkResources 属性设置为 true(在用于代码压缩的 minifyEnabled 旁边)。例如:
android {
...
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
加上这些代码。问题即可解决。
4. Error:java.lang.RuntimeException: Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor. Please add them to the annotationProcessor configuration.
这个问题是注解适配问题,新的 gradle 插件不再支持 annotation processors,如果需要使用需要显式声明:
defaultConfig{
...
versionCode 1
versionName 1.0
javaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath false
}
}
}
5.All flavors must now belong to named flavor dimension.
参考官网链接 : 官网解决链接
截个图
6. databinding
不仅需要
dataBinding {
enabled = true
}
还需要
implementation 'com.android.databinding:library:1.3.1'
implementation 'com.android.databinding:adapters:1.3.1'
来源:http://blog.csdn.net/qq_34795285/article/details/78194282


猜你喜欢
- 包装类包装类其实就是8种基本数据类型对应的引用类型。基本数据类型引用数据类型byteByteshortShortintIntegerlong
- 作者: juky_huang 事件的简单解释: 事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如
- 函数InternetGetConnectedState返回本地系统的网络连接状态。语法:BOOL InternetGetConnectedS
- 原理 Redis Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主
- 前言相信每位Android开发者都用过Toast,都知道是弹出消息的。类似于js里面的alert,C#里面的MesageBox。当然andr
- 下面由我来给大家展示用spring aop实现 * 的例子(电脑打印)下面就看一下具体的代码:先定义一个打印机的接口package aop
- 在Java的内存分配中,总共3种常量池:Java 常量池详解(二)class文件常量池 和 Java 常量池详解(三)class运行时常量池
- 1集合的概念把集合看做是一个容器,集合不是一个类,是一套集合框架,框架体系包含很多的集合类,java api提供了集合存储任意类型(基本包装
- SearchView是搜索框组件,它可以让用户在文本框里输入文字,通过 * 取得用户的输入,当用户点击搜索时, * 执行实际的搜索。本文就为
- maven配置阿里云镜像打开maven配置文件,找到标签,添加如下:<mirrors> <mirror>
- 一、spring定时任务执行两次问题重现和解析最近使用quartz定时任务框架,结果发现开发环境执行无任何问题,部署到服务器上后,发现同一时
- 本文实例讲述了基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览的方法。分享给大家供大家参考。具体分析如下:一
- Python是一种广泛使用的解释型、高级编程、通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年。可以视之为一种改良(加入一些其他
- 1 简介在 Java 语言中,共有 8 个基本的数据类型,分别为:byte、short、int、long、float、double、bool
- ExpandoObject:表示一个对象,该对象包含可在运行时动态添加和移除的成员。 dynamic dynEO = new Expando
- 这篇文章主要介绍了Spring Boot项目维护全局json数据代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使
- 本文实例为大家分享了Java判断对象是否为空的具体代码,供大家参考,具体内容如下package com.gj5u.publics.util;
- 注:完整项目下载在处理了核心任务之后,我们会发现有些请求并不是都是静态的,那么我们就需要进行实现处理动态请求的要求,如下面代码是我们请求的解
- 一篇小白也能看懂的查找游戏物体的方式解析 – Unity 之 查找物体的几种方式。本文通过实际测试得出使用结论,大家进行简单记录,在使用时想