升级Gradle 3.x 总结及问题汇总

升级Gradle3.0

业精于勤荒于嬉,行成于思毁于随

Android Gradle 3.0.0插件是一个大版本的升级,对于构建多个module带来了显著的性能提升。但同时也更新了DSL和APIS。

升级Gradle3.0所带来的好处如下:

  • 通过细粒度的任务图更好地实现多模块项目的并行性
  • Variant-aware dependency management (变体感知的依赖管理)
  • 可以使用Gradle的新依赖项配置来限制哪些依赖项将其API泄漏到其他模块:implementation,api,compileOnly和runtimeOnly。从而增加构建速度。
  • 使用 per-class dexing 加快增量构建速度。每个类被编译成一个独立的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(现在已弃用)。
runtimeOnly apk 依赖项仅在运行时对模块及其消费者可用。 此配置的行为类似于 apk(现在已弃用)。

升级Gradle3.0问题汇总

此处总结我在升级公共库和项目的gradle版本时,所遇到的问题。

问题一

  1. Gradle 3.0 API更新较多。例如,PrepareLibraryTask等类被移除掉

解决方式

把移除掉的类全部拿过来,放在本地。将gradle2.3的PrepareLibraryTask挪到本地。

注意问题

  1. 在gradle2.3中的PrepareLibraryTask类中使用@ParallelizableTask注解。而在gradle3.0中该注解被删除,可以使用WorkerExecutor API替换。
  2. PrepareLibraryTask类中去掉useBuildCache相关代码

问题二

Cannot invoke method doLast() on null object

对这个task做判空操作。

问题三

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

使用变体的依赖关系解决方案,您不再需要使用特定于变体的配置(例如freeDebugImplementation)来获取本地模块依赖关系 - 插件会自动提供配置。

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

implementation project(":dcsdk") // 用这种替换

问题四

Resolving configuration 'provided' directly is not allowed

解决方案

设置setCanBeResolved(true),刚开始并没有作用。后来发现,主项目是通过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版本,已经去掉了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())
               }

当调用conf.getFiles() 方法时,就会报错。报错的信息显示,Could not resolve all files for configuration':demo:releaseUnitTestRuntimeClasspath'。根据报错信息提示,应该是解析不了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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容