Android Studio Hedgehog | 2023.1.1 (2023年11月)

以下是 Android Studio Hedgehog 中的新功能。

IntelliJ IDEA 2023.1 平台更新

Android Studio Hedgehog 包含 IntelliJ IDEA 2023.1 更新,这些更新改进了 Studio IDE 体验。有关更改的详细信息,请参阅IntelliJ IDEA 2023.1 发行说明

在应用质量洞察中分析 Android 核心指标

应用质量洞察 现在包括 Android 核心指标 数据,因此您可以更轻松地访问 Google Play 收集的核心指标并改善用户体验。使用 Android 核心指标解决与应用稳定性相关的问题,以帮助提高应用在 Google Play 上的质量。

您可以查看 Android 核心指标问题、对其进行筛选,并从堆栈跟踪跳转到代码,所有这些都可以在应用质量洞察工具窗口中完成。要开始使用,请按照以下步骤操作

  1. 使用工具栏末尾的个人资料图标 登录您的开发者帐户到 Android Studio 中。
  2. 通过点击 Android Studio 中的工具窗口或点击查看 > 工具窗口 > 应用质量洞察打开应用质量洞察
  3. 点击应用质量洞察中的Android 核心指标选项卡。

Android 核心指标和 Crashlytics 之间的差异

请注意,Android 核心指标和 Crashlytics 可能会报告与相同崩溃关联的用户和事件数量的不同值。这些差异发生是因为 Play 和 Crashlytics 可能会在不同的时间和针对不同的用户捕获崩溃。以下是 Play 和 Crashlytics 计数可能不同的几个原因

  • Play 从启动时开始捕获崩溃,而 Crashlytics 捕获 Crashlytics SDK 初始化后发生的崩溃。
  • 如果用户在获取新手机时选择退出崩溃报告,则不会将这些崩溃报告给 Play;但是,Crashlytics 根据应用自己的隐私政策捕获崩溃。

新的电源分析器

从 Android Studio Hedgehog 开始,电源分析器显示设备上的功耗。您可以在设备上的电源轨监视器 (ODPM) 中查看此新数据。ODPM 按称为电源轨的子系统对数据进行分段。有关支持的子系统列表,请参阅可分析的电源轨

系统跟踪记录并显示功耗数据。它是 CPU 分析器的一部分。此数据可帮助您直观地将设备的功耗与应用程序中发生的事件相关联。电源分析器可以可视化此数据。

The new Power Profiler

要查看来自新的电源分析器的数据,请在 Pixel 6+ 设备上进行系统跟踪。

  1. 选择查看 > 工具窗口 > 分析器
  2. 单击CPU 时间线中的任意位置以打开 CPU 分析器并启动系统跟踪。

新的应用链接助手提供了应用程序中设置的深层链接的全面概述。助手显示应用程序的 AndroidManifest.xml 文件中所有现有的深层链接,验证这些深层链接的配置是否正确,并提供了一种快速自动修复错误配置的方法。

要打开应用链接助手,请在 Android Studio 中导航到工具 > 应用链接助手。有关应用链接的更多信息,请参阅添加 Android 应用链接

实时编辑更新的手动模式快捷键

实时编辑在 Android Studio Hedgehog 中包含一个用于手动模式(手动推送)的新快捷键:Control+\(macOS 为Command+\)。手动模式在您希望精确控制何时将更新部署到正在运行的应用程序的情况下很有用。例如,如果您正在对文件进行大规模更改并且不希望任何中间状态反映在设备上。您可以在实时编辑设置中或使用实时编辑 UI 指示器在手动推送保存时手动推送之间进行选择。有关更多信息,请参阅Jetpack Compose 的实时编辑中的视频剪辑。

Compose 多预览模板

androidx.compose.ui:ui-tooling-preview 1.6.0-alpha01+ 引入了新的多预览 API模板:@PreviewScreenSizes@PreviewFontScales@PreviewLightDark@PreviewDynamicColors,以便使用一个注释,您可以在常见场景中预览您的 Compose UI。

在 Android Studio Hedgehog 中,Compose 预览中引入了一种新的画廊模式,它允许您一次专注于一个预览并节省渲染资源。我们建议在您需要迭代应用程序的 UI 时使用画廊模式,并在您需要查看 UI 变体时切换到其他模式,例如网格或列表。

调试器中的 Compose 状态信息

