详解Android Studio 3.0的新特性与适配
作者:daking 发布时间:2023-04-29 05:15:05
简介
Android Studio升级到3.0后,有不少的改动和新特性,先贴出官方的迁移说明。
本文会持续收集与总结本人在使用Android Studio 3.0进行开发的过程中所遇到的问题。
版本配置
Gradle版本
Android Studio 3.0需要的Gradle版本至少为4.1。
如果是使用gradle wrapper,则工程根目录/gradle/wrapper/gradle-wrapper.properties中的distributionUrl字段为https\://services.gradle.org/distributions/gradle-4.1-all.zip。
Android Gradle插件版本
Android Studio 3.0需要Android Gradle插件版本为3.0.0。
Android Studio 3.0默认使用Google's Maven Repository来下载Android Support Library,所以在脚本中要使用google()来加入谷歌仓库。
工程根目录/build.gradle的相关配置如下。
buildscript {
repositories {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
}
}
使用annotationProcessor
从Android Studio 3.0开始,使用annotationProcessor代替apt。不可再使用apt,否则会编译报错。
Error:android-apt plugin is incompatible with the Android Gradle plugin. Please use 'annotationProcessor' configuration instead.
比如在Android Studio 3.0之前在application模块导入ButterKnife 8.4.0的gradle配置如下。
buildscript {
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
compile 'com.jakewharton:butterknife:8.4.0'
apt 'com.jakewharton:butterknife-compiler:8.4.0'
}
而在Android Studio 3.0中,使用annotationProcessor代替apt,不用再导入android-apt插件。
dependencies {
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}
修改apk名称
常用的修改输出的apk文件的名称的脚本如下。
def apkBaseName() {
// 先查找project.ext.apkName变量,若无则使用项目名
if(project.hasProperty("apkName")) {
return project.apkName
} else {
return project.name
}
}
def buildTime() {
return new Date().format("yyyyMMdd")
}
def delUnderline(String str) {
def result = str.startsWith("_") ? str.substring(1) : str
return result.endsWith("_") ? result.substring(0, result.length() - 1) : result
}
android.applicationVariants.all { variant -> // ApplicationVariant
variant.outputs.each { output -> // BaseVariantOutput
def file = output.outputFile
if(file != null && file.name.endsWith(".apk")) {
def flavorName = delUnderline(variant.flavorName)
def buildTypeName = delUnderline(variant.buildType.name)
def apkFile = new File(file.parent, "${apkBaseName()}_" +
"${buildTypeName.empty ? "" : buildTypeName + "_"}" +
"${flavorName.empty ? "" : flavorName + "_"}" +
"v${variant.versionName}_" +
"${buildTime()}.apk")
output.outputFile = apkFile
}
}
}
在Android Studio 3.0中执行此脚本会报错如下,原因是ApkVariantOutputImpl的outputFile属性改为只读。
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属性,而是设置outputFileName。同时把each()改为all()。
android.applicationVariants.all { variant -> // ApplicationVariant
variant.outputs.all {
if (outputFileName.endsWith(".apk")) {
def flavorName = delUnderline(variant.flavorName)
def buildTypeName = delUnderline(variant.buildType.name)
outputFileName = "fileName"
}
}
}
AAPT2
为了改进增量资源处理,Android Gradle插件3.0默认开启AAPT2。
在旧项目中开启AAPT2,有时候会报错,如:
Error: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
可在gradle.properties中加入以下配置来禁用AAPT2。
android.enableAapt2=false
新的依赖配置
Gradle 3.4推出了新的Java Library Plugin配置,而Android Gradle插件3.0是使用Gradle 4.1的,因此,需要注意更改为新的依赖配置。
旧的依赖配置,如compile project(':base-library'),会导致如下错误。应该修改为implementation project(':base-library')。
Error:Cannot choose between the following configurations of project :base-library:
- debugApiElements
- debugRuntimeElements
- releaseApiElements
- releaseRuntimeElements
flavor
从Android Gradle插件3.0开始,如果build.gradle中有自定义的productFlavors配置,需要添加自定义的flavorDimensions(风味维度),否则会编译报错。
Error:All flavors must now belong to a named flavor dimension.
The flavor 'flavor_name' is not assigned to a flavor dimension.
解决方法是:先定义一个flavorDimensions,之后在每个flavor中指定为这个dimension。
android {
flavorDimensions 'core'
productFlavors {
beta {
dimension 'core'
}
production {
dimension 'core'
}
}
}
在设置flavorDimensions之前,最终的Build Variant = Product Flavor + Build Type。而设置之后,最终的Build Variant = 维度1 + 维度2 + ... + 维度n + Build Type。
Kotlin支持
在Android Studio 3.0之前,使用Kotlin需要进行额外的配置。而Android Studio 3.0开始,默认内置支持Kotlin,无需额外配置。
使用Android Studio工具栏中的Code -> Convert Java File To Kotlin File,可将.java文件转为.kt文件。
Java8支持
从Android Studio 2.1起,官方通过Jack来支持Java8,从而开发者能使用Lambda等特性。
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
jackOptions {
enabled true
}
}
}
可在Android Studio工具栏,File -> Project Structure,修改Source Compatibility和Target Compatibility为1.8。
Project Structure
从Android Studio 3.0起,默认支持Java8,无需额外进行JackOptions配置。
Android Profiler
从Android Studio 3.0起,新增Android Profiler来代替旧的Android Monitor工具。
Android Profiler提供了CPU、Memory和network等三个调试分析工具。
Android Profiler
Android Profiler的详细使用方法参考官方文档。
CPU Profiler
Memory Profiler
Network Profiler
Device File Explorer
在Android Studio 3.0主界面的右下角,点开"Device File Explorer",可访问当前连接设备的文件。
来源:http://www.jianshu.com/p/a0d040615c2c


