Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Android Studio 预览版中的新功能

Android Studio 3.4 已发布稳定版。 在此处下载

Android Studio 3.5 目前已发布测试版。

Android Studio 3.6 目前已发布 Canary 版和开发版。

本页简要介绍了这些预览版本中的新功能和变化。

如需了解与各版本有关的最新资讯(包括每个版本中的重要修正的列表),请参阅版本更新

如果您在使用 Android Studio 预览版时遇到任何问题,请与我们联系。您的错误报告有助于我们改进 Android Studio。

Android Studio 3.5

本部分简要介绍了 Android Studio 3.5 中的新功能和变化。

Project Marble 更新

Project Marble 是一项 Android Studio 计划,旨在显著改善系统运行状况和功能完善程度,以及减少错误。为了实现这一目标,Android Studio 3.5 进行了多项改进,例如:

  • 降低了编辑器窗口中的界面延迟,并改进了使用数据绑定库时的智能编辑器功能
  • 通过增量注解处理提高了编译速度
  • 提高了使用 Android NDK 时的性能
  • 通过解决多处内存漏洞问题提高了 Lint 检查性能
  • 针对 Windows 添加了新的通知操作,以缓解因反病毒软件导致的编译速度减慢的问题
  • 显著降低了使用 Android 模拟器时的 CPU 占用率
  • 通过针对已删除的编译缓存进行相应调整,提高了 Gradle 同步的性能
  • 改善了更新体验,提供了更多信息和操作来帮助您更新 IDE 和 Android Gradle 插件
  • 借助布局编辑器提升了性能和用户体验

要详细了解 Project Marble 更新,请参阅 Android 开发者博文或以下几个部分的内容。

增量注解处理

在使用 Android Gradle 插件 3.5.0-beta01 及更高版本时,会有更多注解处理器支持增量 Java 编译,例如数据绑定。这项优化提高了增量编译的性能。要查看完整列表,请参阅增量注解处理器表格。

此外,KAPT 1.3.30 及更高版本也支持增量注解处理器,您可以通过在 gradle.properties 文件中添加以下代码来启用此支持:kapt.incremental.apt=true

内存管理设置

现在,如果您使用的是 64 位的操作系统并配有不少于 5 GB 的 RAM,则可以配置操作系统应该为 Android Studio 进程(例如核心 IDE、Gradle 守护进程和 Kotlin 守护进程)分配的最大 RAM 容量。您可以使用这些设置为每个进程提供最佳的内存容量,从而提升 Android Studio 的性能。

内存设置,可让您为 Android Studio 进程配置最大 RAM 容量。

图 1. Android Studio 中的内存设置。

要访问这些新设置,请依次选择 File > Settings(或者,在 macOS 上,请依次选择 Android Studio > Preferences),然后在 Appearance & Behavior > System Settings 下找到 Memory Settings 部分。

内存使用情况报告

Android Studio 中的内存问题有时难以重现和报告。为了帮助解决此问题,现在 Android Studio 可提供内存使用情况报告,您可以将此报告发送给 Android Studio 团队,以帮助确定内存问题的来源。对于预览版本(Canary 版、测试版和候选版本),Android Studio 会自动监控内存使用情况,如果检测到频繁达到内存不足阈值的情况,便会触发内存堆分析。

触发堆分析后,Android Studio 会在本地捕获堆转储,然后在您下一次运行 Android Studio 时分析此堆转储。在分析过程中,Android Studio 会移除所有个人数据并创建内存状态摘要。此摘要包含类和对象的实例,以及异常大的内存分配的引用路径。

分析完成后,Android Studio 会生成一份可供您查看的报告并显示通知,如图 2 所示。点击 Review Report 即可查看内存使用情况报告的内容。

指示内存使用情况报告已可供查看的通知

图 2. 指示内存使用情况报告已可供查看的通知。

在发送报告之前,您可以查看其中包含的所有信息,如图 3 所示。查看完以后,请点击 Send。Android Studio 小组会查看此报告,以帮助调查和解决您遇到的问题。

内存使用情况报告。

图 3. 内存使用情况报告。

要手动运行内存使用情况报告,请从菜单栏中依次选择 Help > Analyze Memory Usage。选择此选项后,Android Studio 会转储相应的堆并提示您重启 IDE。如果重启 IDE,堆转储分析会立即开始。否则,堆转储分析会在您下次运行 Android Studio 时开始。在这两种情况下,IDE 都会在内存使用情况报告准备就绪后立即通知您。

