Android Studio 编译时几个小问题的解决

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.

发现还要调整脚本本身,要把

改成

简直就是刘三要唤作汉高祖的节奏。

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 条目直接删除即可。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注