Android Studio 3.0升级爬坑记

作者: junjunxx | 来源:发表于2017-10-27 15:20 被阅读1598次
cover.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就是系统为我们创建的。

gradle目录.png

如果没有的话我们可以手动创建,然后删除该目录下的所有内容,将我们下载的gralde压缩包复制到该目录下(千万别手动解压),重启Android Studio,AndroidStudio会自动识别到我们下载的gradle压缩包,解压配置,至此Gradle更新就完成了

2.buildToolsVersion

配置完成Gradle后,编译工程,我们会遇到如下的问题

buildToolsVersion错误.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以前我们只如下配置

compile.png

如上配置,我们就可以在ModuleA中访问到ModuleC的内容了,但是在Android Studio3.0中,并不是将compile换成implementation就可以了,依然会报错,我们需要在ModuleA中再次引入ModuleC才行,如下

implementation.png

上述就是我整个升级过程中遇到的问题,花费了我半天的时间,希望对大家有帮助 _

相关文章

网友评论

  • 773e36d35f14:failed to find build tools revision26.0.2。没有外网这个怎么解呀,gradle里面的compilesdkversion和targetsdkversion都改了,还是没用

    junjunxx:下载一下build tools 26.0.2,这个不需要外网哦

本文标题:Android Studio 3.0升级爬坑记

本文链接:https://www.haomeiwen.com/subject/pczrpxtx.html