×

Android Studio 3.0正式版填坑之路

96
疾跑赶地铁
2017.10.31 16:05* 字数 1511
android studio 3.0启动图.png

序言


总看别人的文章,今天尝试着自己来写一篇。在逛论坛时候,无意间发现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.x所遇到的一些问题:

1. 把Gradle版本升到4.1或更高版本

grade/wrapper/gradle-wrapper.propertie文件中
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
改为:
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

2. Gradle版本与当前AS版本保持一致

项目根目录下的build.gradle文件中repositories里面添加google()

  • E.G
buildscript{
   dependencies {
      classpath'com.android.tools.build:gradle:3.0.1'
    }
   repositories{
     // You need to add the following repository to download the
     // new plugin.
        google()//新增
        ...
   }
}

项目app下build.gradle文件中

android {
   compileSdkVersion 26
   buildToolsVersion "26.0.2"
   ...
}

compilesdkversion最好升级到26或更高的版本,以免Gradle编译出错。

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)
    }
    //删除unaligned apk
    if (output.zipAlign != null) {
        output.zipAlign.doLast {
        output.zipAlign.inputFile.delete()
    }
}

AS 3.0之后,同样的代码自定义apk名称就会报错:

  • Error 1

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 
    }
    //删除unaligned apk
    if (output.zipAlign != null) {
        output.zipAlign.doLast {
        output.zipAlign.inputFile.delete()
    }
}

each修改为all,然后通过outputFileName修改生成apk的名称。但是重新编译随后又报新的错误(Could not get unknown property 'inputFile')

  • Error 2

Error:(86, 1) Execution failed for task ':app:packageC360Debug'.> Could not get unknown property 'inputFile' for task ':app:packageC360Debug' of type com.android.build.gradle.tasks.PackageApplication.

  • Solution
applicationVariants.all { variant ->
    ...
    //删除unaligned apk
    if (output.zipAlign != null) {
        output.zipAlign.doLast {
        //output.zipAlign.inputFile.delete() (报错)
    }
}

这里删除unaligned.apk方法output.zipAlign.inputFile.delete()报错,说是找不到inputFile属性,这就很尴尬。暂时没有找到替换方法,只能先注释掉这段让程序运行起来。此外,AS 3.0打包完除了apk包文件,还会多一个output.json参数文件

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

AS 3.0之后依赖关键字:implementation

dependencies {
    ...
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation files('libs/gson-2.3.1.jar')
    ...
}

AS 3.0后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自带的中文输入法就可以正常输入中文筛选词语了,相对而言,这样方便很多。虽然没有第三方输入法用起来那么顺手,但是可以有效解决输入法问题和避免以后升级的问题

9. 启用代码缩减(AS 3.0.1需要启用代码缩减,否则会报错)
  • 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'
    }
  }
  ...
}
参考

https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration.html

下载

Studiohttps://developer.android.google.cn/studio/archive.html
Gradlehttp://services.gradle.org/distributions

结语


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

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

Android
Web note ad 1