当 Compose UI 的某些部分意外重新组合时,有时很难理解原因。现在,在可组合函数上设置断点时,调试器会列出可组合函数的参数及其状态,以便您可以更轻松地识别可能导致重新组合的更改。例如,当您在可组合函数上暂停时,调试器可以准确地告诉您哪些参数已“更改”或保持“未更改”,以便您可以更有效地调查重新组合的原因。

设备镜像

您现在可以在 Android Studio 的正在运行的设备窗口中镜像您的物理设备。通过将设备的显示屏直接流式传输到 Android Studio,您可以执行一些常见操作,例如启动应用程序并与之交互、旋转屏幕、折叠和展开手机、更改音量等等,所有这些操作都可以在 Studio IDE 本身中完成。

当连接到启用了 USB 或无线调试的计算机的设备时,设备镜像始终可用。您可以使用正在运行的设备窗口设备管理器查看 > 工具窗口 > 设备管理器)启动和停止镜像。您还可以在其设置中自定义激活设备镜像的时间(设置 > 工具 > 设备镜像)。

Running Devices UI

已知问题

某些设备可能无法以足以支持设备镜像的比特率进行编码。在这些情况下,您可能会在正在运行的设备窗口中看到错误,以及类似于下面所示的日志。

2023-06-01 15:32:22,675 [  56094]   WARN - ScreenSharingAgent Samsung SM-A045F API 33 - Too many video encoder errors:
2023-06-01 15:32:22,676 [  56095]   WARN - ScreenSharingAgent Samsung SM-A045F API 33 - encoder: c2.android.vp8.encoder
2023-06-01 15:32:22,676 [  56095]   WARN - ScreenSharingAgent Samsung SM-A045F API 33 - mime type: video/x-vnd.on2.vp8
2023-06-01 15:32:22,676 [  56095]   WARN - ScreenSharingAgent Samsung SM-A045F API 33 - max resolution: 640x640
2023-06-01 15:32:22,676 [  56095]   WARN - ScreenSharingAgent Samsung SM-A045F API 33 - min resolution: 2x2
2023-06-01 15:32:22,676 [  56095]   WARN - ScreenSharingAgent Samsung SM-A045F API 33 - alignment: 2x2
2023-06-01 15:32:22,676 [  56095]   WARN - ScreenSharingAgent Samsung SM-A045F API 33 - max frame rate: 960
2023-06-01 15:32:22,676 [  56095]   WARN - ScreenSharingAgent Samsung SM-A045F API 33 - max frame rate for 288x640: 960
2023-06-01 15:32:22,870 [  56289]   WARN - ScreenSharingAgent Samsung SM-A045F API 33 - max bitrate: 20000000
2023-06-01 15:32:22,871 [  56290]   WARN - ScreenSharingAgent Samsung SM-A045F API 33 - terminated with code 1

隐私声明

根据设备镜像设置,Android Studio 可以自动为任何连接和配对的设备启动设备镜像。这可能会导致使用adb tcpip命令连接的设备的信息泄露,因为镜像信息和命令通过非加密通道传递。此外,Android Studio 使用非加密通道与 adb 服务器通信,因此镜像信息可能会被主机上的其他用户拦截。

硬件输入转发

您现在可以启用工作站硬件输入(例如鼠标和键盘)到连接的物理和虚拟设备的透明转发。要启用透明转发,请单击正在运行的设备窗口中目标设备的硬件输入

直接从“正在运行的设备”窗口管理设备

您现在可以通过单击+图标并选择设备,直接从正在运行的设备窗口启动 Android 虚拟设备 (AVD) 或开始镜像物理设备。要停止 AVD 或物理设备的镜像,请关闭设备选项卡。

Device drop-down from Running Devices

嵌入式布局检查器

从 Android Studio Hedgehog Canary 2 开始,您可以在正在运行的设备工具窗口中直接运行布局检查器。此实验性功能节省了屏幕空间,并有助于在一个工具窗口中组织您的 UI 调试工作流程。在嵌入模式下,您可以显示视图层次结构,检查每个视图的属性,并访问其他常见的布局检查器功能。要访问完整的功能集,您仍然需要在独立窗口中运行布局检查器(Windows 上的文件 > 设置 > 实验性 > 布局检查器或 macOS 上的Android Studio > 设置 > 实验性 > 布局检查器)。

嵌入式布局检查器的一个限制是3D 模式仅在快照中可用。

为了帮助我们改进嵌入式布局检查器,请向我们发送反馈

