升級Gradle 3.x 總結(jié)及問題匯總

升級Gradle3.0

業(yè)精于勤荒于嬉,行成于思毀于隨

Android Gradle 3.0.0插件是一個大版本的升級柒莉,對于構(gòu)建多個module帶來了顯著的性能提升。但同時也更新了DSL和APIS。

升級Gradle3.0所帶來的好處如下:

  • 通過細粒度的任務圖更好地實現(xiàn)多模塊項目的并行性
  • Variant-aware dependency management (變體感知的依賴管理)
  • 可以使用Gradle的新依賴項配置來限制哪些依賴項將其API泄漏到其他模塊:implementation,api愉粤,compileOnly和runtimeOnly。從而增加構(gòu)建速度拿撩。
  • 使用 per-class dexing 加快增量構(gòu)建速度衣厘。每個類被編譯成一個獨立的dex文件,并且只有這個類被修改后才會重新編譯压恒。

升級步驟

升級Gradle版本影暴。在gradle/wrapper/gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

升級Android Gradle Plugin版本。在工程的build.gradle

classpath 'com.android.tools.build:gradle:3.1.3'

新的依賴配置

新配置 棄用
implementation compile 在編譯時探赫,該模塊的依賴不會泄露給其他模塊坤检。只有在運行時其他模塊才能獲取依賴。
api compile 不論是在編譯時期吓,還是在運行時,其他模塊都可以獲得這個依賴倾芝。
compileOnly provided 依賴項僅在編譯時對模塊可用讨勤,并且在編譯或運行時對其消費者不可用。 此配置的行為類似于 provided(現(xiàn)在已棄用)晨另。
runtimeOnly apk 依賴項僅在運行時對模塊及其消費者可用潭千。 此配置的行為類似于 apk(現(xiàn)在已棄用)。

升級Gradle3.0問題匯總

此處總結(jié)我在升級公共庫和項目的gradle版本時借尿,所遇到的問題刨晴。

問題一

  1. Gradle 3.0 API更新較多屉来。例如,PrepareLibraryTask等類被移除掉

解決方式

把移除掉的類全部拿過來狈癞,放在本地茄靠。將gradle2.3的PrepareLibraryTask挪到本地。

注意問題

  1. 在gradle2.3中的PrepareLibraryTask類中使用@ParallelizableTask注解蝶桶。而在gradle3.0中該注解被刪除慨绳,可以使用WorkerExecutor API替換。
  2. PrepareLibraryTask類中去掉useBuildCache相關(guān)代碼

問題二

Cannot invoke method doLast() on null object

對這個task做判空操作真竖。

問題三

Error:Unable to resolve dependency for ':app@debug/compileClasspath':
  Could not resolve project :library

使用變體的依賴關(guān)系解決方案脐雪,您不再需要使用特定于變體的配置(例如freeDebugImplementation)來獲取本地模塊依賴關(guān)系 - 插件會自動提供配置。

// implementation project(path: ":dcsdk",configuration:'debug')

implementation project(":dcsdk") // 用這種替換

問題四

Resolving configuration 'provided' directly is not allowed

解決方案

設(shè)置setCanBeResolved(true)恢共,剛開始并沒有作用战秋。后來發(fā)現(xiàn),主項目是通過jar包的形式加載bytePlugin插件讨韭。雖然修改了代碼脂信,但是并沒有打包到指定位置。將其打包到指定位置拐袜,就可以解決此問題吉嚣。

問題五

java.lang.RuntimeException:com.android.builder.dexing.DexArchiveMergerException:

包重復引用。將bytecodemonitor中的

implementation fileTree(dir: 'libs', include: ['*.jar'])

修改為

compileOnly fileTree(dir: 'libs', include: ['*.jar'])

問題六

Could not resolve all dependencies for configuration ':demo:debugAndroidTestCompileClasspath'.

A problem occurred configuring project ':sdk'.

ABIs [mips64, armeabi, mips] are not supported for platform. Supported ABIs are [armeabi-v7a, arm64-v8a, x86, x86_64].

解決方案

最新的NDK r17版本蹬铺,已經(jīng)去掉了armeabi尝哆、mips、mips64的ABI支持甜攀。

去掉abiFilters中的armeabi選項

ndk {
            abiFilters 'x86', 'x86_64',  'armeabi-v7a', 'arm64-v8a'
        }

