Android studio升级3.0.1遇到的坑及Android Studio 3.0 新功能解析和旧项目适配

近日将Android studio升级到3.0.1,Gradle升级到了4.1,升级好之后发现遇到了不少问题,具体如下:

一、APK打包批量修改APK名称导出功能报错

Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated

output.outputFile变成了只读属性,不能再往里面写东西了,以下是3.0之前的配置:

applicationVariants.all { variant ->    //批量修改Apk名字
    variant.outputs.each { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.apk') && 'release'.equals(variant.buildType.name)) {
         
def fileName = "release_v${defaultConfig.versionName}_${realTime()}.apk"
output.outputFile = new File(releaseFile.parent, fileName)
        }
    }
}

现在不能为修改赋值了,

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def releaseFile = output.outputFile;
        if (releaseFile.name.endsWith('release.apk')) {
             //获取签名的名字 variant.signingConfig.name
            /*def fileName = "release_v${defaultConfig.versionName}_${realTime()}.apk"
            output.outputFile = new File(releaseFile.parent, fileName)*/
            outputFileName = "release_v${defaultConfig.versionName}_${realTime()}.apk"

        }
    }
}

二、Android Studio 3.0 butterknife:7.0.1配置的问题

Error:Execution failed for task ‘:app:javaPreCompileDebug'.
 
Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor. Please add them to the annotationProcessor configuration.
- butterknife-7.0.1.jar (com.jakewharton:butterknife:7.0.1)
Alternatively, set android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true to continue with previous behavior. Note that this option is deprecated and will be removed in the future.
Seehttps://developer.android.com/r/tools/annotation-processor-error-message.html for more details.
解决办法:
在项目的project 的build.gredle 文件中的dependencies标签下删除。classpath 'com.neenbedankt.gradle.plugins:android- apt:1.8';
在module的build.gredle 文件中删除apply plugin: 'android-apt';在module的build.gredle 文件中的dependencies标签中删除apt 'com.jakewharton:butterknife-compiler:8.4.0',加上 annotationProcessor ‘com.jakewharton:butterknife:7.0.1'即可解决。

三、、、、



Android Studio 3.0 新功能解析和旧项目适配
Android Studio升级后可能会遇到一些问题,需要对旧的工程做一些配置上的调整而已。下面文章就来介绍新版开发工具给我们带来哪些实用的改变,并以实际操作经验告诉大家,旧工程的配置需要如何做兼容修改。

3.0 带来的改变

Kotlin Support

在 Android Studio 3.0 之前,使用 Kotlin 语言开发安卓应用,需要额外配置 Kotlin 插件。而新版本内置默认支持 Kotlin 语言,来减少我们在配置上的工作。

选择工具栏 Code ——》 Convert Java File To Kotlin File,或者使用快捷键的形式,你可以一键实现 Java 文件到 Kotlin 文件的转换。

Android studio升级3.0.1遇到的坑及Android Studio 3.0 新功能解析和旧项目适配_第1张图片

备注:关于快捷键的使用,你可以使用 Command + Shift + A 这组快捷键打开 Find Action 窗口,输入关键字寻找对应功能及其快捷键,效果就像上面 Gif 图展示的这样。

Java 8 Support

3.0 对 Java 8 语言特性的默认支持使你不用在 build.gradle 配置文件中添加 jackOptions 一项。如果你有使用到的话,记得删除:

android {
    ...
    defaultConfig {
        ...
        // Remove this block.
        jackOptions {
            enabled true
            ...
        }
    }
}

选择工具栏 File ——》Project Structure,修改 Source Compatibility 和 Target Compatibility 选项到 1.8 即可使我们的项目支持 Java 8 语言特性。

Android studio升级3.0.1遇到的坑及Android Studio 3.0 新功能解析和旧项目适配_第2张图片

Android Profiler

过去我们使用的 Android Monitor 工具从 3.0 版本开始被 Android Profiler 替代掉了。如图,run 按钮一栏多了一个 Android Profiler 按钮:

Android studio升级3.0.1遇到的坑及Android Studio 3.0 新功能解析和旧项目适配_第3张图片

Android Profiler 提供有 CPU、Memory 和 Network 三大调试分析利器,实时跟踪 Apk 的运行状态,可以帮助我们可视化地做一些性能调优工作。

这三个工具在开发阶段非常实用,比如 CPU Profiler 能够分析应用中的线程使用情况,Memory Profiler 能够检测出内存泄漏,Network Profiler 能够拦截网络请求实现抓包功能等。这里列举一些使用图片,简单预览一下这三大工具的风采:

Android studio升级3.0.1遇到的坑及Android Studio 3.0 新功能解析和旧项目适配_第4张图片

Android studio升级3.0.1遇到的坑及Android Studio 3.0 新功能解析和旧项目适配_第5张图片

Android studio升级3.0.1遇到的坑及Android Studio 3.0 新功能解析和旧项目适配_第6张图片

有关这几个工具的详细使用细节,可以参考官方的介绍:

  • CPU Profiler guide

  • Memory Profiler guide

  • Network Profiler guide

Device File Explorer

