原文:https://www.jianshu.com/p/9b25087a5d7dphp
总看别人的文章,今天尝试着本身来写一篇。在逛论坛时候,无心间发现Android Studio 3.0正式版本推送更新了,早据说AS 3.0添加了许多新功能,而后手贱火烧眉毛地想先睹为快,结果正中下怀。下载和更新Gradle,半天无响应,只好结束进程强制关闭AS,手动离线下载安装。本觉得不会有太大问题,谁知过高估了,进来各类的报错,各类的配置问题,填坑之路就此开始。html
Ver:v1.3.171031java
Ver:v2.2.171111android
Ver:v3.2.171231json
Ver:v4.3.180416windows
下面就来看看升级到 Android Studio 3.x(Stable 3.0 ~ 3.1.3)以后,遇到的一些问题:api
修改项目下 gradle/wrapper/gradle-wrapper.propertie 文件中的distributionUrl
AS 3.0 ~ 3.0.1改成:distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
AS 3.1.1 ~3.1.3 改成:distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
ruby
1)项目根目录下的 build.gradle文件中两个repositories
节点都添加google()
bash
buildscript{
repositories {
google() //新增 } dependencies { classpath'com.android.tools.build:gradle:3.0'//与AS版本一致 //classpath'com.android.tools.build:gradle:3.1.1' } } allprojects { repositories{ google() //新增 } }
2)项目app下 build.gradle文件中,修改相关支持库版本app
AS 3.0 ~ 3.0.1:
android {
compileSdkVersion 26 buildToolsVersion "26.0.2" ... } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support:design:26.1.0' testImplementation 'junit:junit:4.12' ... }
AS 3.1.1 ~ 3.1.3:
android {
compileSdkVersion 27 buildToolsVersion "27.0.3" ... } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:design:27.1.1' testImplementation 'junit:junit:4.12' ... }
Error:A problem occurred configuring project ':app'.> All flavors must now belong to a named flavor dimension.
flavorDimensions
属性,用来控制多个版本的代码和资源,缺失就会报错。在项目app下build.gradle文件中,添加flavorDimensions
:android {
...
flavorDimensions "tier","minApi" productFlavors{ fees{ dimension"tier" ... } minApi23{ dimension"minApi" ... } } }
若是不须要多版本控制只需添加:flavorDimensions "code"
(随意定义)
android {
...
defaultConfig {
...
flavorDimensions "code" } ... }
applicationVariants.all { variant ->
variant.outputs.each { output ->
def fileName = "${variant.versionName}_release.apk" def outFile = output.outputFile if (outFile != null && outFile.name.endsWith('.apk')) { output.outputFile =newFile(outFile.parent, fileName) } }
AS 3.0以后,一样代码自定义apk名称却会报错:
Error:(56, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
outputFile
变为只读,不能修改输出的名称因此报错。修改成:applicationVariants.all { variant ->
variant.outputs.all { output -> // each 改成 all def fileName = "${variant.versionName}_release.apk" def outFile = output.outputFile if (outFile != null && outFile.name.endsWith('.apk')) { outputFileName = fileName // output.outputFile 改成 outputFileName } }
把each
修改成all
,而后经过outputFileName
修改生成apk的名称。此外,AS 3.0后打包完,除了apk包文件,还会多一个 output.json 参数文件。
compile
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:26.1.0' compile files('libs/gson-2.3.1.jar') compile project(':mylibrary') ... }
AS 3.0以后依赖关键字:implementation
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:26.1.0' implementation files('libs/gson-2.3.1.jar') implementation project(':mylibrary') ... }
AS 3.0后Gradle关键字依赖发生变化:compile(implementation/api)
,provided(compileOnly)
,apk(runtimeOnly)
AS 3.0后,在使用新依赖配置项时,引用本地库使用
implementation
指令时,若出现找不到导包或资源问题报错,能够更换依赖指令为api
从新编译。关于implementation
和api
的区别,请移驾:AS Gradle依赖项配置
Error: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
在项目根目录下gradle.properties文件中关闭APPT2编译:
...
android.enableAapt2 = false
AAPT err(Facade for):……Unable to open PNG file
android{
...
aaptOptions{
cruncherEnabled = false useNewCruncher = false } ... }
用来关闭AS图片PNG合法性检查的,直接不让它检查。
1 ) .9.png图片放在
res/drawable
文件夹下
2 ) .9.png图片四边都要有黑线,确保图片是标准的.9.png
图片
1 ) 若是你还在2.3.x的环境下开发,为了不输入法问题,建议你暂时不要升级到3.x;
2 ) 若是你想2.3.x升级使用3.x,那么不建议你使用2.x的jre替换3.x的jre方式去处理输入法问题,虽然暂时能够解决输入问题,可是后面升级的时候你还得把2.x 的jre换回3.x的jre,不然升级后将没法正常使用AS;
3 ) 最简单最有效的解决办法就是在使用 AS的时候,切换到 windows自带的中文输入法就能够正常输入中文筛选词语了,相对而言,这样方便不少。虽然没有第三方输入法用起来那么顺手,可是能够有效解决输入法问题和避免之后升级的问题;
4 ) 终极方案:升级到 AS 3.1.1便可解决,AS 3.1.1已经修复了输入法中文状态下没法选词的BUG。
Error: Removing unused resources requires unused code shrinking to be turned on.
android {
...
buildTypes {
debug {
signingConfig signingConfigs.release
debuggable true zipAlignEnabled true minifyEnabled true //是否混淆 shrinkResources true //是否去除无效的资源文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { signingConfig signingConfigs.release zipAlignEnabled true debuggable true minifyEnabled true //是否混淆 shrinkResources true //是否去除无效的资源文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } ... }
AS 3.0.1后,若是使用shrinkResources
来移除未引用资源,必需要先开启混淆minifyEnabled
,才能经过资源压缩器将它们移除,不然编译会报错。
Error
AS在线升级后,安装重启软件时会出现部分文件安装冲突。以下图所示:
Solution
方法一:
1)找到 AS 安装目录下的 uninstall.exe 卸载文件,运行卸载当前旧版本AS(卸载前记得备份代码和配置文件);
2)下载最新版本的AS安装包,运行安装并导入配置文件和项目。
方法二:
1)点击 Cancel 取消安装并关闭AS;
2)找到 AS 安装目录下的 studio64.exe 启动文件,右键 —— 以管理员身份运行 打开AS(提升AS的权限);
3)点击 Help —— Checkout for Updates —— Update and Restart 从新更新下载安装。
Google官方文档
https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration
https://developer.android.com/studio/releases/
Android Studio下载
https://developer.android.google.cn/studio/archive.html
Android Gradle下载
http://services.gradle.org/distributions
上述就是AS 2.x升级AS 3.x所遇到的问题,可能每一个人状况不同,遇到的问题也不尽相同。但愿有相似经历和问题的小伙伴,能够帮助大家少走一些弯路。
初次写,若有不对和欠稳当地方,请你们帮忙指正,有疑问和补充的小伙伴请留言告知,万分感谢!文章会持续更新。