美文网首页Android精选Android技术知识Android
Android Studio 3.0正式版填坑之路

Android Studio 3.0正式版填坑之路

作者: 翻译不了的声响 | 来源:发表于2017-10-31 16:05 被阅读9571次
Android Studio 3.0启动图

序言


总看别人的文章,今天尝试着自己来写一篇。在逛论坛时候,无意间发现Android Studio 3.0正式版本推送更新了,早听说AS 3.0添加了许多新功能,然后手贱迫不及待地想先睹为快,结果正中下怀。下载和更新Gradle,半天无响应,只好结束进程强制关闭AS,手动离线下载安装。本以为不会有太大问题,谁知太高估了,进来各种的报错,各种的配置问题,填坑之路就此开始。

更新内容

Ver:v1.3.171031

  • Gradle关键字依赖变化
  • AAPT2编译报错
  • 相关下载地址

Ver:v2.2.171111

  • 图片错误
  • 输入法中文状态下无法选词

Ver:v3.2.171231

  • 完善中文输入问题
  • AS 3.0.1资源问题

Ver:v4.3.180416

  • AS 3.1.1配置问题
  • 完善相关问题
  • AS更新升级问题

正文


下面就来看看升级到 AS 3.x(3.0 ~ 3.1.2)之后,遇到的一些问题:

1. Gradle版本不匹配

修改项目下 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.2 改为:
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

2. Gradle插件不匹配

1)项目根目录下的 build.gradle文件中两个repositories节点都添加google()

  • E.G
buildscript{
   repositories {
      google() //新增
   }
   dependencies {
      classpath'com.android.tools.build:gradle:3.0'//与AS版本一致
     //classpath'com.android.tools.build:gradle:3.0.1'
     //classpath'com.android.tools.build:gradle:3.1.1'
    }
}
allprojects {
   repositories{   
        google() //新增      
   }
}

2)项目app下 build.gradle文件中,修改相关支持库版本

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.2:

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'
    ...
}
3. Gradle编译报flaovr配置错误
  • Error

Error:A problem occurred configuring project ':app'.> All flavors must now belong to a named flavor dimension.

  • Solution
    AS 3.0后Gradle添加了flavorDimensions属性,用来控制多个版本的代码和资源,缺失就会报错。在项目app下build.gradle文件中,添加flavorDimensions
android {
   ...
   flavorDimensions "tier","minApi"
   productFlavors{
     fees{
        dimension"tier"
        ...
     }
     minApi23{
       dimension"minApi"
        ...
     }
   }
}

如果不需要多版本控制只需添加:flavorDimensions "code"(随意定义)

android {
   ...
   defaultConfig {
       ...
      flavorDimensions "code"
   }
   ...
}
4. Gradle自定义apk名称报错(Cannot set the value of read-only property 'outputFile' )
  • E.G
    AS 3.0之前自定义apk名称:
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

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.

  • Solution
    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 参数文件。

5. AS 3.0后关键字依赖变化
  • E.G
    AS 3.0之前依赖关键字: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重新编译。关于implementationapi的区别,请移驾:AS Gradle依赖项配置

6. AAPT2编译报错
  • Error

Error: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details

  • Solution

在项目根目录下gradle.properties文件中关闭APPT2编译:

...
android.enableAapt2 = false
7. PNG 图片错误,AAPT err(Facade for):Unable to open PNG file
  • Error

AAPT err(Facade for):……Unable to open PNG file

  • Solution
    项目app下build.gradle文件中添加下面属性:
android{
    ...
    aaptOptions{
        cruncherEnabled = false
        useNewCruncher = false
    }
    ...
}

用来关闭AS图片PNG合法性检查的,直接不让它检查。

  • Note
    如果还是有错误,请检查:

1 ) .9.png图片放在res/drawable文件夹下
2 ) .9.png图片四边都要有黑线,确保图片是标准的.9.png图片

8. 输入法中文状态下无法选词
  • Question
    AS 3.0后在输入中文时候会出现键盘不显示,无法筛选词输入中文
  • Solution
    首先要说不是你的输入法问题,而是AS 3.0后的一个BUG,下面提供几种解决方案:

1 ) 如果你还在2.3.x的环境下开发,为了避免输入法问题,建议你暂时不要升级到3.x
2 ) 如果你想2.3.x升级使用3.x,那么不建议你使用2.xjre替换3.xjre方式去处理输入法问题,虽然暂时可以解决输入问题,但是后面升级的时候你还得把2.xjre换回3.xjre,否则升级后将无法正常使用AS;
3 ) 最简单最有效的解决办法就是在使用 AS的时候,切换到 windows自带的中文输入法就可以正常输入中文筛选词语了,相对而言,这样方便很多。虽然没有第三方输入法用起来那么顺手,但是可以有效解决输入法问题和避免以后升级的问题;
4 ) 终极方案:升级到 AS 3.1.1即可解决,AS 3.1.1已经修复了输入法中文状态下无法选词的BUG。

9. 移除无用资源问题
  • Error

Error: Removing unused resources requires unused code shrinking to be turned on.

  • Solution
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,才能通过资源压缩器将它们移除,否则编译会报错。

10. 软件升级安装冲突
  • 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所遇到的问题,可能每个人情况不一样,遇到的问题也不尽相同。希望有类似经历和问题的小伙伴,可以帮助你们少走一些弯路。