动态功能模块的按条件分发

通过按条件分发,您可以针对将在应用安装过程中自动下载的动态功能模块,设置特定的设备配置要求。例如,您可以配置包含增强现实 (AR) 功能的动态功能模块,使其仅供支持 AR 功能的设备在安装应用时下载。

此分发机制目前支持根据以下设备配置控制模块在应用安装时的下载:

如果设备不满足您指定的所有要求,相应模块便不会在应用安装时下载。不过,您的应用以后可以使用 Play 核心库请求按需下载此模块

开始前,请确保您使用的是 Android Studio 3.5 Canary 11 或更高版本。

以下各部分将向您介绍如何向动态功能模块添加对按条件分发的支持。不过请注意,您需要加入向 Google Play 发布包含动态功能模块的应用的测试版计划

添加采用按条件分发选项的新模块

要创建采用按条件分发选项的新动态功能模块,最简单的方法是通过 New Module 向导创建,具体步骤如下:

  1. 要打开 New Module 对话框,请从菜单栏中依次选择 File > New > New Module
  2. 在 New Module 对话框中,选择 Dynamic Feature Module,然后点击 Next
  3. 像往常一样配置模块,然后点击 Next
  4. 在对话框的 Module Download Options 部分中,从以下选项中选择 Only include module at app install for devices with specified features
    • Do not include module at app install (on-demand):创建可供应用支持的所有设备配置(搭载 API 级别 21 或更高版本)按需下载的模块。
    • Include module at install-time:创建在安装应用时下载的模块。
    • Only include module at install-time for devices with specified features:创建只有在特定设备上安装应用时才会下载的模块,这些设备需具有您可以指定的特定配置,例如设备功能或国家/地区。
  5. 如果您想限定模块自动下载所适用的国家/地区或最低 API 级别,请点击 Finish 以完成模块创建,然后参阅介绍如何根据国家/地区最低 API 级别指定条件的部分。

    否则,请点击 + device feature 添加设备为在安装应用时下载模块所需具备的功能。

  6. device-feature 旁边,从下拉菜单中选择以下选项之一,然后为其指定值:

    • Name:用于指定设备为在安装应用时下载模块所需具备的硬件或软件功能。按条件分发所支持的功能与被 PackageManager 列为 FEATURE_* 常量的功能相同。

      如果您选择此选项,请先在下拉菜单旁边的字段中输入相应功能的常量值的任意部分(例如“bluetooth”),然后在所显示的建议中选择一个。

    • OpenGL ES Version:用于指定设备为在安装应用时下载模块所需的 OpenGL ES 版本。如果您选择此选项,请先在下拉菜单旁边的字段中输入相应版本(例如“0x00030001”),然后在所显示的建议中选择一个。

  7. 如果您想根据可用的设备功能添加多个条件,请针对您想指定的每个设备功能条件点击 + device feature

  8. 模块下载选项配置完成后,请点击 Finish

在 Android Studio 创建好动态功能后,您可以检查模块清单,查看在 <dist:delivery> 节点中指定的条件。相关示例如下所示。

<manifest ...>
      <dist:module ...>
        <dist:delivery>
          <dist:install-time>
            <dist:conditions>
              <!-- Requires that the device support AR to download the module at
              app install-time.  -->
              <dist:device-feature dist:name="android.hardware.camera.ar"/>
            </dist:conditions>
          </dist:install-time>
        </dist:delivery>
        ...
      </dist:module>
    </manifest>
    

向现有动态功能模块添加按条件分发选项

您可以通过现有动态功能模块的清单,轻松向模块添加按条件分发选项。不过,您应该先了解按条件分发选项与您可能已启用的其他分发选项之间的兼容性

首先,您需要将您的清单迁移到新的 <dist:delivery> 元素。以下代码段是旧版语法的示例:

<dist:module
      dist:title="@string/title_dynamic_feature" dist:onDemand="true">
      <dist:fusing dist:include="true"/>
    </dist:module>
    

上述分发选项现在按以下方式指定:

<dist:module
      dist:title="@string/title_dynamic_feature">
      <dist:delivery>
          <dist:on-demand/>
      </dist:delivery>
      <dist:fusing dist:include="true"/>
    </dist:module>
    