新的 UI 改进

Android Studio 的新 UI为 Studio IDE 带来了更现代、更简洁的外观和感觉。我们已经听取了您迄今为止的反馈,并在 Android Studio Hedgehog 中修复了与以下功能相关的问题

  • 紧凑模式
  • 支持垂直或水平拆分
  • macOS 的项目选项卡
  • 修复了无干扰模式
  • 始终显示工具窗口操作的高级设置

SDK 升级助手更新

SDK 升级助手提供了一个分步向导流程,以帮助您进行targetSdkVersion升级。以下是 Android Studio Hedgehog 中 SDK 升级助手的更新

  • 请参阅升级到 Android 14 的重大更改
  • 添加了相关性过滤器,因此删除了一些不必要的步骤
  • 对于某些更改,精确指出需要在代码中的哪个位置进行更改

仅禁用目标 API 级别构建优化

您现在可以禁用目标设备 API 级别的 IDE 优化。默认情况下,Android Studio 通过为要部署到的目标设备的 API 级别定制 dexing 过程来减少总体构建时间。要关闭此功能,请转到文件 > 设置 > 实验性(macOS 上的Android Studio > 设置 > 实验性)并取消选中仅针对目标设备 API 级别优化构建。请注意,关闭此构建优化可能会增加构建时间。

[仅限 Windows] 最大程度地减少防病毒软件对构建速度的影响

构建分析器会通知您防病毒软件是否可能影响您的构建性能。如果防病毒软件(例如 Windows Defender)正在对 Gradle 使用的目录进行实时扫描,则可能会发生这种情况。构建分析器建议排除一些目录,使其免受主动扫描,并且如果可能,它会提供一个链接,用于将这些目录添加到 Windows Defender 文件夹排除列表中。

不再支持 Eclipse Android 开发工具项目

Android Studio Hedgehog 及更高版本不支持导入 Eclipse ADT 项目。您仍然可以打开这些项目,但它们不再被识别为 Android 项目。如果您需要导入此类项目,可以使用Android Studio 的早期版本。如果给定版本的 Android Studio 无法导入您的项目,您可以尝试使用更早的版本。一旦使用早期版本的 Android Studio 将项目转换为 Android 项目,您就可以使用 AGP 升级助手使用最新版本的 Android Studio 处理该项目。

将 Firebase Test Lab 设备与 Gradle 管理的设备一起使用

使用 AGP 8.2.0-alpha03 或更高版本时,在使用Gradle 管理的设备时,您可以在Firebase Test Lab设备上大规模运行自动化仪器测试。Test Lab 允许您在各种 Android 设备(包括物理设备和虚拟设备)上同时运行测试。这些测试在远程 Google 数据中心运行。借助 Gradle 管理的设备 (GMD) 的支持,构建系统现在可以根据项目 Gradle 文件中的配置完全管理针对这些 Test Lab 设备运行测试。

开始使用 Gradle 管理的 Firebase Test Lab 设备