問題七

Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all files for configuration ':demo:releaseUnitTestRuntimeClasspath'.
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.rethrowFailure(DefaultConfiguration.java:918)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1600(DefaultConfiguration.java:116)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getFiles(DefaultConfiguration.java:892)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getFiles(DefaultConfiguration.java:404)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getFiles(Unknown Source)
    at org.gradle.api.file.FileCollection$getFiles.call(Unknown Source)
    at com.netease.tech.analysis.plugin.MobileAnalysisPlugin$_apply_closure2$_closure3.doCall(MobileAnalysisPlugin.groovy:53)
    at sun.reflect.GeneratedMethodAccessor607.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
    at groovy.lang.Closure.call(Closure.java:414)
    at groovy.lang.Closure.call(Closure.java:430)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2040)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2025)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2078)
    at org.codehaus.groovy.runtime.dgm$165.invoke(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoMetaMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:251)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:71)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at com.netease.tech.analysis.plugin.MobileAnalysisPlugin$_apply_closure2.doCall(MobileAnalysisPlugin.groovy:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
    at groovy.lang.Closure.call(Closure.java:414)
    at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:40)
    at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:25)
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
    at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
    at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
    at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
    at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
    at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
    at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy27.afterEvaluate(Unknown Source)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:76)
    ... 85 more

解決方案

問題定位到自定義插件的代碼

              if (conf.isCanBeResolved()) {
                   f.addAll(conf.getFiles())
               }

當調(diào)用conf.getFiles() 方法時秋泄,就會報錯。報錯的信息顯示规阀,Could not resolve all files for configuration':demo:releaseUnitTestRuntimeClasspath'恒序。根據(jù)報錯信息提示,應該是解析不了releaseUnitTestRuntimeClasspath配置的一些文件谁撼。

這個問題困擾了很久歧胁,最終臨時把這些解析不了的task全部過濾掉,然后就可以正常運行了厉碟。

問題八

    Error:(94, 5) style attribute '@android:attr/windowExitAnimation' not found
    Error:(94, 5) style attribute '@android:attr/windowEnterAnimation' not found

解決方案

移除@喊巍,即將

<item name="@android:windowEnterAnimation">@anim/anim_toast_show</item>
<item name="@android:windowExitAnimation">@anim/anim_toast_hide</item>

改為:

<item name="android:windowEnterAnimation">@anim/anim_toast_show</item>
<item name="android:windowExitAnimation">@anim/anim_toast_hide</item>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市箍鼓,隨后出現(xiàn)的幾起案子崭参,更是在濱河造成了極大的恐慌,老刑警劉巖款咖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何暮,死亡現(xiàn)場離奇詭異奄喂,居然都是意外死亡,警方通過查閱死者的電腦和手機海洼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門跨新,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贰军,你說我怎么就攤上這事玻蝌。” “怎么了词疼?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵俯树,是天一觀的道長。 經(jīng)常有香客問我贰盗,道長许饿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任舵盈,我火速辦了婚禮陋率,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秽晚。我一直安慰自己瓦糟,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布赴蝇。 她就那樣靜靜地躺著菩浙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪句伶。 梳的紋絲不亂的頭發(fā)上劲蜻,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音考余,去河邊找鬼先嬉。 笑死,一個胖子當著我的面吹牛楚堤,可吹牛的內(nèi)容都是我干的疫蔓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼身冬,長吁一口氣:“原來是場噩夢啊……” “哼鳄袍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吏恭,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎重罪,沒想到半個月后樱哼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哀九,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年搅幅,在試婚紗的時候發(fā)現(xiàn)自己被綠了阅束。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡茄唐,死狀恐怖息裸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沪编,我是刑警寧澤呼盆,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站蚁廓,受9級特大地震影響访圃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜相嵌,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一腿时、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饭宾,春花似錦批糟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至性湿,卻和暖如春纬傲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肤频。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工叹括, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宵荒。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓汁雷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親报咳。 傳聞我的和親對象是個殘疾皇子侠讯,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)暑刃,斷路器厢漩,智...
    卡卡羅2017閱讀 134,693評論 18 139
  • Gradle升級3.1問題總結(jié) 背景:項目早期用的Gradle插件版本2.3.0,由于版本較老岩臣,無法使用Gradl...
    karlsu閱讀 10,657評論 0 4
  • 原文地址:Android Studio 簡單介紹和使用問題小結(jié) Google在2013的I/O開發(fā)者大會上引入的該...
    如若成楓閱讀 2,201評論 0 3
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,264評論 25 707