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'複製代碼
相關文章
相關標籤/搜索