以下步骤说明了如何开始使用 GMD 的 Firebase Test Lab 设备。请注意,这些步骤使用 gcloud CLI 提供用户凭据,这可能不适用于所有开发环境。有关在您的需求中使用哪种身份验证流程的更多信息,请参阅应用程序默认凭据的工作原理

  1. 要创建 Firebase 项目,请转到Firebase 控制台。单击添加项目,然后按照屏幕上的提示创建项目。记住您的项目 ID。

  2. 要安装 Google Cloud CLI,请按照安装 gcloud CLI中的步骤操作。
  3. 配置您的本地环境。
    1. 将您的 Firebase 项目链接到 gcloud
        gcloud config set project FIREBASE_PROJECT_ID
        
    2. 授权使用您的用户凭据进行 API 访问。我们建议通过将服务帐号 JSON 文件传递到使用DSL的模块级构建脚本中的 Gradle 来进行授权。

      Kotlin

        firebaseTestLab {
          ...
          serviceAccountCredentials.set(file(SERVICE_ACCOUNT_JSON_FILE))
        }
        

      Groovy

        firebaseTestLab {
          ...
          serviceAccountCredentials = file(SERVICE_ACCOUNT_JSON_FILE)
        }
        

      或者,您可以使用以下终端命令手动授权

        gcloud auth application-default login
        
    3. 可选:将您的 Firebase 项目添加为配额项目。仅当您超过Test Lab 的免费配额时,才需要执行此步骤。

        gcloud auth application-default set-quota-project FIREBASE_PROJECT_ID
        
  4. 启用所需的 API。

    Google Developers Console API 库页面中,通过在控制台顶部的搜索框中输入这些 API 名称,然后单击每个 API 概述页面上的启用 API,启用Cloud Testing APICloud Tool Results API

  5. 配置您的 Android 项目。

    1. 在顶级构建脚本中添加 Firebase Test Lab 插件

      Kotlin

        plugins {
          ...
          id("com.google.firebase.testlab") version "0.0.1-alpha05" apply false
        }
        

      Groovy

        plugins {
          ...
          id 'com.google.firebase.testlab' version '0.0.1-alpha05' apply false
        }
        
    2. gradle.properties文件中启用自定义设备类型

        android.experimental.testOptions.managedDevices.customDevice=true
        
    3. 在模块级构建脚本中添加 Firebase Test Lab 插件

      Kotlin

        plugins {
          ...
          id "com.google.firebase.testlab"
        }
        

      Groovy

        plugins {
          ...
          id 'com.google.firebase.testlab'
        }
        

    在 Gradle 管理的 Firebase Test Lab 设备上创建和运行测试

    您可以在模块级构建脚本中指定 Firebase Test Lab 设备,供 Gradle 用于测试您的应用。以下代码示例创建了一个运行 API 级别 30 的 Pixel 3,作为名为ftlDevice的 Gradle 管理的 Test Lab 设备。当您将com.google.firebase.testlab插件应用到您的模块时,可以使用firebaseTestLab {}块。支持的最低 Android Gradle 插件版本为 8.2.0-alpha01。

    Kotlin

    firebaseTestLab {
      managedDevices {
        create("ftlDevice") {
          device = "Pixel3"
          apiLevel = 30
        }
      }
      ...
    }

    Groovy

    firebaseTestLab {
      managedDevices {
        ftlDevice {
          device = "Pixel3"
          apiLevel = 30
        }
      }
      ...
    }

    要使用您配置的 Gradle 管理的 Test Lab 设备运行测试,请使用以下命令。device-name是您在 Gradle 构建脚本中配置的设备名称,例如ftlDevice,而BuildVariant是您要测试的应用的构建变体。请注意,Gradle 不会并行运行测试,也不支持 Test Lab 设备的其他 Google Cloud CLI 配置。

    在 Windows 上

    gradlew device-nameBuildVariantAndroidTest
    

    在 Linux 或 macOS 上

    ./gradlew device-nameBuildVariantAndroidTest
    

    测试输出包含指向包含测试报告的 HTML 文件的路径。您还可以通过在 IDE 中单击运行 > 测试历史记录将测试结果导入 Android Studio 以进行进一步分析。

    创建和运行设备组上的测试

    要扩展您的测试,请将多个 Gradle 管理的 Firebase Test Lab 设备添加到设备组,然后使用单个命令在所有设备上运行测试。假设您已设置了多个设备,如下所示

    firebaseTestLab {
      managedDevices {
        create("GalaxyS23Ultra") { ... }
        create("GalaxyZFlip3") { ... }
        create("GalaxyZFold3") { ... }
        create("GalaxyTabS2") { ... }
      }
    }
    

    要将它们添加到名为samsungGalaxy的设备组,请使用groups {}

    firebaseTestLab {
      managedDevices {...}
    }
    
    android {
      ...
      testOptions {
        managedDevices {
          groups {
            create("samsungGalaxy") {
              targetDevices.add(devices["GalaxyS23Ultra"])
              targetDevices.add(devices["GalaxyZFlip3"])
              targetDevices.add(devices["GalaxyZFold3"])
              targetDevices.add(devices["GalaxyTabS3"])
            }
          }
        }
      }
    }
    

    要在设备组中的所有设备上运行测试,请使用以下命令

    在 Windows 上

    gradlew group-nameGroupBuildVariantAndroidTest
    

    在 Linux 或 macOS 上

    ./gradlew group-nameGroupBuildVariantAndroidTest
    

    使用智能分片优化测试运行

    在 Gradle 管理的 Test Lab 设备上进行测试现在支持智能分片。智能分片会自动将您的测试分布到多个分片中,以便每个分片大约运行相同的时间,从而减少手动分配工作量并缩短整体测试运行时间。智能分片使用您的测试历史记录(或有关您的测试以前运行时间的信息)以最佳方式分配测试。请注意,您需要 Firebase Test Lab 的 Gradle 插件的 0.0.1-alpha05 版本才能使用智能分片。

    要启用智能分片,请指定每个分片中测试应花费的时间。您应将目标分片时间持续时间设置为比timeoutMinutes短至少五分钟,以避免分片在测试完成前被取消的情况。

    firebaseTestLab {
      ...
      testOptions {
        targetedShardDurationMinutes = 2
      }
    }

    要了解更多信息,请阅读有关新的 DSL 选项

    Gradle 管理的 Firebase Test Lab 设备的更新 DSL

    您可以配置更多 DSL 选项来帮助自定义测试运行或从您可能已经在使用的其他解决方案迁移。在以下代码片段中查看一些这些选项的描述。

    firebaseTestLab {
      ...
    
      /**
       * A path to a JSON file that contains service account credentials to access to
       * a Firebase Test Lab project.
       */
      serviceAccountCredentials.set(file("your_service_account_credentials.json"))
    
    
      testOptions {
        fixture {
          /**
           * Whether to grant permissions on the device before tests begin.
           * Available options are "all" or "none".
           *
           * Default value is "all".
           */
          grantedPermissions = "all"
    
          /**
           * Map of files to push to the device before starting the test.
           *
           * The key is the location on the device.
           * The value is the location of the file, either local or in Google Cloud.
           */
          extraDeviceFiles["/sdcard/dir1/file1.txt"] = "local/file.txt"
          extraDeviceFiles["/sdcard/dir2/file2.txt"] = "gs://bucket/file.jpg"
    
          /**
           * The name of the network traffic profile.
           *
           * Specifies network conditions to emulate when running tests.
           *
           * Default value is empty.
           */
          networkProfile = "LTE"
        }
    
        execution {
          /**
           * The maximum time to run the test execution before cancellation,
           * measured in minutes. Does not include the setup or teardown of device,
           * and is handled server-side.
           *
           * The maximum possible testing time is 45 minutes on physical devices
           * and 60 minutes on virtual devices.
           *
           * Defaults to 15 minutes.
           */
           timeoutMinutes = 30
    
          /**
           * Number of times the test should be rerun if tests fail.
           * The number of times a test execution should be retried if one
           * or more of its test cases fail.
           *
           * The max number of times is 10.
           *
           * The default number of times is 0.
           */
          maxTestReruns = 2
    
          /**
           * Ensures only a single attempt is made for each execution if
           * an infrastructure issue occurs. This doesn't affect `maxTestReruns`.
           * Normally, two or more attempts are made by Firebase Test Lab if a
           * potential infrastructure issue is detected. This is best enabled for
           * latency sensitive workloads. The number of execution failures might be
           * significantly greater with `failFast` enabled.
           *
           * Defaults to false.
           */
          failFast = false
    
          /**
           * The number of shards to split the tests across.
           * 
           * Default to 0 for no sharding.
           */
          numUniformShards = 20
    
          /**
          * For smart sharding, the target length of time each shard should takes in
          * minutes. Maxes out at 50 shards for physical devices and 100 shards for
          * virtual devices.
          *
          * Only one of numUniformShards or targetedShardDurationMinutes can be set.
          *
          * Defaults to 0 for no smart sharding.
          */
          targetedShardDurationMinutes = 15
        }
    
        results {
          /**
           * The name of the Google storage bucket to store the test results in.
           *
           * If left unspecified, the default bucket is used.
           *
           * Please refer to Firebase Test Lab permissions for required permissions
           * for using the bucket.
           */
          cloudStorageBucket = "bucketLocationName"
    
          /**
           * Name of test results for the Firebase console history list.
           * All tests results with the same history name are grouped
           * together in the Firebase console in a time-ordered test history list.
           *
           * Defaults to the application label in the APK manifest in Flank/Fladle.
           */
          resultsHistoryName = "application-history"
    
          /**
           * List of paths to copy from the test device's storage to the test
           * results folder. These must be absolute paths under /sdcard or
           * /data/local/tmp.
           */
          directoriesToPull.addAll(
            "/sdcard/path/to/something"
          )
    
          /**
           * Whether to enable video recording during the test.
           *
           * Disabled by default.
           */
          recordVideo = false
    
          /**
           * Whether to enable performance metrics. If enabled, monitors and records
           * performance metrics such as CPU, memory, and network usage.
           *
           * Defaults to false.
           */
          performanceMetrics = true
        }
      }
    }