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 发布说明

在 App Quality Insights 中分析 Android vitals

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

您可以在 App Quality Insights 工具窗口中查看 Android vitals 问题、对其进行过滤,并从堆栈跟踪跳转到代码。要开始使用,请按照以下步骤操作:

  1. 使用工具栏末尾的个人资料图标 在 Android Studio 中登录您的开发者帐号。
  2. 在 Android Studio 中点击工具窗口或点击 View > Tool Windows > App Quality Insights 打开 App Quality Insights
  3. App Quality Insights 中点击 Android vitals 标签页。

Android vitals 与 Crashlytics 之间的数字差异

请注意,对于与同一崩溃相关的用户数和事件数,Android vitals 和 Crashlytics 可能会报告不同的值。出现这些差异是因为 Play 和 Crashlytics 可以在不同时间和针对不同用户捕获崩溃。以下是 Play 和 Crashlytics 计数可能不同的几个原因:

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

新增电源性能分析器

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

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

The new Power Profiler

要查看新的电源性能分析器中的数据,请在 Pixel 6+ 设备上进行系统跟踪:

  1. 选择 View > Tool Windows > Profiler
  2. CPU timeline 中的任意位置点击以打开 CPU Profiler 并开始系统跟踪。

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

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

Live Edit 更新了手动模式快捷方式

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

Compose 多预览模板

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

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

调试器中的 Compose 状态信息

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

设备镜像

您现在可以在 Android Studio 的 Running Devices 窗口中镜像您的实体设备。通过将设备显示屏直接流式传输到 Android Studio,您可以在 Studio IDE 本身执行常用操作,例如启动应用并与之互动、旋转屏幕、折叠和展开手机、更改音量等。

当计算机连接了启用 USB 或无线调试的设备时,设备镜像始终可用。您可以使用 Running Devices 窗口Device Manager (View > Tool Windows > Device Manager) 启动和停止镜像。您还可以在设置 (Settings > Tools > Device Mirroring) 中自定义何时激活设备镜像。

Running Devices UI

已知问题

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

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 服务器通信,因此镜像信息可能被您主机上的其他用户拦截。

硬件输入转发

您现在可以将工作站的硬件输入(例如鼠标和键盘)透明地转发到连接的实体和虚拟设备。要启用透明转发,请在 Running Devices 窗口中点击目标设备的 Hardware input

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

您现在可以直接从 Running Devices 窗口启动 Android 虚拟设备 (AVD),或开始镜像实体设备,只需点击 + 图标并选择设备即可。要停止 AVD 或实体设备的镜像,请关闭设备标签页。

Device drop-down from Running Devices

嵌入式布局检查器

从 Android Studio Hedgehog Canary 2 开始,您可以直接在 Running Devices 工具窗口中运行 Layout Inspector。此实验性功能节省了屏幕空间,并有助于在单个工具窗口中组织您的 UI 调试工作流。在嵌入模式下,您可以显示视图层级结构、检查每个视图的属性,并访问其他常见的 Layout Inspector 功能。要访问完整的选项集,您仍然需要在独立窗口中运行 Layout Inspector(Windows 上为 File > Settings > Experimental > Layout Inspector,macOS 上为 Android Studio > Settings > Experimental > Layout Inspector)。

嵌入式 Layout Inspector 的一个限制是,3D 模式仅在快照中可用。

为了帮助我们改进嵌入式 Layout Inspector,请向我们发送反馈

新的用户界面改进

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

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

SDK 升级助手更新

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

  • 查看升级到 Android 14 的重大变更
  • 添加了相关性过滤器,以便移除一些不必要的步骤
  • 对于某些更改,精确指出需要在代码中的哪个位置进行更改

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

您现在可以禁用 IDE 对目标设备 API 级别的优化。默认情况下,Android Studio 通过针对您要部署到的目标设备的 API 级别定制 dexing 过程来缩短总体构建时间。要关闭此功能,请转到 File > Settings > Experimental(macOS 上为 Android Studio > Settings > Experimental)并取消选中 Optimize build for target device API level only。请注意,关闭此构建优化可能会增加构建时间。

[仅限 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 设备

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

  1. 要创建 Firebase 项目,请转到 Firebase 控制台。点击 Add project 并按照屏幕上的提示创建一个项目。记住您的项目 ID。

  2. 要安装 Google Cloud CLI,请按照 安装 gcloud CLI 中的步骤进行操作。
  3. 配置本地环境。
    1. 在 gcloud 中链接到您的 Firebase 项目
        gcloud config set project FIREBASE_PROJECT_ID
        
    2. 授权使用您的用户凭据进行 API 访问。我们建议通过在模块级构建脚本中使用 DSL服务帐号 JSON 文件传递给 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 概览页面上的 Enable 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 用于测试您的应用。以下代码示例创建一个名为 ftlDevice 的、运行 API 级别 30 的 Pixel 3 作为 Gradle 管理的 Test Lab 设备。firebaseTestLab {} 块在您将 com.google.firebase.testlab 插件应用于模块时可用。支持的最低 Android Gradle Plugin 版本为 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 中点击 Run > Test History 将测试结果导入 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
        }
      }
    }