詳解Android Gradle插件3.0挖坑日記
為了提升編譯速度,這幾天用上了 AS 3.0 和 Gradle 3.0 插件,不得不說(shuō)不論是 AS 3.0,還是 Gradle 3.0 都變化非常大,具體的更新日志參考下官網(wǎng),其中 Gradle 3.0的配置和可能遇到的問(wèn)題可以說(shuō)是非常詳細(xì)了。Gradle 4.1-all 官方下載速度很慢,我直接放出來(lái)下載地址和相關(guān)官方文檔地址吧。
下面來(lái)列決下我遇到的坑和解決方法:
配置屬性的改動(dòng)
Gradle 3.0 和之前有一點(diǎn)很大的不同就是配置屬性的變化,詳情可以參考上面列出的配置屬性鏈接,這里我再具體的把兩個(gè)關(guān)鍵字implementation和api解釋一下。這里我使用的插件版本為build:gradle:3.0.0-beta5
api
api你可以簡(jiǎn)單的理解為之前的compile。舉個(gè)例子,你使用api在lib.A下的build.gradle引用一個(gè)本地lib包,這里假設(shè)名為lib.A,那么當(dāng)lib.B有改動(dòng)的時(shí)候,重新編譯不僅會(huì)編譯lib.B,還會(huì)編譯包括lib.A的所有通過(guò)api引用它的包。使用api進(jìn)行引用,相當(dāng)于把lib.B對(duì)外暴露了接口,這時(shí)候,假使有一個(gè)lib.C引用了lib.A,那么lib.C是可以直接使用lib.B的代碼的。簡(jiǎn)單的畫(huà)個(gè)圖來(lái)解釋下。

可以看到,通過(guò)api來(lái)引用實(shí)際上是和原來(lái)的compile一樣的,雖然可以讓lib.B的接口讓lib.C來(lái)使用,但當(dāng)lib.B有代碼改動(dòng)的時(shí)候,lib.A和lib.C都需要重新編譯,無(wú)疑編譯速度大大降低了。
implementation
如下圖所示。implementation 引用的 lib 不會(huì)對(duì)外暴露自己的接口,也就是說(shuō),當(dāng)lib.A implementation lib.B,lib.C implementation lib.A 的時(shí)候,如果lib.B發(fā)生了改變,那么只有l(wèi)ib.A會(huì)重新編譯,lib.C將不會(huì)編譯!這將大大減少編譯時(shí)間。

總而言之,更好的方式就是盡量使用implementation來(lái)進(jìn)行依賴,這樣會(huì)大大改善工程的構(gòu)建時(shí)間,除非你明確需要向外暴露當(dāng)前 lib 依賴的接口時(shí),才需要使用 api 依賴。
官方的 Maven 庫(kù)
之后很多官方庫(kù)的最新版本比如multidex等等,都會(huì)在官方的 Maven 庫(kù)中進(jìn)行更新,所以,如果你需要引用這些最新版本的庫(kù),你就需要配置官方的 Maven 地址
maven {
url "https://maven.google.com"
}
如果你使用的是 4.0 版本以上的 gradle,那么可以直接使用 google() 來(lái)配置倉(cāng)庫(kù):
repositories {
google()
}
一些報(bào)錯(cuò)
1. Error:Could not get unknown property ‘a(chǎn)pkVariantData' for object of type com.android.build.gradle.internal.api.ApplicationVariantImpl.
Gradle 3.0 的 api 有一些變化,所以如果你項(xiàng)目中引用了一些第三方 gradle 插件使用了一些舊的api,就會(huì)導(dǎo)致報(bào)錯(cuò),比如這里就是因?yàn)閍pkVariantData這個(gè)指令已經(jīng)從 gradle 3.0 剔除了。
解決方法首先是看看你引用的包的最新版本有沒(méi)有適配3.0的。如果沒(méi)有,要么你去下載它的插件源碼,升級(jí)它的 gradle 插件到 3.0 ,再自己把過(guò)時(shí)的 api 換掉,要不就先暫時(shí)在項(xiàng)目中注釋掉相關(guān)插件代碼。
比如我這里就是因?yàn)锳ndResGuard使用了這個(gè)老 api 導(dǎo)致的報(bào)錯(cuò)。
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,所以如果你的項(xiàng)目中的 application 和 library 使用了比它低的版本,就會(huì)報(bào)這個(gè)錯(cuò)誤。
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.
官網(wǎng)的說(shuō)明很清楚了:
資源壓縮只與代碼壓縮協(xié)同工作。代碼壓縮器移除所有未使用的代碼后,資源壓縮器便可確定應(yīng)用仍然使用的資源。這在您添加包含資源的代碼庫(kù)時(shí)體現(xiàn)得尤為明顯 - 您必須移除未使用的庫(kù)代碼,使庫(kù)資源變?yōu)槲匆觅Y源,才能通過(guò)資源壓縮器將它們移除。
要啟用資源壓縮,請(qǐng)?jiān)?build.gradle 文件中將 shrinkResources 屬性設(shè)置為 true(在用于代碼壓縮的 minifyEnabled 旁邊)。例如:
android {
...
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
加上這些代碼。問(wèn)題即可解決。
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.
這個(gè)問(wèn)題是注解適配問(wèn)題,新的 gradle 插件不再支持 annotation processors,如果需要使用需要顯式聲明:
defaultConfig{
...
versionCode 1
versionName 1.0
javaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath false
}
}
}
5.All flavors must now belong to named flavor dimension.
參考官網(wǎng)鏈接 : 官網(wǎng)解決鏈接
截個(gè)圖

