当前位置:   article > 正文

Android Studio 3.0~3.x正式版填坑之路_androidx.appcompat:appcompat:1.0.0

androidx.appcompat:appcompat:1.0.0

正文


AS升级到 Android Studio 3.x(Stable 3.0.0 ~ 3.4.0)之后,会遇到一些版本升级变更的问题。

下表列出了 AS Gradle版本对应所需的 Gradle插件版本。为了获得最佳的性能,尽可能使用最新版本的Gradle和插件。

Gradle插件版本Gradle版本
1.0.0 - 1.1.32.2.1 - 2.3
1.2.0 - 1.3.12.2.1 - 2.9
1.5.02.2.1 - 2.13
2.0.0 - 2.1.22.10 - 2.13
2.1.3 - 2.2.32.14.1+
2.3.0+3.3+
3.0.0+4.1+
3.1.0+4.4+
3.2.0 - 3.2.14.6+
3.3.0 - 3.3.24.10.1+
3.4.0+5.1.1+
......

1. Gradle版本不匹配

修改项目下 gradle/wrapper/gradle-wrapper.propertie 文件中的distributionUrl地址:

  1. AS 3.0.0 ~ 3.0.1改为:
  2. distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
  3. AS 3.1.1 ~ 3.1.4 改为:
  4. distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
  5. AS 3.2.0 ~ 3.2.1 改为:
  6. distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
  7. AS 3.3.0 ~ 3.3.2 改为:
  8. distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
  9. AS 3.4.0 ~ 3.4.x 改为:
  10. distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

2. Gradle插件不匹配

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

  • E.G
  1. buildscript{
  2. repositories {
  3. google() //新增
  4. }
  5. dependencies {
  6. classpath'com.android.tools.build:gradle:3.0'//AS版本一致
  7. //classpath'com.android.tools.build:gradle:3.4.0'
  8. }
  9. }
  10. allprojects {
  11. repositories{
  12. google() //新增
  13. }
  14. }

2)项目 appbuild.gradle 文件中,修改相关支持库版本;
AS 3.0 ~ 3.0.1:SDK Build Tools 26.0.2 or higher.

  1. android {
  2. compileSdkVersion 26
  3. buildToolsVersion "26.0.2"
  4. ...
  5. }
  6. dependencies {
  7. implementation fileTree(dir: 'libs', include: ['*.jar'])
  8. implementation 'com.android.support:appcompat-v7:26.1.0'
  9. implementation 'com.android.support:design:26.1.0'
  10. testImplementation 'junit:junit:4.12'
  11. ...
  12. }

AS 3.1.1 ~ 3.1.4:SDK Build Tools 27.0.3 or higher.

  1. android {
  2. compileSdkVersion 27
  3. buildToolsVersion "27.0.3"
  4. ...
  5. }
  6. dependencies {
  7. implementation fileTree(dir: 'libs', include: ['*.jar'])
  8. implementation 'com.android.support:appcompat-v7:27.1.1'
  9. implementation 'com.android.support:design:27.1.1'
  10. testImplementation 'junit:junit:4.12'
  11. ...
  12. }