然后,您就可以根据设备功能添加按条件分发选项,如下所示:

<dist:module
        dist:title="@string/title_dynamic_feature">
        <dist:delivery>
          <dist:on-demand/>
          <dist:install-time>
            <dist:conditions>
              <!-- Requires that the device support AR to download the module at
              app install-time.  -->
              <dist:device-feature dist:name="android.hardware.camera.ar"/>
            </dist:conditions>
          </dist:install-time>
        </dist:delivery>
        <dist:fusing dist:include="true"/>
    </dist:module>
    

以下部分讨论了其他按条件分发的选项,例如按国家/地区或最低 API 级别分发。

与其他模块下载选项的兼容性

由于动态功能模块提供了多个选项来配置如何将每个功能分发给用户设备,因此了解按条件分发选项如何受其他设置的影响非常重要。下表总结了按条件分发选项与其他模块下载选项之间的兼容性。

模块下载选项 与按条件分发选项之间的兼容性
融合 (<dist:fusing dist:include="true"/>) 如果某个模块将此选项设为 true,则 Google Play 在将您的应用部署到搭载 API 级别 19 或更低版本的设备时,不会遵循您指定的按条件分发选项。也就是说,对于搭载 API 级别 19 或更低版本的设备,启用了融合选项的动态功能模块始终会在安装应用时下载。
支持免安装体验 (<dist:module dist:instant="true"/>) 支持免安装体验的动态功能模块不支持按条件分发选项。
按需 (<dist:on-demand/>) 默认情况下,如果您指定按条件分发选项,则模块也可按需提供。

根据国家/地区指定条件

通过按条件分发,您还可以指定在哪些国家/地区可以在安装应用时下载模块。指定此条件可能会很有用,比如您的模块实现在某些地区无法使用的付款方式时。

在此情况下,设备所在的国家/地区通常由用户在其 Google Play 帐号中注册的帐单邮寄地址决定。

要为您的动态功能模块指定国家/地区,请在该模块的清单中添加以下内容:

<dist:conditions>
       <!-- Specify "true" to specify countries to exclude from downloading
       this module at app install-time, or "false" to specify countries that should
       download the module. By default, this is set to “false”. -->
      <dist:user-countries dist:exclude="true">
        <!-- Specifies the two-letter  CLDR country code for regions that should
        not download the module at app install-time. -->
        <dist:country dist:code="CN"/>
        <dist:country dist:code="HK"/>
      </dist:user-countries>
    </dist:conditions>
    

指定有关最低 API 级别的条件

如果您的动态功能模块依赖于仅在特定 Android 平台版本上提供的 API,则根据设备的 API 级别来指定条件可能会非常有用。

要根据最低设备 API 级别来设置条件,请在动态功能模块的清单中添加以下内容。请注意,您指定为条件的 API 级别应该大于或等于模块自己的 minSdkVersion

<dist:conditions>
        <!-- Specifies the minimum API level that the device must satisfy
              in order to download your module at app app install-time. -->
       <dist:min-sdk dist:value="24"/>
    </dist:conditions>
    

Apply Changes

借助 Apply Changes,您可以将代码和资源更改推送给正在运行的应用,而无需重启应用(在某些情况下,甚至无需重启当前的 Activity)。Apply Changes 实现一种全新的方法来保持应用的状态。与重写 APK 字节码的 Instant Run 不同,Apply Changes 会利用 Android 8.0(API 级别 26)或更高版本中支持的运行时插桩,实时地重新定义相应的类。

要使用 Apply Changes,请执行以下操作:

  • 如果您只想在不重启当前 Activity 的情况下应用代码更改,请点击 Apply Code Changes 图标 Apply Code Changes 图标 或按 Ctrl+Alt+F10(在 macOS 上,请按 Command+Shift+Ctrl+R)。

    通常情况下,如果您修改了方法正文中的代码,但没有修改任何资源,则应该使用 Apply Code Changes。如果您还修改了资源,则应该使用 Apply Changes and Restart Activity

  • 如果您想在不重启应用的情况下应用资源和代码更改,请点击 Apply Changes and Restart Activity 图标 Apply Changes 图标 或按 Ctrl+F10(在 macOS 上,请按 Command+Ctrl+R)。

    借助此选项,您只需重启当前的 Activity(而无需重启应用)即可应用资源和代码更改。