6. databinding
不僅需要
dataBinding {
enabled = true
}
還需要
implementation 'com.android.databinding:library:1.3.1' implementation 'com.android.databinding:adapters:1.3.1'
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 為Android Studio編寫(xiě)自定義Gradle插件的教程
- 詳解如何使用Android Studio開(kāi)發(fā)Gradle插件
- Android gradle插件打印時(shí)間戳的方法詳解
- Android Studio Gradle插件版本與Gradle版本之間的對(duì)應(yīng)關(guān)系
- AndroidStudio升級(jí)4.1坑(無(wú)法啟動(dòng)、插件plugin不好用、代碼不高亮)
- AndroidStudio升級(jí)4.1后啟動(dòng)失敗Plugin問(wèn)題解決
- 解決Android Studio4.1沒(méi)有Gsonfomat插件,Plugin “GsonFormat” is incompatible的問(wèn)題
- Android自定義Gradle插件的詳細(xì)過(guò)程
- Android?Studio?中Gradle配置sonarqube插件(推薦)
- Android?Gradle?插件自定義Plugin實(shí)現(xiàn)注意事項(xiàng)
相關(guān)文章
Android學(xué)習(xí)系列一用按鈕實(shí)現(xiàn)顯示時(shí)間
這篇文章主要介紹了Android學(xué)習(xí)系列一用按鈕實(shí)現(xiàn)顯示時(shí)間的相關(guān)資料,需要的朋友可以參考下2016-05-05
Android利用Senser實(shí)現(xiàn)不同的傳感器
這篇文章主要為大家詳細(xì)介紹了Android利用Senser實(shí)現(xiàn)不同傳感器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Android開(kāi)發(fā)之TabActivity用法實(shí)例詳解
這篇文章主要介紹了Android開(kāi)發(fā)之TabActivity用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android擴(kuò)展Activity實(shí)現(xiàn)標(biāo)簽頁(yè)效果的具體步驟與相關(guān)技巧,需要的朋友可以參考下2016-03-03
Android性能優(yōu)化之利用強(qiáng)大的LeakCanary檢測(cè)內(nèi)存泄漏及解決辦法
本篇文章主要介紹了Android性能優(yōu)化之利用LeakCanary檢測(cè)內(nèi)存泄漏及解決辦法,有興趣的同學(xué)可以了解一下。2016-11-11
如何在Android中實(shí)現(xiàn)左右滑動(dòng)的指引效果
本篇文章是對(duì)在Android中實(shí)現(xiàn)左右滑動(dòng)指引效果的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Android開(kāi)發(fā)中CheckBox的簡(jiǎn)單用法示例
這篇文章主要介紹了Android開(kāi)發(fā)中CheckBox的簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了Android中CheckBox控件的基本功能設(shè)置與頁(yè)面布局技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
Android實(shí)現(xiàn)基于滑動(dòng)的SQLite數(shù)據(jù)分頁(yè)加載技術(shù)(附demo源碼下載)
這篇文章主要介紹了Android實(shí)現(xiàn)基于滑動(dòng)的SQLite數(shù)據(jù)分頁(yè)加載技術(shù),涉及Android針對(duì)SQLite數(shù)據(jù)的讀取及查詢結(jié)果的分頁(yè)顯示功能相關(guān)實(shí)現(xiàn)技巧,末尾還附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-07-07
android編程實(shí)現(xiàn)類似于支付寶余額快速閃動(dòng)效果的方法
這篇文章主要介紹了android編程實(shí)現(xiàn)類似于支付寶余額快速閃動(dòng)效果的方法,涉及Android時(shí)間函數(shù)的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11

