当前位置: 首页 > 编程笔记 >

详解Android Studio 3.0的新特性与适配

许高峻
2023-03-14
本文向大家介绍详解Android Studio 3.0的新特性与适配,包括了详解Android Studio 3.0的新特性与适配的使用技巧和注意事项,需要的朋友参考一下

简介

Android Studio升级到3.0后,有不少的改动和新特性,先贴出官方的迁移说明。

本文会持续收集与总结本人在使用Android Studio 3.0进行开发的过程中所遇到的问题。

版本配置

Gradle版本

  1. Android Studio 3.0需要的Gradle版本至少为4.1。
  2. 如果是使用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",可访问当前连接设备的文件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍详解MySQL8的新特性ROLE,包括了详解MySQL8的新特性ROLE的使用技巧和注意事项,需要的朋友参考一下 【MySQL的ROLE解决了什么问题】   假设你是一个职业素养良好的DBA比较同时又比较注重权限管理的话;可能遇到过这样的问题,数据库中有多个开发人员的账号;有一天要建   一个新的schema,如果你希望之前所有的账号都能操作这个schema下的表的话,在mysql-

  • 本文向大家介绍Android 7.0新特性详解,包括了Android 7.0新特性详解的使用技巧和注意事项,需要的朋友参考一下 谷歌正式在I/O大会现场详细介绍了有关Android 7.0的大量信息。目前,我们已经知道,新一代Android操作系统将支持无缝升级,能够通过Vulkan API来在中低硬件配置设备上实现流 畅.游戏体验以及更多的Emoji表情。不过,Android 7.0最大也是最引

  • 本文向大家介绍Kotlin 接口与 Java8 新特性接口详解,包括了Kotlin 接口与 Java8 新特性接口详解的使用技巧和注意事项,需要的朋友参考一下 前言 在看一本关于高性能编程的时候发现 Java8 中关于接口的新特性的介绍,这个特性是真的棒,解决了一个接口中有多个方法,但并不想实现该接口的类都去实现所有的方法,简单的说就是在类需要的情况再去重写接口。所以有了以下的特性出现。 接口增强

  • 本文向大家介绍JavaScript_ECMA5数组新特性详解,包括了JavaScript_ECMA5数组新特性详解的使用技巧和注意事项,需要的朋友参考一下 var arr = [ 1, 2, 3, 4, 5, 4, 3, 2, 1 ]; 新加位置的方法: indexOf lastIndexOf 1.1个参数的时候表示传值 返回索引位置(index从0开始) var index = arr.inde

  • 本文向大家介绍Java8新特性Stream流实例详解,包括了Java8新特性Stream流实例详解的使用技巧和注意事项,需要的朋友参考一下 什么是Stream流? Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。 Stream的优点:声明性,可复合,可并行。这三个特性使得stream操作更简洁,更灵活,更高效。 Stream的操作有两个特点:可以多个操作链接起来运行,内部

  • 本文向大家介绍PHP新特性详解之命名空间、性状与生成器,包括了PHP新特性详解之命名空间、性状与生成器的使用技巧和注意事项,需要的朋友参考一下 本文主要跟大家介绍了关于PHP新特性之命名空间、性状与生成器的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 1.命名空间 命名空间是什么?      1).命名空间在PHP 5.3中被引入,类似于文件夹的功能。例如Symfony框架中的Re