为 Apply Changes 启用 Run Fallback

当您所做的更改必须重启应用程序才能应用时,Android Studio 会提示您点击 Run 图标 Run 图标 重新运行您的应用。不过,如果您不想在每次发生这种情况时都收到提示,则可以将 Android Studio 配置为每当更改无法应用时便自动运行您的应用。

要启用此行为,请按以下步骤操作:

  1. 打开 SettingsPreferences 对话框:

    • 在 Windows 或 Linux 上,从菜单栏中依次选择 File > Settings
    • 在 macOS 上,从菜单栏中依次选择 Android Studio > Preferences
  2. 依次转到 Build, Execution, Deployment > Deployment

  3. 选中两种 Apply Changes 操作各自对应的复选框,为其启用自动 Run Fallback。

  4. 点击 OK

限制

Apply Changes 具有以下限制:

  • Apply Changes 仅与搭载 Android 8.0(API 级别 26)或更高版本的设备兼容。
  • 与 Instant Run 一样,某些代码更改在应用程序重启之后才能应用,其中包括以下更改:
    • 添加或删除类、方法或字段
    • 更改清单
    • 更改方法签名
    • 更改方法或类的修饰符
    • 重命名类
    • 更改类继承行为
    • 添加或移除资源
    • 更改原生库(.so 文件)
    • 更改枚举中的值

已知问题

Apply Changes 有以下已知问题:

  • Apply Changes 的速度有时会比 Instant Run 慢。最初的首要任务是实现稳定运行,我们会在未来几个月持续提升性能。
  • 如果您使用除系统和应用线程上下文之外的其他自定义类加载器,可能会遇到意外行为。

IntelliJ IDEA 2019.1

核心 Android Studio IDE 已更新,增加了 IntelliJ IDEA 2019.1 版本中的相关改进,例如主题背景自定义。

其中还包含了以下问题修复更新中的相关改进:

Android Studio 3.6

本部分简要介绍了 Android Studio 3.6 中的新功能和变化。

Apply Changes

现在,您可以添加一个类,然后通过点击 Apply Code Changes 图标 Apply Code Changes 图标Apply Changes and Restart Activity 图标 Apply Changes 图标 将相应代码更改部署到正在运行的应用中。

要详细了解这两种操作的差异,请参阅 Apply Changes

NDK 更新

以下更新支持 Android Studio 中的原生 (C/C++) 开发。

Kotlin 支持

Android Studio 中的以下 NDK 功能以前在 Java 中受支持,现在也在 Kotlin 中受支持:

  • 从 JNI 声明转到 C/C++ 中的对应实现函数。只需将鼠标悬停在托管源代码文件中的行号附近的 C 或 C++ 项标记上方,即可查看此映射。
  • 自动为 JNI 声明创建存根实现函数。首先定义 JNI 声明,然后输入“jni”或 C/C++ 文件中的方法名称进行激活。

  • 未使用的原生实现函数会在源代码中突出显示为警告。缺少实现的 JNI 声明也会突出显示为错误。

  • 如果您重命名(重构)某个原生实现函数,则所有对应的 JNI 声明都会更新。重命名 JNI 声明可更新原生实现函数。

  • 对隐式绑定的 JNI 实现进行签名检查。

其他关于 JNI 的改进

  • 外观显示

    • JNI 实现函数中会显示参数和返回值的类型提示。
    • 经过 JNI 重整的函数名称可以折叠。

  • RegisterNatives 支持

    • 自动填充方法声明名称、参数类型和返回值类型。

    • 对方法声明名称进行重命名重构。

    • 对绑定 JNI 函数进行签名检查。

  • 有关 JNI 函数的其他帮助

    • 对于以下函数中的字符串字面量的自动填充、检查、导航和重命名重构支持:
      • FindClass
      • GetMethodIDGetStaticMethodID
      • GetFieldIDGetStaticFieldID
    • 针对以下函数的各种检查:
      • Call[Static]<type>Method
      • CallNonvirtual<type>Method
      • Get[Static]<type>Field
      • NewObject

IntelliJ IDEA 2019.2

核心 Android Studio IDE 已更新,增加了 IntelliJ IDEA 2019.2 版本中的相关改进,例如“Services”工具窗口。

要详细了解版本 2019.2 中包含的先前 IntelliJ 版本中的改进,请参阅以下页面: