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

 更新时间:2017年11月03日 14:24:04   作者:daking  
这篇文章主要介绍了详解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",可访问当前连接设备的文件。

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

相关文章

  • Fragment通过FragmentManager实现通信功能详细讲解

    Fragment通过FragmentManager实现通信功能详细讲解

    这篇文章主要介绍了Fragment通过FragmentManager实现通信功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • Android给通知channel静音的方法实例

    Android给通知channel静音的方法实例

    这篇文章主要给大家介绍了关于Android如何给通知channel静音的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Android项目实战教程之高仿网易云音乐启动页实例代码

    Android项目实战教程之高仿网易云音乐启动页实例代码

    这篇文章主要给大家介绍了关于Android项目实战教程之高仿网易云音乐启动页的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • Android中AsyncTask异步任务使用详细实例(一)

    Android中AsyncTask异步任务使用详细实例(一)

    AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程,通过本文给大家介绍Android中AsyncTask异步任务使用详细实例(一),需要的朋友参考下
    2016-02-02
  • Android指纹识别API讲解,一种更快更好的用户体验

    Android指纹识别API讲解,一种更快更好的用户体验

    今天小编就为大家分享一篇关于Android指纹识别API讲解,一种更快更好的用户体验,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Android中Property模块的键值设置

    Android中Property模块的键值设置

    这篇文章主要介绍了Android中Property模块的键值设置的相关资料,需要的朋友可以参考下
    2017-03-03
  • Android调用手机摄像头拍照和录音功能

    Android调用手机摄像头拍照和录音功能

    这篇文章主要为大家详细介绍了Android调用手机摄像头拍照和录音功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Android中二维码的扫描和生成(使用zxing库)

    Android中二维码的扫描和生成(使用zxing库)

    ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口,下面这篇文章主要给大家介绍了关于Android中二维码扫描和生成的相关资料,主要使用的zxing库,需要的朋友可以参考下
    2022-09-09
  • Android中Listview点击item不变颜色及设置listselector 无效的解决方案

    Android中Listview点击item不变颜色及设置listselector 无效的解决方案

    这篇文章主要介绍了Android中Listview点击item不变颜色及设置listselector 无效的原因及解决方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • Android学习笔记45之gson解析json

    Android学习笔记45之gson解析json

    JSON即JavaScript Object Natation,是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web开发提供了一种理想的数据交换格式。通过本篇文章给大家介绍Android学习笔记45之gson解析json的相关内容,对android gson解析json相关知识感兴趣的朋友一起学习吧
    2015-12-12

最新评论