初次写,如有不对和欠妥当地方,请大家帮忙指正,有疑问和补充的小伙伴请留言告知,万分感谢!文章会持续更新。

相关文章

网友评论

  • Jay_Lwp:弄主nb
  • 七岁就狠拽:666, 先驱啊
    翻译不了的声响:@七岁就狠拽 没有没有,大家一起学习。
  • 爱吃鱼的外星人:求助楼主,AS升级到3.1后我在library中引入的包,然后在app中导包无效了
    在app中 我是这样导入library的(framework是本地library)
    //基础框架
    implementation project(':framework')
    实在找不到原因,搜索也搜索不到
    翻译不了的声响:@爱吃鱼的外星人 你的问题一般在引用本地库时候会出现,如果本地依赖库发生变化可会出现你的问题。implementation project:仅当依赖库发生变化时,重新编译本module;api project:需要重新编译本module以及所有使用本module的module。一般默认依赖方式是implementation编译速度快,发生错误时改用 api全部重新编译,编译速度慢。
  • 8d11ba48e141:mark~~ 谢谢
    翻译不了的声响:@阿铭丶 不客气
  • d1ab37ab96f8:楼主这个问题有遇到过? Error:Execution failed for task ':app:packageC360Release'.
    > Failed to read zip file 'E:\MyNewObject\Money\app\C360\release\jinrong2.1.4_release.apk'.
    d1ab37ab96f8:@疾跑赶地铁 升级了
    翻译不了的声响:@fanwuye 之前能运行吗,还是升级更改gradle了
  • 松小白:你好楼主,这个问题已经好长时间了,一直没有管,打包的时候就报错。
    我用的是 gradle assembleRelease 命令
    * What went wrong:
    Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
    > Job failed, see logs for details
    然后,使用 gradle build 命令 也是一样,我发现应该是混淆问题,但是不知道如何改.
    翻译不了的声响:@松小白 说明你打包签名出问题了,程序里面有没有收集BUG功能(异常收集类或者集成友盟),看看日志是什么问题。一般可能是混淆配置问题(缺少或重复),还有gradle配置问题
    松小白:@疾跑赶地铁 我现在出现了个问题,运行测试都没问题
    打完包,启动就崩溃,我觉的还是混淆的问题。混淆的规则第三方包和基本的都混淆了,都是在网上找的混淆配置;
    翻译不了的声响:混淆文件加入相应的混淆规则了吗?
  • 正规程序员:多渠道打签名包方案有吗
    翻译不了的声响:@goooed 看我另外一片博客(https://www.jianshu.com/p/14d3d3d9803d)
  • helloworld1988:老哥,感觉gradle好刺眼,感觉还要注意啊
    翻译不了的声响:@helloworld1988 😂👌
  • 白天不睡觉:ε=(´ο`*)))唉,我也是高估了自己...直接把公司里自己用的AndroidStudio升级到3.0,结果错误是一个接一个的报,折腾了一下午没弄好,安全起见重新下载了2.3版本的...毕竟是公司项目。
  • 丨灬柳夢Oo:Error: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details

    始终解决不到
    翻译不了的声响:@丨灬柳夢Oo grade编译错误,找不到abc_textfield_search_default_mtrl_alpha.9.png这个文件,
    android{
    ...
    aaptOptions{
    cruncherEnabled = false
    useNewCruncher = false
    }
    }
    加上再试试看
    丨灬柳夢Oo:@挖掘匠 AAPT err(Facade for 1948427294): \\?\C:\Users\XXX\.gradle\caches\transforms-1\files-1.1\appcompat-v7-26.1.0.aar\120bd5fb36bdca4cbfe4c203502a2ee1\res\drawable-xxhdpi-v4\abc_textfield_search_default_mtrl_alpha.9.png ERROR: Unable to open PNG file 主要是报这个错 不知道啥子原因 实在解决不到了 gradle 版本换回 2.14.1 插件版本换回2.2.2 就没问题
    翻译不了的声响:是报新的错,还是仍是这个错。看看代码位置加的对不对
  • 程洛_1114:自定义输出apk名字那个,修改完之后还是Error:(70, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=huaweiDebug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
    翻译不了的声响:@啷个哩格啷 你有一头一尾2个地方错误,下面给你修改备注了:
    applicationVariants.all { variant ->
    variant.outputs.all{ output ->(each改为all)
    def outputFile = output.outputFile
    def fileName
    if (outputFile != null && outputFile.name.endsWith('.apk')) {
    if (variant.buildType.name.equals('release')) {
    fileName=
    "cs_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}_release.apk";
    } else {
    fileName = "cs_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}_debug.apk";
    }
    // output.outputFile = new File(outputFile.parent, fileName)
    outputFileName outputFile = fileName(输出属性是outputFileName ,不是你声明的outputFile对象)
    }
    }
    }
    再去试试看
    程洛_1114:@挖掘匠
    applicationVariants.all { variant ->
    variant.outputs.each { output ->
    def outputFile = output.outputFile
    def fileName
    if (outputFile != null && outputFile.name.endsWith('.apk')) {
    if (variant.buildType.name.equals('release')) {
    fileName = "cs_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}_release.apk";
    } else {
    fileName = "cs_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}_debug.apk";
    }
    // output.outputFile = new File(outputFile.parent, fileName)
    outputFile = fileName
    }
    }
    }
    翻译不了的声响: @啷个哩格啷 自定义apk名字你代码怎么写的,贴一下

本文标题:Android Studio 3.0正式版填坑之路

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