1. 笼统地说,Android Studio 的编译系统使用的是 gradle,但这块其实又是由好几个相互纠缠的不同部分组成的。有 gradle 自身,有 gradle-wrapper,有 gradle plugin,又有其它工程中的依赖与 gradle 进行交互的插件(例如 fabric)。
最恶心的是,不少东西在 gradle 脚本里,对象模型很不稳定,版本变化快,里面的对象结构变得也快,相同的功能在不同的写法之间切换,有时候是 all,有时候又是 each,一团糟。
我之前维护的一个三年前的工程,在不同的机器上编译,由于 Android Studio 给出的 gradle 升级建议在不同时间点上的不同,会导致 build.gradle 改来改去。在 Linux 上,应用的 io.fabric.tools:gradle:1.27.1
依赖与整个工程的 com.android.tools.build:gradle:2.3.3
配合完全没有问题。但把工程在 Windows 下打开后,Android Studio 几乎是强迫我要把 fabric 的依赖升到 io.fabric.tools:gradle:1.28
(其实前面那个 1.27.1
也是被胁迫的,最开始写的是 1.+
),然后就会导致整个工程随之调整为依赖 com.android.tools.build:gradle:4.0.1
,然后,你就会得到一个编译错误:
Cannot set the value of read-only property ‘outputFile’ for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[], versionCode=VV, versionName=X.YY.ZZ} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
发现还要调整脚本本身,要把
1 2 3 4 5 |
applicationVariants.all { variant -> variant.outputs.each { output -> output.outputFile = new File(output.outputFile.parent, "app-release.apk") } } |
改成
1 2 3 4 5 |
applicationVariants.all { variant -> variant.outputs.all { output -> outputFileName = "app-release.apk" } } |
简直就是刘三要唤作汉高祖的节奏。
2. 一番升级以后,你会发现每次打开工程,还会出现以下红色警告:
unsupported modules detected Compilation is not supported for following modules: app. Unfortunately you can’t have non-Gradle Java modules and Android-Gradle modules in one project
然而却又不影响别的什么,只是看着厌烦。有网友记录了他的解决方法(https://blog.csdn.net/qq_30552993/article/details/83383095)。略显粗暴了些,我略微查看了一下,明白了其中问题。
工程的 .idea
目录下的 modules.xml
文件里,有工程内所有模块的清单。但是随着工具的升级,模块的组织表达方式也进行了相应的自动更新,但是是与老的信息共存的。老的 module 信息条目中,.iml
文件可以在模块自己的目录下,新的组织,统一归拢到了 .idea/modules
目录下。特定工具的组织信息集中存储放置,是正确的变化。
知道了上述的背景,要消除这个警告的方法就呼之欲出了,特简单,把冗余的旧的格式的 module
条目直接删除即可。