AS 3.2 ~ 3.4.x:SDK Build Tools 28.0.3 or higher.

  1. android {
  2. compileSdkVersion 28
  3. buildToolsVersion "28.0.3"
  4. ...
  5. }
  6. dependencies {
  7. implementation fileTree(dir: 'libs', include: ['*.jar'])
  8. implementation 'com.android.support:appcompat-v7:28.0.0'
  9. implementation 'com.android.support:design:28.0.0'
  10. testImplementation 'junit:junit:4.12'
  11. ...
  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属性,用来控制多个版本的代码和资源,缺失就会报错。在项目 appbuild.gradle文件中,添加flavorDimensions
  1. android {
  2. ...
  3. flavorDimensions "tier","minApi"
  4. productFlavors{
  5. fees{
  6. dimension"tier"
  7. ...
  8. }
  9. minApi23{
  10. dimension"minApi"
  11. ...
  12. }
  13. }
  14. }

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

  1. android {
  2. ...
  3. defaultConfig {
  4. ...
  5. flavorDimensions "code"
  6. }
  7. ...
  8. }

4. Gradle自定义apk名称报错

  • E.G
    AS 3.0之前自定义apk名称:
  1. applicationVariants.all { variant ->
  2. variant.outputs.each { output ->
  3. def fileName = "${variant.versionName}_release.apk"
  4. def outFile = output.outputFile
  5. if (outFile != null && outFile.name.endsWith('.apk')) {
  6. output.outputFile =newFile(outFile.parent, fileName)
  7. }
  8. }

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变为只读,不能修改输出的名称所以报错。修改为:
  1. applicationVariants.all { variant ->
  2. variant.outputs.all { output -> // each 改为 all
  3. def fileName = "${variant.versionName}_release.apk"
  4. def outFile = output.outputFile
  5. if (outFile != null && outFile.name.endsWith('.apk')) {
  6. outputFileName = fileName // output.outputFile 改为 outputFileName
  7. }
  8. }

each修改为all,然后通过outputFileName修改生成apk的名称。此外,AS 3.0后打包完,除了apk包文件,还会多一个 output.json 参数文件。更多自定义打包请移驾 Android Studio自定义多渠道打包

5. AS 3.0后关键字依赖变化

  • E.G
    AS 3.0之前依赖关键字:compile
  1. dependencies {
  2. compile fileTree(include: ['*.jar'], dir: 'libs')
  3. compile 'com.android.support:appcompat-v7:26.1.0'
  4. compile files('libs/gson-2.3.1.jar')
  5. compile project(':mylibrary')
  6. ...
  7. }

AS 3.0之后依赖关键字:implementation

  1. dependencies {
  2. implementation fileTree(include: ['*.jar'], dir: 'libs')
  3. implementation 'com.android.support:appcompat-v7:26.1.0'
  4. implementation files('libs/gson-2.3.1.jar')
  5. implementation project(':mylibrary')
  6. ...
  7. }

AS 3.0后Gradle关键字依赖发生变化:
compile(implementation/api),provided(compileOnly),apk(runtimeOnly)

AS 3.0后,在使用新依赖配置项时,引用本地库使用implementation指令时,若出现找不到导包或资源问题报错,可以更换依赖指令为api重新编译。关于implementationapi的区别,请移驾 Android Studio Gradle依赖项配置

6. AAPT2编译报错

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

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

  1. ...
  2. 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
    项目 appbuild.gradle文件中添加下面属性:
  1. android{
  2. ...
  3. aaptOptions{
  4. cruncherEnabled = false
  5. useNewCruncher = false
  6. }
  7. ...
  8. }

用来关闭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
  1. android {
  2. ...
  3. buildTypes {
  4. debug {
  5. signingConfig signingConfigs.release
  6. debuggable true
  7. zipAlignEnabled true
  8. minifyEnabled true //是否混淆
  9. shrinkResources true //是否去除无效的资源文件
  10. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  11. }
  12. release {
  13. signingConfig signingConfigs.release
  14. zipAlignEnabled true
  15. debuggable true
  16. minifyEnabled true //是否混淆
  17. shrinkResources true //是否去除无效的资源文件
  18. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  19. }
  20. }
  21. ...
  22. }

AS 3.0.1后,如果使用shrinkResources来移除未引用资源,必须要先开启混淆minifyEnabled,才能通过资源压缩器将它们移除,否则编译会报错。

10. 软件升级安装冲突

  • Error
    AS在线升级后,安装重启软件时会出现部分文件安装冲突。如下图所示:

    更新问题图

     

  • Solution
    No.1:
    1)找到 AS 安装目录下的 uninstall.exe 卸载文件,运行卸载当前旧版本AS(卸载前记得备份代码和配置文件);
    2)下载最新版本的AS安装包,运行安装并导入配置文件和项目。
    No.2:
    1)点击 Cancel 取消安装并关闭AS;
    2)找到 AS 安装目录下的 studio64.exe 启动文件,右键 —— 以管理员身份运行 打开AS(提高AS的权限);
    3)点击 Help —— Checkout for Updates —— Update and Restart 重新更新下载安装。

11. AS 3.2注意事项