猜你喜欢
- 昨天实现一个功能,根据文章的id或者别名查找文章。起初采用mybatis的Example进行查询,对参数artName进行判断,如果是纯数字
- 前几天在看一个cameraCTSbug时,结果在一个java for循环上有点蒙。正好赶上这个点总结一下。java中的控制结构:条件结构这里
- 递归三要素:1、明确递归终止条件;2、给出递归终止时的处理办法;3、提取重复的逻辑,缩小问题规模。1、1+2+3+…+nimport jav
- import java.util.ArrayList;import java.util.Collections;import java.ut
- 在Mybatis的动态SQL和${}形式的参数中都用到了OGNL表达式。Mybatis常用的OGNL表达式如下1、e1 or e2:或<
- 一. switch分支结构1. 简介switch结合case,能够判断一个变量或表达式与一系列值中的某个值是否相等,这里的每个值都被称为一个
- 上一章说明了DataBinding生存的类之间关系,现在这里来看看布局是如何加载的以及view是如何映射的。一、布局加载这里把之前的代码重新
- 最近开发过程中遇到了一个问题,之前没有太注意,这里记录一下。我用的SpringBoot版本是2.0.5,在跟前端联调的时候,有个请求因为用户
- ListView显示大量相同格式数据常用属性:listSelector listView每项在选中、按下等不同状态时的Drawablediv
- 1. 准备工作需要提前安装好Elasticsearch,访问地址:http://127.0.0.1:9200/ 得到以下结果,得到clust
- 本文实例讲述了C#在运行时动态创建类型的实现方法。是C#项目开发中很实用的技巧。分享给大家供大家参考。具体分析如下:具体来说,C# 在运行时
- 1、servlet层package com.ycz.controller;import com.alibaba.fastjson.JSON;
- 01、多线程下扩容会死循环众所周知,HashMap 是通过拉链法来解决哈希冲突的,也就是当哈希冲突时,会将相同哈希值的键值对通过链表的形式存
- 由于公司平台访问人数逐渐增多,公司项目的数据库已经几次出现宕机现象。为减轻数据库压力,我上个月对公司项目做了下调整。把新闻板块提取出来单独一
- 问题怎么配置springBoot 内置tomcat,才能使得自己的服务效率更高呢?基础配置Spring Boot 能支持的最大并发量主要看其
- 最近碰到这个问题,在使用spring提供的JpaTemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低。由于开始时使用J
- 1. 使用ApplicationEventPublisher 发布事件复制下面全部代码,右键包名,粘贴即可生成java类,执行即可看到效果。
- 在Android开发中,有时我们需要对一个对象的集合按照某一个字段进行排序,Beanpublic class Student { priva
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- 本文实例讲述了Android编程实现动态支持多语言的方法。分享给大家供大家参考,具体如下:资源文件values/strings.xml中添加