Android Gradle 插件 3.0 挖坑日记

为了提高编译速度,这几天用上了 AS 3.0 和 Gradle 3.0 插件,不得不说不管是 AS 3.0,仍是 Gradle 3.0 都变化很是大,具体的更新日志参考下官网,其中 Gradle 3.0的配置和可能遇到的问题能够说是很是详细了。Gradle 4.1-all 官方下载速度很慢,我直接放出来下载地址和相关官方文档地址吧。html

Gradle 4.1-all.aip 密码: 2ujf
Android Studio
Gradle
配置属性官方迁移指南java

下面来列决下我遇到的坑和解决方法:android

配置属性的改动

Gradle 3.0 和以前有一点很大的不一样就是配置属性的变化,详情能够参考上面列出的配置属性连接,这里我再具体的把两个关键字implementationapi解释一下。这里我使用的插件版本为build:gradle:3.0.0-beta5api

api

api你能够简单的理解为以前的compile。举个例子,你使用apilib.A下的build.gradle引用一个本地lib包,这里假设名为lib.A,那么当lib.B有改动的时候,从新编译不只会编译lib.B,还会编译包括lib.A的全部经过api引用它的包。使用api进行引用,至关于把lib.B对外暴露了接口,这时候,假使有一个lib.C引用了lib.A,那么lib.C是能够直接使用lib.B的代码的。简单的画个图来解释下。android-studio

api引用示例.png
api引用示例.png

能够看到,经过api来引用其实是和原来的compile同样的,虽然可让lib.B的接口让lib.C来使用,但当lib.B有代码改动的时候,lib.Alib.C都须要从新编译,无疑编译速度大大下降了。app

implementation

以下图所示。implementation 引用的 lib 不会对外暴露本身的接口,也就是说,当lib.A implementation lib.Blib.C implementation lib.A 的时候,若是lib.B发生了改变,那么只有lib.A会从新编译,lib.C将不会编译!这将大大减小编译时间。maven

implementation引用实例
implementation引用实例

总而言之,更好的方式就是尽可能使用implementation来进行依赖,这样会大大改善工程的构建时间,除非你明确须要向外暴露当前 lib 依赖的接口时,才须要使用 api 依赖。ide

官方的 Maven 库

以后不少官方库的最新版本好比multidex等等,都会在官方的 Maven 库中进行更新,因此,若是你须要引用这些最新版本的库,你就须要配置官方的 Maven 地址gradle

maven {
        url "https://maven.google.com"
}复制代码

若是你使用的是 4.0 版本以上的 gradle,那么能够直接使用 google() 来配置仓库:ui

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 d.android.com/r/tools/shr… 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'复制代码
相关文章
相关标签/搜索