AS升级到 3.2 时应该注意:
1)compileSdkVersion 版本升级到28及以上;
2)buildToolsVersion 版本改为28.0.3及以上;
3)Gradle 插件版本改为4.6及以上;
4)新的 Android扩展库(AndroidX)取代旧 Android支持库,新的命名空间为 androidx.*,包括所有的支持库和架构组件。

依赖库对比:

  1. //旧依赖库
  2. implementation 'com.android.support:appcompat-v7:28.0.0'
  3. //新依赖库
  4. implementation 'androidx.appcompat:appcompat:1.0.0'

AndroidX迁移方法,请移驾 Android AndroidX的迁移

AndroidX 目前仍被认为是处于 Alpha 阶段,有些变更会破坏兼容性。此外,还有一些已知的问题,所以暂时不建议在生产项目中使用。

12. AS 3.3.0警告问题

在 AS升级到 3.3.0,Gradle升级到 4.10.1+ 时,编译会一直提示警告。

  • Warn
  1. WARNING: API 'variantOutput.getPackageApplication()' is obsolete and has been replaced with 'variant.getPackageApplicationProvider()'.
  2. It will be removed at the end of 2019.
  3. For more information, see https://d.android.com/r/tools/task-configuration-avoidance.
  4. To determine what is calling variantOutput.getPackageApplication(), use -Pandroid.debug.obsoleteApi=true on the command line to display a stack trace.
  5. Affected Modules: app

警告信息说 APIvariantoutput.getPackageApplication()已过时,并且已被替换为variant.getPackageApplicationProvider(),将于2019年底移除。尽管如此,我们还是不知道具体哪个地方的方法过时了,根据后面提示在gradle.properties中配置android.debug.obsoleteApi=true来查看详细的调试信息:

  1. WARNING: API 'variantOutput.getPackageApplication()' is obsolete and has been replaced with 'variant.getPackageApplicationProvider()'.
  2. It will be removed at the end of 2019.
  3. For more information, see https://d.android.com/r/tools/task-configuration-avoidance.
  4. REASON: Called from: E:\MyApp\app\build.gradle:67
  5. WARNING: Debugging obsolete API calls can take time during configuration. It's recommended to not keep it on at all times.
  6. Affected Modules: app

虽然乍看和之前的日志差不多,但是这次却明确告诉我们过时方法的具体位置:E:\MyApp\app\build.gradle:67。我的build.gradle:67是自定义apk输入方法def outFile = output.outputFileoutput.outputFile内部调用的是getPackageApplication()这里引用了过时方法。

  • Solution
    No.1:回退 Gradle版本
    1)修改项目根目录下build.gradle文件中 gradle插件版本:
  1. repositories {
  2. google()
  3. }
  4. dependencies {
  5. classpath'com.android.tools.build:gradle:3.2.1' //回退到3.3.0以下
  6. }
  7. ...
  8. }

2)修改项目下gradle/wrapper/gradle-wrapper.propertie文件中的distributionUrl

distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip //回退到4.10.1以下

No.2:删除文件类型判断
AS 3.0 ~ 3.2.1:

  1. applicationVariants.all { variant ->
  2. variant.outputs.all { output ->
  3. def fileName = "${variant.versionName}_release.apk"
  4. def outFile = output.outputFile
  5. if (outFile != null && outFile.name.endsWith('.apk')) {
  6. outputFileName = fileName
  7. }
  8. }

AS 3.3.0 ~ 3.3.2:

  1. applicationVariants.all { variant ->
  2. variant.outputs.all { output ->
  3. outputFileName = "${variant.versionName}_release.apk"
  4. }

 

结语


上述就是AS 2.x升级AS 3.x所遇到的问题,可能每个人情况不一样,遇到的问题也不尽相同。希望有类似经历和问题的小伙伴,可以帮助你们少走一些弯路。

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

========== 相关推荐 ==========

Android Studio的一些实用配置


Android Studio中Gradle基本配置详解


Android Studio添加依赖方式


Android Studio中Gradle依赖项配置


Android Studio自定义多渠道打包


Android Studio常见问题解决方案


Android AndroidX的迁移


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/285261
推荐阅读
相关标签
  

闽ICP备14008679号