![](https://img.haomeiwen.com/i2369043/737d376352ceeba6.png)
今天闲来无事,正好又收到了Android Studio 3.0版本的推送更新,然后手贱点击了升级,然后就悲剧了,由于构建配置的更新让我踩了好多坑,打了大半天的酱油,这边记录一下这个过程,希望可以帮助到同样刚刚升级Android Studio3.0的同学,少走一些弯路。
最近网上好多介绍Android Studio3.0新版本特性的文章,这边我就不介绍新特性了,自行百度吧,或者可以看看这边文章Android Studio3.0新特性,总之还是挺让我感觉到惊艳的,全新的分析器、内置了文件浏览器等等,都进一步为开发提供了遍历。
下面就看看爬坑之路吧
1.Gradle4.1手动升级
Androit Studio的大版本升级,都会带来对应Gradle的升级,Android Studio3.0使用了最新的3.0的插件,该插件要求Gradle的版本必须是4.1或者更高,所以我们第一件事必须升级Gradle版本。但是Android Studio升级Gradle需要翻墙才能正常工作,恰逢最近又是19大,好多VPN工具都被封掉了,比较尴尬,因此只能手动升级了。我们可以从官网选择对应的版本(我下载的就是4.1,这边下载异常慢,但起码能确保安全性),如果不愿意等待漫长下载过程的,可以从一些资源网站下载,目前也是能找到的。
当Android Studio3.0更新完成后,Android Studio3.0会自动为我们下载最新的Gradle,此时我们关闭Android Studio,进入C盘用户目录下找到.gradle文件夹(Windows默认在C盘用户目录下,Mac需要自行查找了,同样也是.gradle),进入.gradle/wrapper/dists目录下,我们可以看到系统为我们创建了对应版本的gradle目录,此处的gradle-4.1-all就是系统为我们创建的。
![](https://img.haomeiwen.com/i2369043/64894c7fdf3c2745.png)
如果没有的话我们可以手动创建,然后删除该目录下的所有内容,将我们下载的gralde压缩包复制到该目录下(千万别手动解压),重启Android Studio,AndroidStudio会自动识别到我们下载的gradle压缩包,解压配置,至此Gradle更新就完成了
2.buildToolsVersion
配置完成Gradle后,编译工程,我们会遇到如下的问题
![](https://img.haomeiwen.com/i2369043/bb8d6c00617377da.png)
提示说的很明确,最新的3.0版本的Android 插件支持的最低的编译工具版本为26.0.2,我们需要将buildToolsVersion版本更新为26.0.2,当然现在Android Gradle 插件有默认的buildToolsVersion,我们完全可以不设置buildToolsVersion,删除buildToolsVersion即可。
到这一步,一般简单工程基本也算配置完成,但是,如果你在项目中配置了风味(flavors),buildTypes,那么下面还有坑等着我们,爬坑前,建议大家阅读一下官方文档,这是爬坑的依据所在。
3.Variant变体
我自己的工程使用了渠道打包,所以我在build.gradle中配置了风味,举个例子:
productFlavors {
marketA {}
marketB {}
}
当前也有buildTypes为release和debug
buildTypes {
release {}
debug {}
}
这种情况下,我们产生四个变体,分别为:
- marketARelease
- marketADebug
- marketBRelease
- marketBDebug
以上写法在Android Studio3.0之前是没有问题的,大家都是这么写的,但是更新过Android Studio3.0后,这样子的写法将无法编译通过,会有如下的错误出现:
Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
原因处在哪里?出在Android Studio3.0使用的android插件,3.0版本的插件规定所有的flavors必须属于一个flavordimension,即我们要在所有plavor中返回一个flavordimension。flavordimension其实是一种便于我们对变体进一步控制的方式,对productFlavors的进一步分类。看一下如下的例子
buildTypes {
release {}
debug {}
}
//声明flavorDimensions
flavorDimensions "cat", "dog"
productFlavors {
apple {
dimension "cat"
}
pear {
dimension "dog"
}
orange {
dimension "dog"
}
}
以上的配置生成的变体就不是2*3 = 6了,而是先在productFlavors中内部集合,再于buildTypes结合
- applePearRelease
- applePearDebug
- appleOrangeRelease
- appleOrangeDebug
如果我们不希望productFlavors内部结合,那我们只需要再flavorDimensions定义一个值,然后flavor中返回同一个值即可。
4.依赖库的变体自动匹配
Android Gradle plugin 3.0版本包含了一种新的机制,在编译的时候他能根据当前变体去匹配编译依赖module中对应的变体版本,举个例子,如果主工程MainA依赖了ModuleB,当主工程编译debug变体版本时,插件会帮助我们编译获取ModuleB的debug变体版本,非常智能,同时也带来了一些问题,当主工程有release,debug,staging三个变体版本,ModuleB只有release,debug两个版本时,怎么办?编译staging的主工程时会去获取依赖ModuleB的哪个版本?如果没有做任何操作,编译器会给我们抛出如下的错误,
Error:Failed to resolve: Could not resolve project :ModuleB.
Required by:
project :MainA
没法解析到ModuleB,原因很简单,没法找到对应的变体版本,这个时候我们需要使用matchingFallbacks 来指定需要加载的变体版本
android{
buildTypes{
release {}
debug {}
staging{
matchingFallbacks = ['debug', 'release']
}
}
}
matchingFallbacks 可以给定单个值,或者多个以供选择,插件会从前往后一次匹配,直到匹配到第一个满足的版本就不在往后匹配。
5.module依赖
如果你升级了Android Studio3.0,并且新建了一个工程,你会发现,app中的build.gradle中,dependencies这一块发生了改变,之前都是compile xxxx,而现在清一色用了implementation,比如:
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
官方文档明确表示,目前还是支持compile的,但是目前compile已经被implementation与api,并在下一版本更新android gradle plugin的时候完全废除compile,所以目前我们最好使用implementation跟api
-
implementation
implementation引用的库发生变更时,会重新编译当前mudule,其他module不会重新编译,大大减少了编译的工作量,因此提升了编译的效率,一般引用第三方库时使用implementation。
-
api
api应用的库发生变更时,会重新编译当前module,以及从新编译直接或者间接应用当前module的所有module,跟compile很相似。
假设目前工程有三个module,A, B, C,他们的依赖关系时这样的,A依赖B,A依赖C,B依赖C,在AndroidStudio3.0以前我们只如下配置
![](https://img.haomeiwen.com/i2369043/60a6686308339518.png)
如上配置,我们就可以在ModuleA中访问到ModuleC的内容了,但是在Android Studio3.0中,并不是将compile换成implementation就可以了,依然会报错,我们需要在ModuleA中再次引入ModuleC才行,如下
![](https://img.haomeiwen.com/i2369043/e7268f27353e2461.png)
上述就是我整个升级过程中遇到的问题,花费了我半天的时间,希望对大家有帮助 _
网友评论