这个功能厉害了。新版开发工具带来的资源管理器允许我们访问连接设备的文件系统,实现 PC 端到手机或模拟器端的便捷文件传输。有了这个工具,从此就可以告别之前使用的「文件传输助手」等第三方工具啦。

Android studio升级3.0.1遇到的坑及Android Studio 3.0 新功能解析和旧项目适配_第7张图片

Adaptive Icons wizard

选择 File -> New -> Image Asset,利用 Android Studio 提供的工具创建图片资源一直以来也是开发利器之一。现在,这个工具开始支持vector drawables 格式,并且能够创建用于适配 Android 8.0 系统上各种形状的桌面图标。

Android studio升级3.0.1遇到的坑及Android Studio 3.0 新功能解析和旧项目适配_第8张图片

URL intent-filter validator

这个功能也蛮贴心的。Manifest 清单文件开始支持一个特殊的标签,用于测试给定的 Url 字符串是否符合 intent-filter 标签内容所定义的规则。举个例子:

Android studio升级3.0.1遇到的坑及Android Studio 3.0 新功能解析和旧项目适配_第9张图片

如图,这里使用 data 标签定义一个 Url 规则,并使用 tools:validation 标签验证一个错误的测试 Url 地址,检测器能够自动识别并给出错误提示。这个例子很简单,肉眼一眼就能看出错误。那如果是比较复杂的规则呢,可能就不那么容易看得出来。这个时候,这个工具就可以派上用场啦。

APK Analyzer

3.0 版本对 APK Analyzer 的功能做了进一步强化。主要在于:对于使用 ProGuard 混淆过的 APK 文件,我们能够上传 mapping.txt 文件进行代码还原;Dex 文件提供显示各个包目录的大小;等等。

Android studio升级3.0.1遇到的坑及Android Studio 3.0 新功能解析和旧项目适配_第10张图片

其他功能

除了上面介绍的这些变化,还有一些其他大大小小的变更。比如 Layout Inspector 和 Layout Editor 工具在 UI 上有所调整,比如 App Links Assistant 和 Firebase App Indexing Assistant 的强化使用,这些留着大家自己去探索发现吧。也可以访问 Android Studio Release Notes 官网,了解 3.0 版本的更多发布细节。

旧项目的适配

Android Studio 3.0 发布的同时,Android Plugin for Gradle 3.0.0 也同时发布。编译速度整体都得到了大幅提升。升级完 Android Studio 之后,旧的工程需要做出部分改变,才能通过 Gradle 的编译。这里根据我的一个实际项目,介绍一下需要改变的内容。当然,也许你的项目用不上这些,也可能不止这些。

distributionUrl

Plugin 3.0.0+ 需要配置 Gradle 的最小版本是 4.1,我们可以通过 File -> Project Structure -> Project 的方式设置 Android Plugin 的版本,或者修改 gradle.properties 文件的内容,添加 distributionUrl 属性:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

Google's Maven repository

新版 Android Studio 工具默认使用 Google’s Maven Repository 用于下载依赖 Android Support Library,替代了 Android SDK Manager 的本地依赖方式。所以,需要在工程根目录下的 build.gradle 文件中添加 google() 一行代码:

allprojects {
    repositories {
        google()
    }
}

buildToolsVersion

Android Plugin For Gradle 3.0.0 默认自动添加插件所需要用到的最小版本的编译工具。所以,我们不需要再手动在 build.gradle 添加一行 buildToolsVersion 属性的代码。对于旧的项目,可以去掉这行配置,比如:

android {
    compileSdkVersion 26
    // remote buildToolsVersion
    buildToolsVersion "25.0.2"
    ...
}

each() 和 outputFile()

Plugin 3.0.0 版本移除了一些用于编译配置的 API,其中比较常见的就是 each() 和 outputFile(),两个常用于修改输出 Apk 文件名和路径的方法。

在之前的文章 Android Gradle 常用使用场景实现方式的总结 中有提到,自定义输出 APK 文件名可以这样做:

android {
    android.applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(output.outputFile.parent, rootProject.getName()
                    + "-" + buildType.name
                    + "-" + releaseTime()
                    + "-v" + defaultConfig.versionName
                    + "-" + defaultConfig.versionCode
                    + ".apk");
        }
    }
}

但是使用 Plugin 3.0.0 时就会出现编译报错,我们需要修改 each() 和 outputFile() 方法为 all() 和 outputFileName,比如:

android {
    android.applicationVariants.all { variant ->
        variant.outputs.all { 
            outputFileName = rootProject.getName()
                    + "-" + buildType.name
                    + "-" + releaseTime()
                    + "-v" + defaultConfig.versionName
                    + "-" + defaultConfig.versionCode
                    + ".apk";
        }
    }
}

对于旧的工程,基本上便是这些配置上的适配修改。如果你还遇到了别的问题,别紧张,按照编译错误提示一步步操作,也能成功通过编译。总体来说,这次 Android Studio 3.0 和 Plugin For Gradle 3.0.0 的发布还是非常值得升级尝试的。





你可能感兴趣的:(开发工具)