Benchmark

在 Android Studio 中准确衡量代码性能。
最近更新时间 稳定版 候选版 Beta 版 Alpha 版
2024 年 12 月 11 日 1.3.3 - - 1.4.0-alpha06

声明依赖项

如需添加 Benchmark 的依赖项,您必须将 Google Maven 制品库添加到项目中。有关详情,请阅读 Google 的 Maven 制品库

Macrobenchmark

如需在项目中使用 Macrobenchmark,请将以下依赖项添加到 Macrobenchmark 模块build.gradle 文件中:

Groovy

dependencies {
  androidTestImplementation "androidx.benchmark:benchmark-macro-junit4:1.3.0"
}

Kotlin

dependencies {
  androidTestImplementation("androidx.benchmark:benchmark-macro-junit4:1.3.0")
}

Microbenchmark

如需在项目中使用 Microbenchmark,请将以下依赖项添加到microbenchmark 模块build.gradle 文件中:

Groovy

dependencies {
    androidTestImplementation "androidx.benchmark:benchmark-junit4:1.3.0"
}

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner"
    }
}

Kotlin

dependencies {
    androidTestImplementation("androidx.benchmark:benchmark-junit4:1.3.0")
}

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner"
    }
}

Microbenchmark 库还提供了一个可与 Microbenchmark 模块搭配使用的 Gradle 插件。此插件可设置模块的默认 build 配置,设置将基准输出复制到主机,并提供 ./gradlew lockClocks 任务

如需使用该插件,请在顶级 build.gradle 文件的“plugins”代码块中添加以下代码行:

Groovy

plugins {
  id 'androidx.benchmark' version '1.3.0' apply false
}

Kotlin

plugins {
  id("androidx.benchmark") version "1.3.0" apply false
}

然后,将该插件应用到基准模块的 build.gradle 文件

Groovy

plugins {
  id 'androidx.benchmark'
}

Kotlin

plugins {
    id("androidx.benchmark")
}

反馈

您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。

创建新问题

如需了解详情,请参阅问题跟踪器文档

版本 1.4

版本 1.4.0-alpha06

2024 年 12 月 11 日

发布了 androidx.benchmark:benchmark-*:1.4.0-alpha06。版本 1.4.0-alpha06 包含这些提交内容

API 变更

  • 移除了 PerfettoTraceProcessor.Session.query() 中的 @Language("sql") 用法,因为 Studio 突出显示/解析功能已损坏。(Idc2fab/377733398

bug 修复

  • 此库现在使用 JSpecify nullness annotations,即类型使用。Kotlin 开发者应使用以下编译器参数来强制执行正确的用法:-Xjspecify-annotations=strict-Xtype-enhancement-improvements-strict-mode (I46810b/326456246)
  • 更正了 ArtMetric,以报告类加载(而非初始化),并改进了文档以阐明运行时行为。(I9915c)
  • 在 Android 多用户模式下,请仅在已取得 root 权限的设备上以 root 身份执行命令。(I88b44)

版本 1.4.0-alpha05

2024 年 11 月 13 日

发布了 androidx.benchmark:benchmark-*:1.4.0-alpha05。版本 1.4.0-alpha05 包含这些提交内容

bug 修复

  • 修复了 API 34 及更高版本中存在的一个问题,即 CompilationMode.None() 的性能不一致,不能代表初始的最差性能。这可解决一个平台变更问题,该变更允许 ART 的编译状态 verify 在首次启动后不久就对应用进行部分编译(仅影响类加载)。(Ie48d0)
  • 修复了以下问题:由于进程名称在 Perfetto 轨迹中被截断,因此可能会捕获(尤其是短)轨迹,而这些轨迹不会报告内置 Macrobenchmark 指标的测量结果。现在,除了预期的软件包名称之外,macrobenchmark 还会在所有内置查询中查找截断的软件包名称,以解决此问题。请注意,自定义 TraceMetric 实现或 PerfettoSession.query 的其他直接调用方可以通过将 Perfetto 查询中的 process.name LIKE "$packageName" 更改为 (process.name LIKE "$packageName" OR process.name LIKE "$(packageName.takeLast(15))") 来实现相同的行为。(I5bf01b/377565760

版本 1.4.0-alpha04

2024 年 10 月 30 日

发布了 androidx.benchmark:benchmark-*:1.4.0-alpha04。版本 1.4.0-alpha04 包含这些提交内容

新功能

  • (实验性)启用基准配置文件生成功能,并对安装到次要用户的应用(例如无头 Android Auto 设备上的任何应用)进行基准测试。我们已在某些情况下测试过此支持功能,但如果它不适用于您,请告诉我们并报告 bug。(I9fcbeb/356684617b/373641155

bug 修复

  • 现在,基准测试 build 中始终会替换 isProfileable,基准测试 build 和 nonMinified(基准配置文件捕获)build 中也始终会替换 isDebuggable。(I487fab/369213505
  • 修复了在 API 28 之前在某些实体设备上进行编译检测时出现的问题 - 影响 json context.compilationMode 以及 androidx.benchmark.requireAot=true 的行为(不再错误地抛出)(Ic3e08b/374362482
  • CpuEventCounter 指标中,如果观察到无效的测量结果(例如 instructions/cpucycles==0),则抛出异常 (I8c503)

版本 1.4.0-alpha03

2024 年 10 月 16 日

发布了 androidx.benchmark:benchmark-*:1.4.0-alpha03。版本 1.4.0-alpha03 包含这些提交内容

API 变更

  • Macrobenchmark:添加了 ArtMetric,可用于检查配置文件覆盖率或常规 Android RunTime 性能。捕获 JIT、类初始化(如果可用)和类验证的次数和总时长。此外,更改了 CaptureInfo,以便包含可选的 ART Mainline 版本和默认版本。(I930f7)
  • coefficientOfVariation 添加到基准测试 JSON 输出中,以显示给定基准测试运行中的稳定性。(Ib14ea)

bug 修复

  • 修复了当 AVD 设备中包含空格时 CollectBaselineProfileTask 的问题。(Ia0225b/371642809
  • 针对 StartupMode.COLD 异常错误的推测性修复:Package <packagename> must not be running prior to cold start!。现在,MacrobenchmarkScope.killProcess()(包括在每次迭代之前运行的用于实现 StartupMode.COLD 行为的 MacrobenchmarkScope.killProcess())将等待,以验证应用的进程是否已全部停止运行。(I60aa6b/351582215
  • 修复了某些已取得 root 权限的模拟器上会显示 UNLOCKED_ 错误的问题。(Ic5117)
  • 此库现在使用 JSpecify nullness annotations,即类型使用。Kotlin 开发者应使用以下编译器参数来强制执行正确的用法:-Xjspecify-annotations=strict-Xtype-enhancement-improvements-strict-modeI7104fb/326456246

版本 1.4.0-alpha02

2024 年 10 月 2 日

发布了 androidx.benchmark:benchmark-*:1.4.0-alpha02。版本 1.4.0-alpha02 包含这些提交内容

API 变更

  • 将 Gradle 任务 lockClocksunlockClocks 移到了基准测试项目中,而不是在顶级提供。很遗憾,我们无法在不破坏项目隔离的情况下将这些操作注册为顶级操作,因此必须进行此更改。(I02b8fb/363325823

bug 修复

  • BaselineProfileRule 现在会在块结束时向每个正在运行的进程发送信号,以转储配置文件,从而收集多进程应用的配置文件。如果基于配置文件的编译从未成功找到要广播到的进程,则编译将失败,因为其中不应包含配置文件数据。此外,添加了一个插桩参数来控制转储等待时长:androidx.benchmark.saveProfileWaitMillisI0f519b/366231469
  • 基准测试 1.3.2:修复了 Firebase Test Lab (FTL) 无法从基准配置文件 Gradle 插件中提取基准配置文件或 Macrobenchmark 结果文件的问题。(I2f678b/285187547

如需使用 FTL,请将该插件应用到插件块中的基准配置文件模块,具体方法为:

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

然后,使用以下命令配置 Firebase Test Lab:

  firebaseTestLab {

      // Credentials for FTL service
      serviceAccountCredentials.set(file("credentials.json"))

      // Creates one or more managed devices to run the tests on.
      managedDevices {
          "ftlDeviceShiba34" {
              device = "shiba"
              apiLevel = 34
          }
      }

      // Ensures the baseline profile is pulled from the device.
      // Note that this will be automated as well later with aosp/3272935.
      testOptions {
          results {
              directoriesToPull.addAll("/storage/emulated/0/Android/media/${android.namespace}")
          }
      }
  }

此外,还需要将创建的 FTL 设备添加到基准配置文件扩展程序:

  baselineProfile {
      managedDevices += "ftlDeviceShiba34"
      useConnectedDevices = false
  }

版本 1.4.0-alpha01

2024 年 9 月 18 日

发布了 androidx.benchmark:benchmark-*:1.4.0-alpha01。版本 1.4.0-alpha01 包含这些提交内容

新功能 - 应用启动数据分析

  • 您可以在 Macrobenchmark 中启用初始版本的应用启动数据分析。(09fae38)

如需在启动基准测试中启用,请执行以下操作:

  @Test
  fun startup {
      macrobenchmarkRule.measureRepeated(
          
          packageName = "com.example.my.application.id"
          metrics = listOf(StartupTimingMetric()),
          iterations = 5,
          startupMode = StartupMode.COLD,
          compilationMode = CompilationMode.None(),
          experimentalConfig = ExperimentalConfig(startupInsightsConfig = StartupInsightsConfig(isEnabled = true))
          ) {
          scope.startActivityAndWait(...)
      }
  }

然后,运行启动基准测试将分析轨迹以查找常见问题,并在基准测试标签页中的指标后面将这些问题输出到 Studio 测试输出中,例如:

StartupBenchmark_startup[startup=COLD,compilationMode=None]
├── Metrics
│   ├──   timeToFullDisplayMs                min  1,147.2,   median  1,208.8,   max  1,307.4
│   └──   timeToInitialDisplayMs             min  1,147.2,   median  1,208.8,   max  1,307.4
├── App Startup Insights
│   ├── App in debuggable mode (expected: false)
│   │   └── seen in iterations: 0(true) 1(true) 2(true) 3(true) 4(true) 5(true) 6(true) 7(true) 8(true) 9(true)
│   ├── Potential CPU contention with another process (expected: < 100000000ns)
│   │   └── seen in iterations: 4(105022546ns)
│   └── Main Thread - Binder transactions blocked (expected: false)
│       └── seen in iterations: 7(true)
└── Traces
    └── Iteration 0 1 2 3 4 5 6 7 8 9

此功能仍在开发中,我们会改进文档和可扩展性,但欢迎您提供反馈。

新功能

  • 添加了 Gradle 属性 androidx.baselineprofile.suppressWarnings,以抑制所有基准配置文件警告。(314153a)
  • Microbench 指标现在在 Perfetto 轨迹中显示为计数器。(3214854)
  • 添加了用于停用 JIT(需要 root / 运行时重启)和重置设备性能/测试状态的实验性脚本。这些任务目前未发布为 Gradle 任务。(7c3732b)
  • 添加了基准测试参数,以便在模拟器上运行时跳过测试。启用 automaticGenerationDuring build 后,基准测试还会触发基准配置文件生成。如果使用模拟器,则会失败。使用新参数 skipBenchmarksOnEmulator,我们可以跳过测试。(0c2ddcd)
  • 将性能事件启用逻辑更改为在 API 23 及更高版本上运行 (2550048)

API 变更

  • MacrobenchmarkRule.measureRepeated() 的现有实验性 PerfettoConfig 参数移到了新的 ExperimentalConfig 对象。

bug 修复

  • 增加了 lockClocks.sh 重试次数 (99e9dac)
  • 请勿创建 nonMinified 和基准测试 build 类型(如果已存在)。由于存在一个 bug,即使 nonMinified 和基准 build 类型已存在,系统也会重新创建它们。(e75f0a5)
  • 忽略 TraceSectionMetric 结果中的非终止 slice。(a927d20)
  • 改进了模拟器检查,以考虑 sdk_ 前缀。(1587de8)
  • FrameTimingGfxInfoMetric 中将非运行软件包视为已清除。(35cc79c)
  • 修复了 androidx.benchmark.cpuEventCounter 为非指令事件生成损坏值的问题。(06edd59)
  • 修复了 resumeTiming/runWithTimingDisabled,以遵循指标优先级顺序,并显著减少了优先级较低的指标暂停/恢复对优先级较高的指标结果的影响。例如,如果通过 cpuEventCounter.enable 插桩参数使用 CPU 性能计数器,则在发生暂停/恢复时,timeNs 不再显著缩短。(5de0968)

版本 1.3

版本 1.3.3

2024 年 10 月 16 日

发布了 androidx.benchmark:benchmark-*:1.3.3。版本 1.3.3 包含这些提交内容

bug 修复

  • 修复了当 AVD 设备包含空格时 CollectBaselineProfileTask 出现的问题(Ia0225b/371642809

版本 1.3.2

2024 年 10 月 2 日

发布了 androidx.benchmark:benchmark-*:1.3.2。版本 1.3.2 包含这些提交内容

bug 修复

  • 修复了 Firebase Test Lab (FTL) 无法从基准配置文件 Gradle 插件中提取基准配置文件或 Macrobenchmark 结果文件的问题。(I2f678b/285187547

如需使用 FTL,请将该插件应用到插件块中的基准配置文件模块,具体方法为:

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

然后,使用以下命令配置 Firebase Test Lab:

  firebaseTestLab {

      // Credentials for FTL service
      serviceAccountCredentials.set(file("credentials.json"))

      // Creates one or more managed devices to run the tests on.
      managedDevices {
          "ftlDeviceShiba34" {
              device = "shiba"
              apiLevel = 34
          }
      }

      // Ensures the baseline profile is pulled from the device.
      // Note that this will be automated as well later with aosp/3272935.
      testOptions {
          results {
              directoriesToPull.addAll("/storage/emulated/0/Android/media/${android.namespace}")
          }
      }
  }

此外,还需要将创建的 FTL 设备添加到基准配置文件扩展程序:

  baselineProfile {
      managedDevices += "ftlDeviceShiba34"
      useConnectedDevices = false
  }

版本 1.3.1

2024 年 9 月 18 日

发布了 androidx.benchmark:benchmark-*:1.3.1。版本 1.3.1 包含这些提交内容

bug 修复

  • 添加了 Gradle 属性 androidx.baselineprofile.suppressWarnings 以抑制所有基准配置文件警告 (I7c36eb/349646646)
  • 修复了基准配置文件 Gradle 插件,使其在应用创建 nonMinified…benchmark… 时使用现有 nonMinified…benchmark…,而不是创建封装容器。(Ia8934b/361370179
  • 修复了在模拟器上启用 automaticGenerationDuringBuildjava.lang.AssertionError: ERRORS (not suppressed): EMULATOR 的问题。新参数用于跳过测试。(If3f51b/355515798
  • Microbenchmark 缩减 - 在基准库 proguard 中保留 org.junit.runner.notification.RunListener 的子类(Ic8ed5b/354264743
  • 修复了 TraceSectionMetric,以忽略非终止 slice。以前,这些广告会被视为时长为 -1,例如在求和或查找最短时长时。(If74b7)
  • 修复了 FrameTimingGfxInfoMetric 中如果进程尚未运行,启动指标会崩溃的问题。(I6e412)

版本 1.3.0

2024 年 8 月 21 日

发布了 androidx.benchmark:benchmark-*:1.3.0。版本 1.3.0 包含这些提交内容

自 1.2.0 以来的 Microbenchmark 变更

  • 在大多数设备上运行时,微基准测试中的方法跟踪功能默认处于开启状态
    • 方法跟踪会在测量后作为单独的阶段运行,这样一来,单次基准测试运行即可输出准确的测量结果和方法轨迹
    • 某些 Android OS 和 ART 版本上的方法跟踪会影响后续的衡量阶段 - 在这些版本中,方法跟踪默认处于关闭状态,并且会向 Studio 输出中输出警告
  • 主线程基准测试和 ANR
    • 为界面线程基准测试(例如与 Compose/View 界面交互的测试)添加了 measureRepeatedOnMainThread,以避免在运行数秒钟后出现 ANR。
    • 如果预计方法轨迹会超出 ANR 避免期限,则会跳过这些轨迹。将 androidx.benchmark.profiling.skipWhenDurationRisksAnr 设为 false 可停用此行为(不建议在 CI 运行时执行此操作,因为 ANR 可能会导致长时间 CI 运行出现问题)。
  • 缩减
    • 嵌入了 ProGuard 规则,以便在启用缩减功能时改进微基准测试
    • 库模块中的缩减大小/R8 需要 AGP 8.3,并且可以在 build.gradle 中通过 android.buildTypes.release.androidTest.enableMinification 启用
    • 添加了实验性 BlackHole.consume() API,以防止消除无效代码 (If6812b/286091643)
  • 指标
    • 实验性 CPU 事件计数器功能(来自 perf_event_open 的指标,在大多数平台版本上都需要 root 权限),通过 InstrumentationArgument androidx.benchmark.cpuEventCounter.enable 进行访问(可设置为 true),androidx.benchmark.cpuEventCounter.events 可设置为 (Instructions,CpuCycles)。某些 userdebug 模拟器应该支持此功能,但尚未在所有可用模拟器上测试过此功能的支持情况

自 1.2.0 以来的 MACRObenchmark 变更

  • 对 Macrobenchmark 的方法跟踪进行了全面改进。
    • 现在,方法轨迹的范围限定为 measureBlock 的持续时间,并且如果进程多次启动,则可以捕获多个会话。
    • 之前,方法跟踪仅适用于 StartupMode.COLD 基准测试,并且不会捕获未重启目标进程的 measureBlocks 的任何内容
    • 修复了 macrobenchmark 中的方法轨迹刷新问题,因此即使在速度较慢的设备上,方法轨迹也应能完全捕获且有效。(I6349ab/329904950
  • 在进程被终止时,在各个 warmUp 迭代期间正确转储 ART 配置文件,以便 CompilationMode.Partial(warmup=N) 测量结果更准确。(I17923)
  • 移除了着色器广播失败消息
    • 添加了有关丢弃着色器广播失败消息的调试建议
    • 添加了两个插桩参数,用于替换着色器丢弃行为,以解决在对不使用 ProfileInstaller 1.3 的应用进行基准测试时发生崩溃的问题:
      • androidx.benchmark.dropShaders.enable=true/false:可用于跳过所有着色器丢弃(包括在 StartupMode.Cold 启动时执行的丢弃),尤其是在对尚未使用 ProfileInstaller 1.3 的应用进行基准测试时
      • androidx.benchmark.dropShaders.throwOnFailure=true/false:可用于在尝试丢弃着色器时容忍失败,例如在没有 ProfileInstaller 1.3 (I4f573) 的情况下对应用进行基准测试时
  • 添加了实验性 MacrobenchmarkRule#measureRepeated 变体,用于采用自定义 PerfettoConfig 进行完全自定义的 Perfetto 轨迹记录。请注意,配置错误可能会导致内置 Metric 类失败。(Idfd3db/309841164b/304038384
  • 请先取消后台 dexopt 作业,然后再运行 Macrobenchmark,以减少干扰。(I989ed)
  • Macrobenchmark 现在会等待 1 秒,以便目标应用刷新 ART 配置文件(之前等待 500 毫秒)。(I85a50b/316082056
  • TraceSectionMetric 全面改进
    • 注意:以下 TraceSectionMetric 更改可能会影响 CI 使用中的输出,并可能会导致中断或破坏解析
    • 现在,默认值为“总和”,因为此指标的大多数用途都是针对重复事件,而“先”会在这些情况下舍弃数据
    • 更具自定义性,提供更多可用模式
    • 模式名称现在嵌入在指标输出名称中(在 Studio 和 JSON 中)
    • 现在支持使用 Trace.{begin|end}AsyncSection 创建的 Slice。
  • 指标
    • 电源 - 添加了 PowerMetric.deviceSupportsHighPrecisionTrackingPowerMetric.deviceBatteryHasMinimumCharge()PowerMetric.deviceSupportsPowerEnergy()
    • 已将 Metric.getResult 重命名为 getMeasurements,以匹配返回类型
    • 为所有启动检测失败添加了 log.w / exception 标签。这不会更改当前行为(因此某些错误会抛出,而其他错误会静默地检测不到启动),只是更易于理解。通常,如果应用 Log.w() 且未能报告启动指标,则表示应用缺少非帧事件,并且在检测到启动时会抛出异常(帧时间信息除外,来自界面/RT 切片)。(Id240fb/329145809
    • FrameTimingMetric 添加了 frameCount 测量,以便发现因产生的帧数发生变化而导致测量值发生变化的情况(添加了新动画,修复了失效问题)。(I1e5aa)
    • 阐明了在文档中可用时,frameOverrunMs 是跟踪的首选指标,以及原因。(I18749b/329478323
    • 修复了以下问题:轨迹开头和结尾处的未终止帧可能会配对在一起,这会错误地报告为单个超长帧。(I39353b/322232828
    • 改进了未生成帧时的 FrameTimingMetric 错误,并在指标解析失败时始终输出指向轨迹的链接,以协助诊断问题。(I956b9)
    • 修复了 FrameTimingMetric 无法解析帧 ID 时发生崩溃的问题,尤其是在某些 OEM 设备上。(Ia24bcb/303823815b/306235276
    • 放宽了 FrameMetrics 中的检查严格性,并在错误消息中添加了更多详细信息。(Iadede)

自 1.2.0 以来的基准配置文件捕获 / Gradle 插件变更

  • 将 AGP 的建议最大版本提高到了 9.0.0-alpha01。
  • 确保 mergeArtProfilemergeStartupProfile 任务始终等待基准配置文件生成。(I623d6b/343086054
  • 成功生成基准配置文件后,系统会输出更改内容摘要(I824c8b/269484510
  • 添加了用于停用警告的 DSL (Ic4debb/331237001)
  • 修复了问题,以确保在 automaticGenerationDuringBuild 处于关闭状态时,基准测试使用生成的基准配置文件(Ic144fb/333024280
  • 修复了 BaselineProfile Gradle 插件属性替换项,以便在自定义 nonMinified 或基准 build 类型时启用基准配置文件生成和基准测试。(Ib8f05b/324837887
  • 修复了在 AGP 8.3.0-alpha15 之前在 AAR 中添加库基准配置文件的问题。(I1d2afb/313992099
  • 修复了生成任务结束时基准配置文件和启动配置文件输出网址的问题。(I802e5b/313976958

自 1.2.0 以来的其他重大变更

  • 轨迹捕获
    • 将启动 Perfetto 时的 EXITCODE 2 错误从错误降级为已记录的警告
    • 默认在基准测试中启用 AIDL 跟踪(需要 API 28)(Ia0af2b/341852305
    • 默认在基准测试中启用 Porter 代码植入跟踪。例如,这会捕获唤醒锁跟踪点。(Icfe44b/286551983
    • 延长了轨迹捕获开始超时时间,以避免在速度较慢的设备上开始跟踪时发生崩溃(I98841b/329145808
    • 添加了具有 JSON、textproto 和 proto 二进制(未解码)变体的公共 API PerfettoTraceProcessor.Session.queryMetrics API。借助这些 API,您可以查询 TraceProcessor 中内置的指标 (I54d7fb/304038382)
    • 在 Perfetto 轨迹记录上启用阻塞开始,以降低跟踪记录开头缺少数据的风险。仅在 API 33 及更高版本上受支持。Ie6e41b/310760059
  • JSON 输出
    • 在 JSON 输出的基准测试上下文中添加了其他信息:
      • context.artMainlineVersion - Art Mainline 模块的整数版本(如果设备上存在,否则为 -1
      • context.build.id - 等于 android.os.Build.ID
      • context.build.version.codename - 等于 android.os.Build.VERSION.CODENAME
      • context.build.version.abbreviatedCodename - 对应于预发布代码名称(包括发布 build)的第一个字母 (Ie5020)
    • 向 JSON 输出添加了 profilerOutput 列表,以便更轻松地使用性能分析轨迹工具(例如 Perfetto、方法轨迹)(I05dddb/332604449)
    • 在基准测试模块中使用 Android Test Orchestrator 时添加了一条警告,因为这会导致每个模块的输出 JSON 文件被重复覆盖。(Ia1af6b/286899049
    • 当文件名长度超过 200 个字符时,抛出异常,以免在写入或后处理文件时发生不明确的崩溃。(I4a5ab)

版本 1.3.0-rc01

2024 年 8 月 7 日

发布了 androidx.benchmark:benchmark-*:1.3.0-rc01。版本 1.3.0-rc01 包含这些提交内容

bug 修复

  • 修复了 androidx.benchmark.cpuEventCounter 为非指令事件生成损坏值的问题(I7386ab/286306579
  • 修复了 resumeTiming/runWithTimingDisabled,以遵循指标优先级顺序,并显著减少了低优先级指标暂停/恢复对高优先级指标结果的影响。例如,如果通过 cpuEventCounter.enable 插桩参数使用 CPU 性能计数器,则在发生暂停/恢复时,timeNs 不再显著缩短。(I39c2eb/286306579b/307445225
  • 通过将堆栈采样转换从主线程移出,降低了堆栈采样导致 measureRepeatedOnMainThread 达到主线程硬超时几率。(I487a8b/342237318
  • 移除了手动说明对新平台 API 的访问权限,因为当将 R8 与 AGP 7.3 或更高版本(例如 R8 版本 3.3)搭配使用时,系统会通过 API 建模自动执行此操作;当使用 AGP 8.1 或更高版本(例如 D8 版本 8.1)时,系统会针对所有 build 自动执行此操作。建议不使用 AGP 的客户更新到 D8 8.1 或更高版本。如需了解详情,请参阅这篇文章。(I9496cb/345472586
  • 添加了 agp 版本检查,以便将软件包名称作为 instr 参数发送。在 AGP 8.4.0 之前,无法通过插桩参数将目标应用软件包名称发送到插桩应用。(0c72a3f)

版本 1.3.0-beta02

2024 年 7 月 10 日

发布了 androidx.benchmark:benchmark-*:1.3.0-beta02。版本 1.3.0-beta02 包含这些提交内容

bug 修复

  • 在启动 Perfetto 时妥善处理 EXITCODE 2 以记录警告,但继续操作。

版本 1.3.0-beta01

2024 年 6 月 12 日

发布了 androidx.benchmark:benchmark-*:1.3.0-beta01。版本 1.3.0-beta01 包含这些提交内容

API 变更

  • 为保持一致,将 MethodTracing.affectsMeasurementOnThisDevice 重命名为 AFFECTS_MEASUREMENT_ON_THIS_DEVICE。(I1bdfa)
  • 添加了实验性 BlackHole.consume() API,以防止在微基准测试中消除无用代码。(If6812b/286091643
  • Microbenchmark 现在会正确抛出,以防止方法跟踪干扰测量。在某些设备上,如果强制启用方法跟踪(通过插桩参数或 MicrobenchmarkConfig),并且在方法跟踪后尝试进行测量,就会发生这种情况。受影响的设备运行的是 API 26-30 或受此干扰影响的特定 ART Mainline 模块版本,并且可以在运行时通过 ProfilerConfig.MethodTracing.affectsMeasurementOnThisDevice 检测到。(Iafb92b/303660864

bug 修复

  • 将建议的最高 AGP 版本提升至 9.0.0-alpha01。(I5bbb0)
  • 向基准测试上下文添加了编译模式 (If5612b/325512900)
  • 默认启用 AIDL 跟踪(需要 API 28)(Ia0af2b/341852305
  • 在 JSON 输出的基准测试上下文中添加了其他信息:
    • context.artMainlineVersion - Art Mainline 模块的整数版本(如果设备上存在,否则为 -1)
    • context.build.id - 等于 android.os.Build.ID
    • context.build.version.codename - 等于 android.os.Build.VERSION.CODENAME
    • context.build.version.abbreviatedCodename - 对应于预发布代码名称的第一个字母(即使在发布 build 中也是如此)(Ie5020
  • 修复了 StackSampling,以遵循 androidx.benchmark.profiling.sampleDurationSeconds (Ib1d53)
  • 将宏->常规依赖项更改为 api(),以便更轻松地使用 PerfettoTracePerfettoConfig 等。(Icdae3b/341851833
  • 确保 mergeArtProfilemergeStartupProfile 任务始终等待基准配置文件生成。(I623d6b/343086054
  • 在决定是否启用变体时,请考虑变体的启用状态。(I5d19eb/343249144
  • 延长了 Perfetto 轨迹处理器的默认启动超时时间。(I87e8cb/329145808

版本 1.3.0-alpha05

2024 年 5 月 14 日

发布了 androidx.benchmark:benchmark-*:1.3.0-alpha05。版本 1.3.0-alpha05 包含这些提交内容

bug 修复

  • 当 macrobench 指标针对所有迭代返回零值时,抛出更清晰的异常 (Iab58fb/314931695)
  • 向 microbench ProGuard 规则添加了其他权宜解决方法规则,包括对监听器规则和其他观察到的警告 / 错误的支持。(I14d8fb/329126308b/339085669
  • 方法跟踪会在 Macrobenchmark 期间作为单独的阶段运行,并且不会再影响测量结果。(If9a50b/285912360b/336588271
  • 添加了额外的调试建议,以丢弃着色器广播失败消息。(I5efa6b/325502725

版本 1.3.0-alpha04

2024 年 5 月 1 日

发布了 androidx.benchmark:benchmark-*:1.3.0-alpha04。版本 1.3.0-alpha04 包含这些提交内容

API 变更

  • 添加了实验性 MacrobenchmarkRule#measureRepeated 变体,用于采用自定义 PerfettoConfig 进行完全自定义的 Perfetto 轨迹记录。请注意,配置错误可能会导致内置 Metric 类失败。(Idfd3db/309841164b/304038384
  • 为清楚起见,已将 PowerMetric.deviceSupportsPowerEnergy 重命名为 PowerMetric.deviceSupportsHighPrecisionTracking (I5b82f)
  • 添加了 PowerMetric.deviceBatteryHasMinimumCharge()PowerMetric.deviceSupportsPowerEnergy(),以便根据设备功耗测量功能更改或跳过基准测试。(I6a591b/322121218

bug 修复

  • 添加了与之前的基准配置文件进行比较的功能(I824c8b/269484510
  • 添加了用于停用警告的 DSL (Ic4debb/331237001)
  • 将基准测试变体停用时出现的异常更改为信息日志(I8a517b/332772491
  • 简化了捕获 Macrobenchmark 方法轨迹的操作,使其范围限定在实际 measureBlock() 的持续时间内。以前,它会在目标进程启动时启动,并且仅支持冷启动 (Iee85ab/300651094)
  • 避免在 Perfetto 轨迹处理器启动缓慢时发生崩溃(I98841b/329145808

版本 1.3.0-alpha03

2024 年 4 月 17 日

发布了 androidx.benchmark:benchmark-*:1.3.0-alpha03。版本 1.3.0-alpha03 包含这些提交内容

新功能

  • 添加了具有 JSON、textproto 和 proto 二进制(未解码)变体的公共 API PerfettoTraceProcessor.Session.queryMetrics API。借助这些 API,您可以查询 TraceProcessor 中内置的指标 (I54d7fb/304038382)
  • 向 JSON 输出添加了 profilerOutput,以便更轻松地使用性能分析轨迹工具(例如 perfetto、方法轨迹)。(I05dddb/332604449
  • 向基准测试 Perfetto 配置添加了功耗标记。例如,这会捕获唤醒锁跟踪点。(Icfe44b/286551983
  • 添加了 inst 参数 androidx.benchmark.profiling.skipWhenDurationRisksAnr,可将其设置为 false,以避免在预期时长可能会导致 ANR 时跳过方法轨迹 - 强烈建议在 CI 运行中避免出现这种情况。
  • 添加了实验性 inst 参数 androidx.benchmark.profiling.perfCompare.enable,将其设置为 true 可在衡量和性能分析阶段之间运行比较时间。例如,在评估方法跟踪开销时非常有用。(I61fb4b/329146942

API 变更

  • TraceSectionMetric.Mode 更改为密封类,以便在不破坏穷举 when 语句的情况下实现未来扩展 (I71f7b)
  • 添加了 TraceSectionMetric.Mode.Average.Count,并重新排列了参数,以便更常用的参数(模式)在参数列表中靠前,从而减少了指定参数名称的需要。(Ibf0b0b/315830077b/322167531
  • Metric.getResult 重命名为 getMeasurements,以匹配返回类型 (I42595)

bug 修复

  • 修复了问题,以确保在 automaticGenerationDuringBuild 处于关闭状态时,基准测试使用生成的基准配置文件(Ic144fb/333024280
  • 修复了 BaselineProfile Gradle 插件属性替换项,以便在自定义 nonMinified 或基准 build 类型时启用基准配置文件生成和基准测试。(Ib8f05b/324837887
  • 修复了 macrobenchmark 中的方法轨迹刷新问题,因此即使在速度较慢的设备上,方法轨迹也应能完全捕获且有效。(I6349ab/329904950
  • 在 Perfetto 轨迹记录上启用阻塞开始,以降低跟踪记录开头缺少数据的风险。仅在 API 33 及更高版本上受支持。Ie6e41b/310760059
  • 在基准测试模块中使用 Android Test Orchestrator 时添加了一条警告,因为这会导致每个模块的输出 JSON 文件被重复覆盖。(Ia1af6b/286899049
  • 强制使用英文逗号 (,) 作为千位分隔符,以便在 Studio 输出中保持一致性,同时忽略设备语言区域 (I3e921b/313496656)
  • TraceSectionMetric 现在支持使用 Trace.{begin|end}AsyncSection 创建的 slice。(I91b32b/300434906
  • 为所有启动检测失败添加了 log.w / exception 标签。这不会更改当前行为(因此某些错误会抛出,而其他错误会静默地检测不到启动),只是更易于理解。通常,如果应用 Log.w() 且未能报告启动指标,则表示应用缺少非帧事件,并且在检测到启动时会抛出异常(帧时间信息除外,来自界面/RT 切片)。(Id240fb/329145809
  • 请先取消后台 dexopt 作业,然后再运行 Macrobenchmark,以减少干扰。(I989ed)
  • FrameTimingMetric 添加了 frameCount 测量,以便发现因产生的帧数发生变化而导致测量值发生变化的情况(添加了新动画,修复了失效问题)。(I1e5aa)
  • 阐明了在文档中可用时,frameOverrunMs 是跟踪的首选指标,以及原因。(I18749b/329478323

版本 1.3.0-alpha02

2024 年 3 月 20 日

发布了 androidx.benchmark:benchmark-*:1.3.0-alpha02。版本 1.3.0-alpha02 包含这些提交内容

新功能

  • 通过嵌入的 ProGuard 规则在 microbench 中提供实验性 R8 支持。请注意,此支持目前处于实验阶段,需要 AGP 8.3 才能缩减库模块测试。使用以下代码在基准模块的 build.gradle 中启用 R8 缩减/优化,这应该会显著提升性能,具体取决于工作负载。(I738a3b/184378053

    android {
        buildTypes.release.androidTest.enableMinification = true
    }
    

bug 修复

  • 修复了方法跟踪警告与 microbench 输出位于同一行的问题。(I0455cb/328308833

版本 1.3.0-alpha01

2024 年 2 月 21 日

发布了 androidx.benchmark:benchmark-*:1.3.0-alpha01版本 1.3.0-alpha01 中包含这些提交内容

API 变更

  • 重命名了 MicrobenchmarkConfig 布尔值参数,以避免使用不必要的字词“应”(Ia8f00b/303387299
  • 添加了 BenchmarkRule.measureRepeatedOnMainThread,以便主线程基准测试(例如涉及 View 或 Compose 界面的基准测试)可以避免触发 ANR,尤其是在 CI 中的大型套件期间。(I5c86d)
  • 添加了 FrameTimingGfxInfoMetric,这是 FrameTimingMetric 的实验性替代实现,测量结果直接来自平台,而不是从 Perfetto 轨迹中提取。(I457cbb/322232828
  • 添加了在各个 warmUp 迭代期间转储 ART 配置文件的功能。(I17923)
  • TraceSectionMetric API 进行了多项更改:
    • 添加了 Mode.MinMode.Max
    • 添加了标签参数,以将部分名称替换为指标标签
    • 向输出添加了模式名称,以阐明指标含义
    • 将默认值更改为“总和”,因为此指标的大多数用途都是针对重复事件。请注意 CI 使用方式的这种变化,因为这可能会导致数据中断或破坏解析。(Ic1e82b/301892382b/301955938

bug 修复

  • 改进了基准配置文件 Gradle 插件中在指定的受管设备不存在时显示的错误消息 (Idea2bb/313803289)
  • 修复了在 AGP 8.3.0-alpha15 之前在 AAR 中添加库基准配置文件的问题(I1d2afb/313992099
  • 修复了生成任务结束时的基准配置文件和启动配置文件输出网址(I802e5b/313976958
  • 调整了数据源超时设置,以尝试修复 java.lang.IllegalStateException: Failed to stop [ProcessPid(processName=perfetto, pid=...)]I8dc7db/323601788
  • 添加了两个插桩参数,用于替换着色器丢弃行为,以解决在对不使用 ProfileInstaller 1.3 的应用进行基准测试时发生崩溃的问题:
    • androidx.benchmark.dropShaders.enable=true/false:可用于跳过所有着色器丢弃(包括在 StartupMode.Cold 启动时执行的丢弃),尤其是在对尚未使用 ProfileInstaller 1.3 的应用进行基准测试时
    • androidx.benchmark.dropShaders.throwOnFailure=true/false:可用于在尝试丢弃着色器时容忍失败,例如在没有 ProfileInstaller 1.3 (I4f573) 的情况下对应用进行基准测试时
  • 当预计需要超过几秒钟时,跳过界面线程上的轨迹跟踪,并在抛出时清理轨迹。(I6e768)
  • 当文件名长度超过 200 个字符时,抛出异常,以免在写入或后处理文件时发生不明确的崩溃。(I4a5ab)
  • 修复了以下问题:轨迹开头和结尾处的未终止帧可能会配对在一起,这会错误地报告为单个超长帧。(I39353b/322232828
  • 在 API 30-33 上重新安装软件包时,请在 API 30 及更高版本上使用 --skip verification 来清除用户 build 中的 ART 配置文件。这有助于绕过导致某类设备出现故障的 Play 保护机制警告。(Ic9e36)
  • 当应用不是系统应用(例如系统界面或启动器)时,请使用 am force-stop 终止应用。(I5e028)
  • Macrobenchmark 现在会等待 1 second,以便目标应用刷新 ART 配置文件(之前它会等待 500 ms)。(I85a50b/316082056
  • 改进了未生成帧时的 FrameTimingMetric 错误,并在指标解析失败时始终输出指向轨迹的链接,以协助诊断问题。(I956b9)
  • 修复了 FrameTimingMetric 在解析帧 ID 时失败而导致崩溃的问题,尤其是在某些 OEM 设备上。(Ia24bcb/303823815b/306235276
  • 放宽了 FrameMetrics 中的检查严格性,并在错误消息中添加了更多详细信息。(Iadede)

版本 1.2

版本 1.2.4

2024 年 4 月 17 日

发布了 androidx.benchmark:benchmark-*:1.2.4。版本 1.2.4 包含这些提交内容

bug 修复

  • 修复了基准配置文件 srcset 未在基准变体中设置的问题。此外,还修复了库中导致循环依赖项的 automaticGenerationDuringBuild。(I28ab7b/333024280
  • 当应用不是系统应用(例如系统界面或启动器)时,请使用 am force-stop 终止应用。这修复了由于进程终止未完全成功而导致 StartupMode.COLD 基准测试因“软件包 $package 不得在冷启动之前运行!”而崩溃的问题。(I5e028)

版本 1.2.3

2024 年 1 月 24 日

发布了 androidx.benchmark:benchmark-*:1.2.3版本 1.2.3 中包含这些提交内容

bug 修复

  • 从基准配置文件 Gradle 插件中移除了 AGP 版本为 8.3.0 或更高版本时的异常。
  • 修复了在 AGP 8.3.0-alpha15 之前在 AAR 中添加库基准配置文件的问题。

版本 1.2.2

2023 年 12 月 1 日

发布了 androidx.benchmark:benchmark-*:1.2.2版本 1.2.2 中包含这些提交内容

基准配置文件

版本 1.2.1

2023 年 11 月 15 日

发布了 androidx.benchmark:benchmark-*:1.2.1版本 1.2.1 中包含这些提交内容

新功能

版本 1.2.0

2023 年 10 月 18 日

发布了 androidx.benchmark:benchmark-*:1.2.0版本 1.2.0 中包含这些提交内容

自 1.1.0 以来的重要变更

基准配置文件

  • 新的基准配置文件 Gradle 插件可自动捕获基准配置文件并将其添加到测试和构建工作流中。
  • BaselineProfileRule.collect 现已稳定,是之前实验性 BaselineProfileRule.collectBaselineProfile API 的精简版
    • 只需指定 packageName,即可驱动您的应用
  • 对于生成基准配置文件的库,您现在可以在代码(BaselineProfileRule.collect 参数)中过滤生成的规则,也可以在 Gradle 插件中更简单地过滤这些规则
  • 修复了以下问题
    • 修复了 Android U+ 上基准配置文件收集的问题(Id1392b/277645214

Macrobenchmark

  • 编译
    • Macrobenchmark 现在会正确地完全重置每次编译的编译状态 - 这需要在 Android 14 之前重新安装 APK,因此如果您希望在被测内容中保留状态(例如用户登录),强烈建议您在 Android 14 及更高版本上进行基准测试。
    • 您还可以通过单独控制应用编译并使用 CompilationMode.Ignore()插桩参数跳过编译来解决此问题
  • 插桩参数

    • 支持 androidx.benchmark.dryRunMode.enable 插桩参数(已在 Microbenchmark 中提供),以加快验证运行速度(例如在创建基准测试时或在提交前测试中)
    • 支持 androidx.benchmark.profiling.mode=StackSamplingMethodTracing
    • 添加了 androidx.benchmark.enabledRules,以允许运行时过滤基准配置文件与 Macrobenchmark 规则测试
    • 添加了 androidx.benchmark.perfettoSdkTracing.enable 参数,以便使用 tracing-perfetto 启用跟踪,例如 Compose 重组跟踪。请注意,与 StartupMode.COLD 搭配使用时,由于跟踪库会在应用启动期间加载和启用,因此时间会受到严重影响。
  • 要求

    • Macrobenchmark 现在要求目标应用中安装 ProfileInstaller 1.3.0 或更高版本,才能启用配置文件捕获 / 重置和着色器缓存清除功能。
  • 新的实验性 Metric API

  • 修复

    • 修复了在从多个 APK(例如从 app bundle)安装的应用中安装或提取配置文件时发生崩溃的问题。
    • 修复了 FrameTimingMetric 会忽略帧 ID 不一致的帧(通常是 API 31 及更高版本上涟漪期间的帧)的问题(I747d2b/279088460
    • 修复了对大于 64MB 的轨迹进行解析时出现的错误 (Ief831b/269949822)
    • 阐明了设备(尤其是模拟器)操作系统映像未正确配置为跟踪或编译时出现的错误
    • 针对无电池设备(微型设备和宏观设备)跳过电池电量检查
    • 改进了文件输出,针对无效输出目录的错误更清晰,默认值更安全
    • 通过一致地丢弃着色器缓存(也通过 MacrobenchmarkScope.dropShaderCache 公开),提高了 StartupMode.COLD 的稳定性
    • 修复了 startActivityAndWait 的 Leanback 回退。

Microbenchmark

  • 功能
    • 性能分析已移至单独的阶段(在其他指标之后),因此一次测试运行可以同时显示准确的时间性能分析结果。
  • 实验性 API
    • 添加了实验性 MicrobenchmarkConfig API,用于定义自定义指标以及配置跟踪和性能分析。可用于捕获方法轨迹或捕获轨迹点(但请注意跟踪开销)。
    • 添加了实验性 API,用于在不使用 JUnit 的情况下将 BenchmarkStateBenchmarkRule 分开控制
    • 添加了实验性 PerfettoTrace 记录,以便在基准测试 API 之外使用自定义配置捕获 Perfetto 轨迹。
  • 修复了以下问题
    • 解决了 Android Studio 基准测试输出中缺少前导空格的问题。
    • 修复了警告可能无法在 Android Studio 基准测试输出中输出的问题。
    • 修复了 Android 13(API 33)及更高版本中的 SampledProfiling 崩溃问题。
    • 通过跳过 IsolationActivity 和 Perfetto 跟踪,大幅提升了 dryRunMode 的性能(在旧版操作系统上,试运行模式的速度最高可提高 10 倍)。

版本 1.2.0-rc02

2023 年 10 月 6 日

发布了 androidx.benchmark:benchmark-*:1.2.0-rc02版本 1.2.0-rc02 中包含这些提交内容

bug 修复

  • 修复了基准文件输出,使其不再破坏 BaselineProfile 插件文件复制。系统已生成文件并将其复制到设备上,但已重命名,因此 Gradle 插件无法看到这些文件。(I8dbccb/303034735b/296453339
  • 阐明了从 macrobenchmark 模块注入目标应用时的 tracing-perfetto 加载错误消息。

版本 1.2.0-rc01

2023 年 9 月 20 日

发布了 androidx.benchmark:benchmark-*:1.2.0-rc01版本 1.2.0-rc01 中包含这些提交内容

bug 修复

  • 现在,如果 Perfetto SDK 跟踪在基准测试中未能成功初始化,系统会抛出异常(并附带补救说明)。(I6c878b/286228781
  • 修复了在将 ART 方法轨迹转换为 Perfetto 格式时发生的 OOM 崩溃问题。(I106bdb/296905344
  • (Macrobenchmark) 在 Studio 测试输出中添加链接时阐明了方法跟踪标签,并将方法跟踪文件名固定为在设备/主机上保持唯一性,以便在运行多个基准测试时不会被覆盖。(I08e65b/285912360
  • 确保在捕获基准配置文件时设备处于唤醒状态。(I503fc)

版本 1.2.0-beta05

2023 年 8 月 30 日

发布了 androidx.benchmark:benchmark-*:1.2.0-beta05版本 1.2.0-beta05 中包含这些提交内容。

新功能

  • 基准配置文件 Gradle 插件现在支持 Android Gradle 插件 8.3。(aosp/2715214)

版本 1.2.0-beta04

2023 年 8 月 23 日

发布了 androidx.benchmark:benchmark-*:1.2.0-beta04版本 1.2.0-beta04 中包含这些提交内容。

新功能

  • 基准配置文件 Gradle 插件现在支持 Android Gradle 插件 8.3。(aosp/2715214)

bug 修复

  • 通过进一步清理输出文件名称,避免输出文件名称中出现“=”和“:”,修复了写入/移动和拉取文件(尤其是参数化测试产生的文件)失败的问题。(I759d8)

版本 1.2.0-beta03

2023 年 8 月 9 日

发布了 androidx.benchmark:benchmark-*:1.2.0-beta03版本 1.2.0-beta03 中包含这些提交内容

API 变更

  • 添加了参数,以将 TraceSectionMetric 过滤为仅包含目标软件包,此参数默认处于启用状态(Ia219bb/292208786

bug 修复

  • fullTracing.enable 插桩参数重命名为了 perfettoSdkTracing.enable,以与工件名称和其他引用保持一致。fullTracing.enable 将继续作为后备参数运行。(I7cc00)
  • Benchmark 库内部跟踪点(包括微基准循环/阶段跟踪)现在将显示在 Studio 系统轨迹查看器中,并嵌套在 Perfetto 中的正确进程下。(I6b2e7b/293510459
  • 移除了 API 31+ 上的宏基准 NOT-PROFILEABLE 错误,并在运行 eng/userdebug 且已取得 root 权限的设备上跳过可分析检查。(I2abacb/291722507
  • 在使用 Dex 布局优化时,启动配置文件规则现在也被视为基线配置文件规则。(aosp/2684246b/293889189

版本 1.2.0-beta02

2023 年 7 月 26 日

发布了 androidx.benchmark:benchmark-*:1.2.0-beta02版本 1.2.0-beta02 中包含这些提交内容

API 变更

  • 添加了用于微基准自定义指标和配置(例如性能分析器和跟踪)的实验性 API。(I86101b/291820856

bug 修复

  • 当操作系统的跟踪配置错误时在宏基准中报告错误,正如最近在 API 26/28 ARM64 模拟器中修复的问题一样。(I0a328b/282191686
  • 为编译重置失败添加了详细信息,建议用户更新模拟器,因为某些模拟器最近修复了此问题。(I8c815b/282191686
  • 使 androidx.test.uiautomator:uiautomator:2.2.0 成为 api,而不是 implementation 依赖项。(I1981e)

版本 1.2.0-beta01

2023 年 7 月 18 日

发布了 androidx.benchmark:benchmark-*:1.2.0-beta01版本 1.2.0-beta01 中包含这些提交内容

bug 修复

  • 修复了 Studio 中的 Benchmark 输出有时会抑制警告的问题,并解决了 Studio 中不显示 Benchmark 输出的前导空格的问题。(Ia61d0b/227205461b/286306579b/285912360
  • 修正了 FrameTimingMetric 的注释。子指标的名称为 frameDurationCpuMs。(Ib097fb/288830934)。

版本 1.2.0-alpha16

2023 年 6 月 21 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha16版本 1.2.0-alpha16 中包含这些提交内容。

API 变更

  • BaselineProfileRule.collectBaselineProfile() API 重命名为了 BaselineProfileRule.collect()。(I4b665)

bug 修复

  • Macrobenchmark 支持 androidx.benchmark.profiling.mode = MethodTracing。(I7ad37b/285912360
  • Microbenchmark 性能分析已移至单独的阶段,因此会在测量后按顺序发生,而不是取代测量。MethodTracing 轨迹部分现在也包含在捕获的 Perfetto 轨迹中(如果有)。(I9f657b/285014599
  • 通过 Mode.SumTraceSectionMetric 添加了数量测量功能。(Ic121ab/264398606

版本 1.2.0-alpha15

2023 年 6 月 7 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha15版本 1.2.0-alpha15 中包含这些提交内容。

新功能

  • 添加了实验性 MemoryUsageMetric,用于跟踪目标应用的内存使用情况。(I56453b/133147125b/281749311
  • 通过 PerfettoTrace.record 添加了对完全自定义 Perfetto 配置的支持(If9d75b/280460183
  • 添加了用于跳过基准配置文件生成的属性。使用方法:./gradlew assemble -Pandroidx.baselineprofile.skipgeneration。(I37fdab/283447020

API 变更

  • collectBaselineProfile API 始终会生成稳定的基准配置文件。collectStableBaselineProfile API 已被移除,应改为使用 collectBaselineProfile。(I17262b/281078707
  • BaselineProfileRulefilterPredicate 参数改成了非 null 参数,并设置了等效的默认值,以使文档中的默认过滤器行为更加清晰。(I3816e)

bug 修复

  • dryRunMode 中禁用了 IsolationActivity 和 Perfetto 跟踪,以大幅提高性能,因为这些占据了大部分的运行时。(Ie4f7d)
  • 支持使用插桩测试参数 androidx.benchmark.profiling.mode=StackSamplingandroidx.benchmark.profiling.sampleFrequency 在 Macrobenchmark 中进行调用堆栈采样。(I1d13bb/282188489
  • 修复了在 Android U (API 34) 及模拟器上丢弃着色器时崩溃的问题。(I031cab/274314544

版本 1.2.0-alpha14

2023 年 5 月 3 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha14版本 1.2.0-alpha14 中包含这些提交内容。

bug 修复

  • 修复了 FrameTimingMetric 在帧 ID 不一致时会忽略这些帧的问题。这个问题会导致最新平台版本 (API 31+) 上的一些动画在 RenderThread 进行动画处理时(例如在呈现涟漪效果期间)会忽略许多帧。(I747d2b/279088460
  • 修复了轨迹处理器解析大于 64Mb 的轨迹的问题。(Ief831b/269949822
  • 修复了由于 pm dump-profiles 命令输出不同而导致 Android U 上的基准配置文件生成失败的问题。(Id1392b/277645214
  • 修复了 GPU 时钟锁定脚本,以正确比较字符串。(I53e54b/213935715

版本 1.2.0-alpha13

2023 年 4 月 5 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha13版本 1.2.0-alpha13 中包含这些提交内容

API 变更

  • 添加了生成基准配置文件时使用的配置文件类型参数,以支持即将推出的启动配置文件功能(Ie20d7b/275093123
  • 添加了新的实验性 TraceMetric API,用于根据 Perfetto 轨迹的内容定义完全自定义指标。(I4ce31b/219851406
  • 添加了一个实验性指标,用以确定基准运行期间的页面故障数。(I48db0)

版本 1.2.0-alpha12

2023 年 3 月 22 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha12版本 1.2.0-alpha12 中包含这些提交内容。

新功能

  • 新的基准配置文件 Gradle 插件已发布 Alpha 版,简化了基准配置文件的生成,还能简化开发者工作流程。

API 变更

  • 移除了 API 21 和 22 上的 Perfetto 跟踪支持,其中包括 Microbenchmark 和实验性 PerfettoTrace API。在此版本之前,UiAutomation 连接在部分设备上不可靠。(I78e8c)
  • 针对 PerfettoTraceProcessor 添加了公共实验性 API,以启用轨迹内容解析。这朝着基于 Perfetto 轨迹数据的完全自定义指标迈进了一步。(I2659eb/219851406

版本 1.2.0-alpha11

2023 年 3 月 8 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha11版本 1.2.0-alpha11 中包含这些提交内容

bug 修复

  • 修复了在具有多个 APK 的 app bundle 中重新安装配置文件或从中提取配置文件时 MacrobenchmarkRuleBaselineProfileRule 中出现崩溃的问题。(I0d8c8b/270587281

版本 1.2.0-alpha10

2023 年 2 月 22 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha10版本 1.2.0-alpha10 中包含这些提交内容

新功能

  • 在 Android 14 及更高版本中,得益于新的平台功能,Macrobenchmark 不再重新安装目标应用来重置编译状态。以前,在每次运行基准测试之前,都必须有一个已取得 root 权限的设备,或者处理被删除的所有应用状态(例如用户登录)。(I9b08cb/249143766

bug 修复

  • 修复了 DryRunMode,使其不再因编译跳过而崩溃并出现空配置文件,而是会运行一次迭代并提取该配置文件,确保捕获到某些内容。(I2f05db/266403227
  • 修复了在旧 API 级别上检查是否存在 Powerstats 时出现的 PowerMetric 崩溃问题。(5faaf9b/268253898

版本 1.2.0-alpha09

2023 年 1 月 11 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha09版本 1.2.0-alpha09 中包含这些提交内容

bug 修复

  • 允许将 None 传递给 androidx.benchmark.enabledRules 插桩,以停止生成所有基准/基准配置文件。(I3d7fdb/258671856
  • 修复了应用模块(即,非自插桩测试 APK)中的 PerfettoTrace 捕获问题 (I12cfc)
  • 修复了 Studio 输出中的基准配置文件 adb 拉取参数的顺序(I958d1b/261781624
  • 现在,当您尝试运行 Macrobenchmark 时,Arm 模拟器 API 33 能被正确识别,并可正确输出警告。(69133bb/262209591
  • 在 Macrobenchmark 测试中跳过无电池设备的电池电量检查(fe4114b/232448937

版本 1.2.0-alpha08

2022 年 12 月 7 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha08版本 1.2.0-alpha08 中包含这些提交内容

API 变更

  • 在测试中添加了新的实验性 API PerfettoTrace.record {}PerfettoTraceRule,用于捕获 Perfetto 轨迹(也称为系统轨迹),以检查测试行为和性能。(I3ba16)
  • BaselineProfileRule 现在接受过滤器谓词,而不是软件包前缀列表。这样一来,测试将完全控制过滤。(I93240)
  • 添加了一个实验性 API BaselineProfileRule.collectStableBaselineProfile,该 API 会等待基准配置文件可稳定地用于 N 次迭代。(I923f3)
  • 添加了使用 BaselineProfileRule 生成基准配置文件时指定输出文件名前缀的功能。(I7b59fb/260318655

bug 修复

  • 提高了文件输出写入的安全性,这应该可以防止输出文件无法被静默地写入/附加,尤其是在 API 21/22 上。(If8c44b/227510293
  • 修复了 simpleperf 跟踪输出以正确创建并放置文件。这应该还可以更全面地解决 Gradle 无法成功拉取文件的问题。(I12a1cb/259424099
  • 改进了 profileinstaller 版本过旧时输出的 profileinstaller 错误消息。现在,此 API 会提醒您更新 profileinstaller 版本 (1.2.1) 以衡量 API 31 到 33 上的基准配置文件,而不是指明它不受支持。(Ia517fb/253519888
  • 修复了错误消息“Print 需要使用 API <=23”中的多个 shell 命令失败的问题,包括失败的 perfetto 捕获二进制文件设置和失败的轨迹捕获(Ib6b87b/258863685
  • 自动将生成的配置文件规则排序以尽可能减少随时间推移的变更次数(在将配置文件规则签入源代码控制系统时)。(Ie2509)
  • 修复了在 Android 13 (API 33) 之下未取得 root 权限的 build 上触发 Expected no stderr from echo 3 > /proc/sys/vm/drop_caches 消息时出现的崩溃问题(I6c245b/259508183

已知问题 - 由于 profileinstaller 清单中缺少广播注册表(尚未发布),MacrobenchmarkScope.dropShaderCache() 可能会崩溃。(I5c728b/258619948)如需解决 profileinstaller:1.3.0-alpha02 中的问题,请将以下内容添加到您的应用的(而非基准的)AndroidManifest.xml 中:

  <!-- workaround bug in profileinstaller 1.3.0-alpha02, remove when updating to alpha03+ -->
  <receiver
    android:name="androidx.profileinstaller.ProfileInstallReceiver"
    android:permission="android.permission.DUMP"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.profileinstaller.action.BENCHMARK_OPERATION" />
    </intent-filter>
  </receiver>

版本 1.2.0-alpha07

2022 年 11 月 9 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha07版本 1.2.0-alpha07 中包含这些提交内容

API 变更

  • 添加了 PowerMetric API,用于测量 Macrobenchmark 中的能耗和功耗。(Ife601b/220183779
  • 修复了 MacrobenchmarkScope.dropShaderCache(),以实际丢弃着色器缓存。这会从 StartupMode.COLD 基准中移除大约 20 毫秒的噪声,因为着色器现在每次迭代时都会一直被清除。之前,使用预热迭代的 Partial 编译会误报快速数字,因为在预热期间发生着色器缓存的可能性更大。此修复程序需要已取得 root 权限的设备或者在目标应用中使用 profileinstaller:1.3.0-alpha02。如需了解 ProfileInstaller 库的 API 变更,请参阅 ProfileInstaller 1.30-alpha02 页面。(Ia5171b/231455742
  • 添加了 TraceSectionMode("label", Mode.Sum),允许测量在具有相同标签的多个轨迹部分所花的总时间。例如,TraceSectionMetric("inflate", Mode.Sum) 会在 Macrobenchmark 测试的总膨胀时间中报告指标 inflateMs。还移除了 API 29 要求,因为 TraceSectionMetric 可与目标 API 级别较低的 androidx.tracing.Trace 搭配使用,并在目标应用中使用 forceEnableAppTracing。(Id7b68b/231455742

bug 修复

  • 通过验证所有输出/错误,提高了所有内部 shell 命令的安全性。(I5984db/255402908b/253094958
  • 在基准配置文件 adb pull 命令中指定设备,以便能在连接了多个设备(最多一个模拟器)时直接复制拉取命令(I6ac6cb/223359380
  • 针对 Macrobenchmark 测试 APK 未设置为自插桩的情形添加了错误消息。此错误消息会阻止在目标应用的进程内进行 Macrobenchmark 测试。在此过程中,宏基准将无法编译/终止/冷启动应用,也无法控制其自身权限 (I4279b)
  • 修复了 measureRepeated()StartupMode.COLD 无法在 setupBlock 后终止目标进程的问题。现在,setupBlock 与应用交互将不会使应用进程保持运行,也不会导致冷启动测量无效。(I8ebb7)

版本 1.2.0-alpha06

2022 年 10 月 24 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha06版本 1.2.0-alpha06 中包含这些提交内容

API 变更

  • 在 Android 13 (API 33) 中,BaselineProfileRule 不再需要 root 权限,并且不再处于实验阶段。(Ie0a7db/250083467b/253094958
    • 这项变更还修复了在未获 root 权限的设备上如何将应用的配置文件刷入磁盘的问题,但需要更新目标应用的 profileinstaller 依赖项。
    • 如需在未取得 root 权限的设备上使用 BaselineProfileRuleCompilationMode.Partial(warmupIterations),您还必须将目标应用更新为使用 androidx.profileinstaller.profileinstaller:1.3.0-alpha01。这样可以正确地将配置文件刷入磁盘,以便进行编译/提取。

bug 修复

  • 修复了 API 33 及更高版本上的 SampledProfiling 崩溃问题。(I40743b/236109374

版本 1.2.0-alpha05

2022 年 10 月 5 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha05版本 1.2.0-alpha05 中包含这些提交内容

bug 修复

  • 修复了 Studio 系统轨迹查看器中针对基准捕获的轨迹的帧细分(I3f3aeb/239677443
  • 更正了 FrameTimingMetric,将 FrameOverrun 列为需要 API 31 而不是 29(I716ddb/220702554
  • BaselineProfileRule 中设置了迭代,并在未安装目标软件包时明确抛出(已针对 MacrobenchmarkRule 完成这一设置)。(Ic09a3b/227991471

版本 1.2.0-alpha04

2022 年 9 月 21 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha04版本 1.2.0-alpha04 中包含这些提交内容

新功能

  • 在 Macrobenchmark 中添加了对 dryRunMode.enable 插桩参数的支持(已在 Microbenchmark 中提供),以加快本地开发和验证应用自动化(例如在提交前测试中)。这会将迭代计数替换为 1,跳过编译,抑制所有配置错误,并停用 .json 文件输出衡量。(Ib51b4b/175149857

    在 Gradle 命令行中:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.dryRunMode.enable=true
    

    在 build.gradle 中:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.dryRunMode.enable', 'true'
        }
    }
    

bug 修复

  • 修复了 StartupTimingMetric,使其不再需要通过 MacrobenchmarkScope.startActivityAndWait() 启动测量的 activity。这意味着,该指标可以从通知、Context.startActivity()、基于应用内 activity 的导航或 shell 命令等中选取启动模式。(Ia2de6b/245414235
  • 通过降低帧检测的严格程度修复了以下 bug:尝试等待在模拟器上完成启动时,startActivityAndWait 会发生超时。(Ibe2c6b/244594339b/228946895

版本 1.2.0-alpha03

2022 年 9 月 7 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha03版本 1.2.0-alpha03 中包含这些提交内容

新功能

  • 添加了用于将 BenchmarkStateBenchmarkRule / JUnit4 分开使用的实验性 API。(Id478fb/228489614

bug 修复

版本 1.2.0-alpha02

2022 年 8 月 24 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha02版本 1.2.0-alpha02 中包含这些提交内容

API 变更

  • MacrobenchmarkScope.killProcess() 默认为 am force stop,即使已取得 root 权限也不例外,但生成基准配置文件期间除外。可使用可选的布尔值参数将其替换。(02cce9b/241214097

bug 修复

  • 支持为系统应用生成基准配置文件。(I900b8b/241214097
  • 支持在未取得 root 权限的设备上检查 ODPM 功耗指标。(a38c78b/229623230

版本 1.2.0-alpha01

2022 年 7 月 27 日

发布了 androidx.benchmark:benchmark-*:1.2.0-alpha01版本 1.2.0-alpha01 中包含这些提交内容

新功能

  • 新增了 tracing-perfetto-common 组件,让工具可在会显示 Perfetto SDK 跟踪记录的应用中启用 Perfetto SDK 跟踪功能 (I2cc7f)
  • 添加了 androidx.benchmark.enabledRules 插桩参数,以允许过滤仅针对基准运行 MacroBenchmark 的情况,或过滤仅针对生成基准配置文件运行 MacroBenchmark 的情况。传入“Macrobenchmark”或“BaselineProfile”即可仅运行一种类型的测试,例如在模拟器上生成 BaselineProfiles 时。您也可以使用逗号分隔列表。(I756b7b/230371561

    例如,在 Macrobenchmark 的 build.gradle 中:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.enabledRules', 'BaselineProfile'
        }
    }
    

    或者在 Gradle 命令行中:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
    

API 变更

  • 添加了新的 PowerMetric,用于测量基准测试中的能耗和功耗任务。(I9f39bb/220183779
  • 添加了新的编译模式 CompilationMode.Ignore,用于跳过配置文件重置和编译。(Ibbcf8b/230453509
  • BaselineProfileRule#collectBaselineProfile 添加了一个新参数,以按软件包名称过滤输出文件(If7338b/220146561
  • 让开发者能够对设备进行放电以测量功耗。(I6a6cb)
  • MacrobenchmarkScope 中添加了清除着色器缓存的功能。(I32122)
  • 让开发者能够配置指标类型的显示并详细显示预期的子系统类别。(I810c9)
  • 以前,只要在不受支持的设备上运行,基准中就会抛出 UnsupportedOperationException。现在,仅当该指标用于不受支持的设备上时(即:PowerMetric.configure),才会出现不支持的操作异常 (UOE) 情况。(I5cf20b/227229375
  • 添加了 TotalPowerMetricTotalEnergyMetric,用于在 Macrobenchmark 中测量每个系统类别的总功耗和能耗。(I3b26bb/224557371

bug 修复

  • 修复了以下问题:在未取得 root 权限的 build 上的各 Macrobenchmark 之间,系统未正确重置已编译的方法。遗憾的是,每次迭代都需要重新安装该 APK,这会清除每个 Mmacrobenchmark 的应用数据。(I31c74b/230665435
  • 修复了 API 21/22 上的跟踪记录崩溃问题(If7fd6b/227509388b/227510293b/227512788
  • 改进了 activity 启动完成检测,以修复启动 Macrobenchmark 期间的“无法读取任何指标”异常。(Ia517c)

版本 1.1.1

版本 1.1.1

2022 年 11 月 9 日

发布了 androidx.benchmark:benchmark-*:1.1.1版本 1.1.1 中包含这些提交内容

bug 修复

  • 修复了在某些 Android11 (API 30) 及更高版本的设备上发生的 android.system.ErrnoException: open failed: EACCES 问题。这是从 1.2.0-alpha01 中择优挑选的修复程序。(aosp/2072249)

版本 1.1.0

版本 1.1.0

2022 年 6 月 15 日

发布了 androidx.benchmark:benchmark-*:1.1.0版本 1.1.0 中包含这些提交内容

  • 此版本与 androidx.benchmark:benchmark-*:1.1.0-rc03 完全相同。

自 1.0.0 以来的重要变更

版本 1.1.0-rc03

2022 年 6 月 1 日

发布了 androidx.benchmark:benchmark-*:1.1.0-rc03版本 1.1.0-rc03 中包含这些提交内容。

bug 修复

版本 1.1.0-rc02

2022 年 5 月 11 日

发布了 androidx.benchmark:benchmark-*:1.1.0-rc02版本 1.1.0-rc02 中包含这些提交内容

  • 请注意,此版本包含一项行为变更,应用现在会在每次基准测试之间完全重新安装,以确保测量结果准确。

bug 修复/行为变更

  • 修复了以下问题:应用编译在 Macrobenchmark 测试之间未正确重置,而且在未取得 root 权限的 build 中,应用编译完全无法重置。这修复了运行多项测试经常会导致 CompilationMode 对测量结果几乎没有影响的问题。为了解决此问题,目标应用现在会完全重新安装每个测试方法,这将清除每次 Macrobenchmark 测试之间的应用数据。(I31c74b/230665435

  • 由于这会防止应用在测试前设置状态,因此现在可以跳过编译/重新安装来解决此问题。例如,您可以使用 shell 命令 cmd package compile -f -m speed <package> 完全编译目标,然后绕过 Macrobenchmark 的编译步骤。

    例如,在 Macrobenchmark 的 build.gradle 中:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.compilation.enabled, 'false'
        }
    }
    

    或者在 Gradle 命令行中:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.compilation.enabled=false
    
  • 添加 androidx.benchmark.enabledRules 插桩参数以支持在 Macrobenchmark 与生成测试的基准配置文件之间共享模块。传入“Macrobenchmark”或“BaselineProfile”即可仅运行一种类型的测试,例如在模拟器上生成 BaselineProfiles 时。(I756b7b/230371561

    例如,在 Macrobenchmark 的 build.gradle 中:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.enabledRules', 'BaselineProfile'
        }
    }
    

    或者在 Gradle 命令行中:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
    

版本 1.1.0-rc01

2022 年 4 月 20 日

发布了 androidx.benchmark:benchmark-*:1.1.0-rc01版本 1.1.0-rc01 中包含这些提交内容

bug 修复

  • Android Studio 中的基准配置文件输出链接现在使用唯一的文件名。这样,输出始终会反映使用 BaselineProfileRule 的最新结果。(aosp/2057008b/228203086

版本 1.1.0-beta06

2022 年 4 月 6 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta06版本 1.1.0-beta06 中包含这些提交内容

bug 修复

  • 修复了 API 21/22 上的跟踪记录崩溃问题(If7fd6b/227509388
  • 改进了 activity 启动完成检测,以修复启动 Macrobenchmark 期间的“无法读取任何指标”异常。(Ia517c)
  • 修复了使用 CompilationMode.None() 时 Macrobenchmark 的启动指标。在此变更生效之前,CompilationMode.Partial() 的运行速度似乎慢于 Compilation.None()。(611ac9)

版本 1.1.0-beta05

2022 年 3 月 23 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta05版本 1.1.0-beta05 中包含这些提交内容

bug 修复

版本 1.1.0-beta04

2022 年 2 月 23 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta04版本 1.1.0-beta04 中包含这些提交内容

bug 修复

  • 修复了在 Android 10 中缺少指标的问题,还修复了因系统在轨迹中未正确捕获进程名称而导致出现的 NoSuchElementException。(Ib4c17b/218668335

  • 在 Android Q (API 29) 及更高版本中使用 PowerManager 进行温控调频检测。这可显著降低温控调频检测发生误报的频率(在 90 秒冷却期之后重试基准测试),并显著提高在用户 build 上进行基准测试的速度。同时这也使得即使时钟处于锁定状态,系统仍可进行热限制检测(如果锁定值对于设备的物理环境而言过高)。(I9c027b/217497678b/131755853

  • 过滤对 measureRepeated 线程的 Simpleperf 采样性能剖析,目的就在于简化检查(Ic3e12b/217501939

  • 支持来自多进程应用中已命名界面子进程的指标(Ice6c0b/215988434

  • 过滤基准配置文件规则,以 Android 9 (SDK 28) 为目标平台。aosp/1980331 b/216508418

  • 使用 Compilation.None() 时跳过配置文件安装。此外,在应用使用较低版本的 androidx.profileinstaller 和 Android Gradle 插件时还会报告警告。aosp/1977029

版本 1.1.0-beta03

2022 年 2 月 9 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta03版本 1.1.0-beta03 中包含这些提交内容

API 变更

  • 在 macrobenchmark 库中的实验性标记下方添加了 AudioUnderrunMetric,以允许检测音频欠载(Ib5972
  • BaselineProfileRule 不再接受 setup 块,因为其作用与 profileBlock 相同。(Ic7dfeb/215536447

    例如:

    @Test
    fun collectBaselineProfile() {
        baselineRule.collectBaselineProfile(
            packageName = PACKAGE_NAME,
            setupBlock = {
                startActivityAndWait()
            },
            profileBlock = {
                // ...
            }
        )
    }
    
    @Test
    fun collectBaselineProfile() {
        baselineRule.collectBaselineProfile(
            packageName = PACKAGE_NAME,
            profileBlock = {
                startActivityAndWait()
                // ...
            }
        )
    }
    

bug 修复

  • 修复了以下问题:在 Studio 输出中建立关联后,微平台性能分析器记录的轨迹在后续运行中无法更新(I5ae4db/214917025
  • 在 API 23 上阻止编译 shell 命令 (Ice380)
  • FrameCpuTime 重命名为 FrameDurationCpu,并将 FrameUiTime 重命名为 FrameDurationUi,以指明它们是时长(而非时间戳)并使前缀保持一致。(I0eba3b/216337830

版本 1.1.0-beta02

2022 年 1 月 26 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta02版本 1.1.0-beta02 中包含这些提交内容

bug 修复

  • 与其他性能剖析输出类似,微基准堆栈采样/方法跟踪性能分析结果现在会在 Studio 输出中添加链接,并且不会抑制分配指标。(Idcb65b/214440748b/214253245
  • BaselineProfileRule 现在会在 logcat 和 Studio 输出中输出 adb pull 命令的结果,以拉取生成的 BaselineProfile 文本文件。(f08811)

版本 1.1.0-beta01

2022 年 1 月 12 日

发布了 androidx.benchmark:benchmark-*:1.1.0-beta01版本 1.1.0-beta01 中包含这些提交内容

bug 修复

  • 修复了性能分析器参数启用设置被忽略的问题。(I37373b/210619998
  • 移除了已废弃的 CompliationModesI98186b/213467659
  • 为清楚起见,将 CompilationMode.Partial 的基准配置文件参数改成了枚举类型。(Id67ea)

版本 1.1.0-alpha13

2021 年 12 月 15 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha13版本 1.1.0-alpha13 中包含这些提交内容

API 变更

  • 向 Android Q(API 29 及更高级别)上的微平台输出添加了低开销系统跟踪。请注意,这目前不会(通过 android.os.Traceandroidx.tracing Jetpack API)捕获自定义跟踪,以避免对结果产生影响。此跟踪在诊断不稳定性方面非常有用,尤其是针对基准之外的来源。(I298beb/205636583b/145598917
  • CompilationModes 分为三个类:完整、无、部分。之前它们以编译参数(现在我们视作实现细节)和功能命名,导致名称不一致。这样一来,不同平台版本上的权衡、潜在组合和行为就变得更加清晰明确。(I3d7bfb/207132597
  • 现在,“设置”和“衡量”始终是成对的,并且按顺序显示。您现在可以查询软件包名称和迭代(尽管在特定的预热场景中迭代可能是 null)。(Id3b68b/208357448b/208369635

bug 修复

  • 修复了 CompilationMode.Speed 被误处理为 None 的问题 (I01137)

版本 1.1.0-alpha12

2021 年 11 月 17 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha12版本 1.1.0-alpha12 中包含这些提交内容

新功能

  • 针对基于轨迹的自定义时间测量增加了实验性 TraceSectionMetric。(I99db1b/204572664

bug 修复

  • 每次迭代时唤醒设备,以确保可以测试界面 - 需要停用锁屏功能。(Ibfa28b/180963442
  • 修复了模拟器和未取得 root 权限的设备在 StackSampling 分析模式下多次崩溃的问题(Icdbdab/202719335
  • 取消了每次迭代结束时 0.5 秒的休眠时间 - 如果您发现此次更改后缺少一些指标,请提交 bug。(Iff6aa)
  • 降低了数据丢失的几率,并减少了跟踪记录的内存开销(Id2544b/199324831b/204448861
  • 改为内存占用较小的 sched 存储格式,将轨迹大小缩减了约 40%。(Id5fb6b/199324831
  • 将启动指标的实现更新为始终在 renderthread 结束时结束。这将使各个平台版本间的测量结果更为一致,并且更贴近应用内衡量结果。(Ic6b55)

版本 1.1.0-alpha11

2021 年 11 月 3 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha11版本 1.1.0-alpha11 中包含这些提交内容

API 变更

  • Macrobenchmark 现在的 minSdkVersion23。(If2655)
  • 新增了一个实验性 BaselineProfileRule,能够为应用的关键用户历程生成基准配置文件。后面提供了详细文档。(Ibbefab/203692160
  • 移除了为 Java 调用方添加的 measureRepeated 接口变体,因为它会导致在完成/解析该方法是产生歧义。Java 调用方将需要再从 measureRepeated 返回 Unit.Instance。如果由此给您带来不便,请提交 bug,我们会在未来版本中细探这一问题。(Ifb23eb/204331495

版本 1.1.0-alpha10

2021 年 10 月 27 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha10版本 1.1.0-alpha10 中包含这些提交内容

API 变更

  • 向后移植 StartupTimingMetric 以向后兼容 API 23。这一新实现还能更好地处理 reportFullyDrawn(),以等待相应内容的呈现。(If3ac9b/183129298
  • 为 Java 调用方的多个 MacrobenchmarkScope 方法添加了 JvmOverloads。(I644feb/184546459
  • 提供了备用 MacrobenchmarkRule.measureRepeated 函数,该函数使用 Consumer<MacrobenchmarkScope> 实现 Java 语言中的惯用用法。(If74abb/184546459

bug 修复

  • 修复了跟踪记录未尽早开始以及缺少指标数据的问题。这应该可以修复由库本身引起的“在基准运行期间无法读取任何指标”异常。(I6dfcbb/193827052b/200302931
  • FrameNegativeSlack 已重命名为 FrameOverrun 以阐明其的含义:帧超出其时间预算的程度。(I6c2aab/203008701

版本 1.1.0-alpha09

2021 年 10 月 13 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha09版本 1.1.0-alpha09 中包含这些提交内容

bug 修复

版本 1.1.0-alpha08

2021 年 9 月 29 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha08版本 1.1.0-alpha08 中包含这些提交内容

API 变更

  • 使滚动 macrobenchmark 可以往回运行到 API 23(If39c2b/183129298
  • 向界面和 JSON 输出添加了新型采样指标,侧重于每次迭代多个样本的百分位数。(I56247b/199940612
  • 整个基准库都改为使用浮点指标(在 Studio 界面中会被截断)。(I69249b/197008210

版本 1.1.0-alpha07

2021 年 9 月 1 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha07版本 1.1.0-alpha07 中包含这些提交内容

API 变更

  • 将最低的 API 级别提升到了 21,以反映未来预期支持的最低 API 级别。当前支持的最低 API 级别仍通过 requiredApi() 传达,目前为 29(I440d6b/183129298

bug 修复

  • 修复了 ProfileInstaller,以更方便使用基准配置文件的应用使用 CompilationMode.BaselineProfile 运行 MacroBenchmark。(I42657b/196074999)注意:还需要更新到 androidx.profileinstaller:profileinstaller:1.1.0-alpha04 或更高版本。
  • StartupMode.COLD + CompilationMode.None 基准现在更加稳定。(I770cdb/196074999

版本 1.1.0-alpha06

2021 年 8 月 18 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha06版本 1.1.0-alpha06 中包含这些提交内容

API 变更

  • 添加了 androidx.benchmark.iterations 插桩参数,以允许在本地进行测试/性能分析时手动替换迭代计数。(6188beb/194137879

bug 修复

  • 已在 API 29 及更高级别上切换到 Simpleperf 并将其作为默认采样性能分析器。(Ic4b34b/158303822

已知问题

  • CompilationMode.BaselineProfile 仍在开发中。目前,请避免使用它来确定配置文件的优良度。

版本 1.1.0-alpha05

2021 年 8 月 4 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha05版本 1.1.0-alpha05 中包含这些提交内容。

由于间歇性崩溃问题,1.1.0-alpha04 已取消,未发布。b/193827052

API 变更

  • startActivityAndWait 切换为通过 am start 调用启动事件,这会使每次测量迭代的时间缩短约 5 秒,但代价是不再支持 intent parcelable。(I5a6f5b/192009149

bug 修复

  • 降低了热节流检测的激进性,并在频繁检测到节流时重新计算基准。(I7327b)
  • 修复了 FrameTimingMetric,以支持 Android S Beta 版(Ib60ccb/193260119
  • 使用 EmptyActivity 使目标应用退出强行停止状态,以便更好地支持 CompilationMode.BaselineProfile。(Id7cacb/192084204
  • 将轨迹文件扩展名更改为 .perfetto-trace,以符合平台标准。(I4c236b/174663039
  • StartupTimingMetric 现在会输出“fullDrawnMs”指标,以测量直到应用完成渲染所用的时间。如需为您的应用定义此指标,请在初始内容准备就绪时(例如,从数据库或网络加载初始列表项时)调用 Activity.reportFullyDrawn。(无需对 ComponentActivity 进行 build 版本检查即可使用 reportFullyDrawn 方法。)请注意,您的测试必须运行足够长的时间才能捕获此指标(startActivityAndWait 不会等待 reportFullyDrawn)。(If1141b/179176560
  • 将界面元数据附加到轨迹的时间缩短了 50 多毫秒(Ic8390b/193923003
  • 停止跟踪后轮询频率显著提高,这可将示例启动基准运行时间缩短 30% 以上(Idfbc1b/193723768

版本 1.1.0-alpha03

2021 年 6 月 16 日

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha03版本 1.1.0-alpha03 中包含这些提交内容

新功能

bug 修复

  • 用于抑制基准错误的 Gradle 示例代码已更新为使用一个非废弃的 API,其语法也支持 .gradle.kts 用户。

    例如:

    testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "EMULATOR,LOW-BATTERY"
    

版本 1.1.0-alpha02

2021 年 5 月 18 日

Benchmark 版本 1.1.0-alpha02 为基准化分析引入了一个重要组件 - Macrobenchmark。除了提供用于衡量 CPU 循环的基准之外,Macrobenchmark 还可用于衡量整个应用的互动(如启动和滚动)和捕获跟踪记录。如需了解详情,请参阅库文档

发布了 androidx.benchmark:benchmark-*:1.1.0-alpha02版本 1.1.0-alpha02 中包含这些提交内容

新功能

添加了 Macrobenchmark 工件(androidx.benchmark:benchmark-macro-junit4androidx.benchmark:benchmark-macro

  • 从应用(在本地或 CI 中)中捕获启动、滚动/动画性能指标
  • 从 Android Studio 中捕获和检查跟踪记录

bug 修复

  • 解决了 Android 12 上输出目录的 shell 权限问题(注意 - 可能需要将 Android Gradle 插件更新到 7.0.0 Canary 版以及将 Android Studio 更新为 Arctic Fox [2020.3.1],以继续在受影响的设备上捕获输出文件)。(Icb039)
  • 在 BenchmarkPlugin 中支持配置缓存(6be1c1b/159804788
  • 简化了文件输出 - 默认情况下,在不需要 requestLegacyExternalStorage=true 的目录中启用(8b5a4db/172376362
  • 修复了以下问题:库输出关于在没有 JIT 线程的平台版本上找不到 JIT 线程的 logcat 警告。(I9cc63b/161847393
  • 修复了读取设备最大频率的问题。(I55c7a)

版本 1.1.0-alpha01

2020 年 6 月 10 日

发布了 androidx.benchmark:benchmark-common:1.1.0-alpha01androidx.benchmark:benchmark-gradle-plugin:1.1.0-alpha01androidx.benchmark:benchmark-junit4:1.1.0-alpha01版本 1.1.0-alpha01 中包含这些提交内容

1.1 的新功能

  • 分配指标 - 基准现在会在预热和计时后运行一个额外的阶段,以捕获分配计数。分配可能会导致旧版平台出现性能问题(O 中的 140ns 变为 M 中的 8ns - 在 Nexus5X 上测量,时钟处于锁定状态)。该指标显示以下位置:在 Android Studio 控制台输出以及
  • 性能剖析支持 - 您现在可以捕获基准运行的性能剖析数据,以检查代码运行缓慢的原因。Benchmark 支持捕获方法跟踪记录或 ART 中的方法采样。您可以使用 Android Studio 中的性能剖析器(依次选择“File > Open”)来检查这些文件。
  • Benchmark Gradle 插件现在提供默认设置,以便简化设置过程:
    • testBuildType 默认设置为发布,以避免使用内置代码覆盖率的依赖项。发布 buildType 也会配置为默认 buildType,以便 Android Studio 能够在首次打开项目时自动选择正确的 build 变体。(b/138808399)
    • signingConfig.debug 用作默认的签名配置 (b/153583269)

** 问题修复 **

  • 显著降低了预热过渡开销,其中每个基准的首次测量值都因人为原因而高于其他测量值。该问题在非常小的基准(1 毫秒或更短)中更加明显。(b/142058671)
  • 修复了从命令行运行时针对每个基准输出的 InstrumentationResultParser 错误。(I64988b/154248456

已知问题

  • 命令行、Benchmark 的 Gradle 调用不直接输出结果。若要解决该问题,您可以查看 Studio,也可以解析 JSON 输出文件以获取结果。
  • Benchmark 报告无法从已安装应用 ID 以“android”或“download”(不区分大小写)结尾的应用的设备中拉取报告。遇到该问题的用户应将 Android Gradle 插件升级到 4.2-alpha01 或更高版本。

版本 1.0.0

Benchmark 版本 1.0.0

2019 年 11 月 20 日

发布了 androidx.benchmark:benchmark-common:1.0.0androidx.benchmark:benchmark-gradle-plugin:1.0.0androidx.benchmark:benchmark-junit4:1.0.0,这些版本与 1.0.0-rc01 相比没有变化。版本 1.0.0 中包含这些提交内容

1.0.0 的主要功能

使用 Benchmark 库,您可为应用代码编写性能基准测试并快速获得分析结果。

它可以防止出现构建和运行时配置问题并稳定设备性能,确保衡量值的准确性和一致性。直接在 Android Studio 中在持续集成中运行基准化分析,以观察代码性能随时间的变化情况,并防止出现回归。

主要功能包括:

  • 时钟稳定
  • 自动设置线程优先级
  • 支持界面性能测试,例如在 RecyclerView 示例
  • JIT 感知预热和循环
  • 用于后期处理的 JSON 基准输出

版本 1.0.0-rc01

2019 年 10 月 23 日

发布了 androidx.benchmark:benchmark-common:1.0.0-rc01androidx.benchmark:benchmark-gradle-plugin:1.0.0-rc01androidx.benchmark:benchmark-junit4:1.0.0-rc01版本 1.0.0-rc01 中包含这些提交内容

新功能

  • 向基准添加了 systrace 跟踪记录

bug 修复

  • 修复了由于优先级设置导致 JIT 无法在预热前结束的指标不稳定问题 (b/140773023)
  • 统一了 Android Gradle 插件 3.5 和 3.6 的 JSON 输出目录

版本 1.0.0-beta01

2019 年 10 月 9 日

发布了 androidx.benchmark:benchmark-common:1.0.0-beta01androidx.benchmark:benchmark-gradle-plugin:1.0.0-beta01androidx.benchmark:benchmark-junit4:1.0.0-beta01版本 1.0.0-beta01 中包含这些提交内容

新功能

  • 在每次预热之前运行垃圾回收,以减少从一个基准泄漏到下一个基准的内存压力 (b/140895105)

bug 修复

  • 添加了 androidx.annotation:android-experimental-lint 依赖项,以便在未使用实验性 API 时,Java 代码将正确生成 lint 错误,类似于 Kotlin 实验性注解针对 Kotlin 调用方提供的内容。
  • 现在可正确检测 Android Gradle 插件 3.6 中输出的 additionalTestOutputDir 插桩参数的使用情况,了解 AGP 何时处理数据副本。
  • 修复了 JSON 中未检测到的时钟频率,以正确打印 -1 (b/141945670)。

版本 1.0.0-alpha06

2019 年 9 月 18 日

发布了 androidx.benchmark:benchmark-common:1.0.0-alpha06androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha06androidx.benchmark:benchmark-junit4:1.0.0-alpha06版本 1.0.0-alpha06 中包含这些提交内容

新功能

  • 添加了检查以确定错误使用旧软件包的测试运行程序,该程序现在提供更有用的错误消息

API 变更

  • 实验性注解 ExperimentalAnnotationReport 现已正确公开。现在,使用实验性 BenchmarkState#report API 时需要此注释

版本 1.0.0-alpha05

2019 年 9 月 5 日

发布了 androidx.benchmark:benchmark-common:1.0.0-alpha05androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha05androidx.benchmark:benchmark-junit4:1.0.0-alpha05。点击此处可查看此版本中包含的提交内容。

API 变更

  • BenchmarkState.reportData API 现标记为实验性

bug 修复

  • 修复了时钟锁定脚本,该脚本在缺少 cutexpr shell 实用程序的设备上将失败。
  • 修复了 ./gradlew lockClocks 任务存在的以下问题:在以 su 实用程序的较旧版本(不支持 -c 标志)启用 root 权限的设备上,该任务会挂起。

版本 1.0.0-alpha04

2019 年 8 月 7 日

发布了 androidx.benchmark:benchmark-common:1.0.0-alpha04androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha04androidx.benchmark:benchmark-junit4:1.0.0-alpha04。点击此处可查看此版本中包含的提交内容。

此外还添加了有关如何在不使用 Gradle 的情况下使用 Benchmark 库的新文档,两者可用于不同的构建系统(例如 Bazel 或 Buck),以及在 CI 中运行时。如需了解详情,请参阅在不使用 Gradle 的情况下构建基准在持续集成环境中运行基准测试

新功能

  • Gradle 插件
    • 现在自动停用测试覆盖范围,并默认设置 AndroidBenchmarkRunner (b/138374050)
    • 增加了在运行基准和使用 AGP 3.6+ 时,对基于 AGP 的新数据副本的支持
  • 添加了 JSON 格式
    • 输出总基准测试运行时间 (b/133147694)
    • 现在,使用名称字符串(例如 @Parameters(name = "size={0},depth={1}"))的 @Parameterized 基准以 JSON 输出格式输出每个基准的参数名称和值 (b/132578772)
  • 模拟运行模式 (b/138785848)
    • 添加了“模拟运行”模式,仅运行每个基准循环一次以检查是否有错误/崩溃,而不捕获测量值。该模式非常有用,例如可在预提交中快速运行基准,以确认它们未损坏。

API 变更

  • 更改了模块结构,拆分了库 (b/138451391)
    • benchmark:benchmark-junit4 包含具有 JUnit 依赖项的类:AndroidBenchmarkRunnerBenchmarkRule。这两个类均已移入 androidx.benchmark.junit4 软件包中
    • benchmark:benchmark-common 包含其余逻辑,其中包括 BenchmarkState API
    • 通过这种拆分,该库将来可以在没有 JUnit4 API 的情况下支持基准化分析
  • 配置警告现在被视为错误,并且会使测试崩溃 (b/137653596)
    • 这样做是为了进一步鼓励准确测量,尤其是在 CI 中
    • 可以使用插桩参数将这些错误回退为警告。例如:-e androidx.benchmark.suppressErrors "DEBUGGABLE,LOW_BATTERY"

bug 修复

  • 写入 Q 设备上的外部存储空间时出现的错误会提供更具描述性的消息,并提供有关如何解决相应问题的建议
  • 在基准运行期间,屏幕会自动打开,而不是在屏幕关闭时失败

外部贡献

  • 感谢 Sergey Zakharov 为 JSON 输出改进以及修复屏幕关闭问题做出的贡献!

版本 1.0.0-alpha03

2019 年 7 月 2 日

发布了 androidx.benchmark:benchmark:1.0.0-alpha03androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha03。点击此处可查看此版本中包含的提交内容。

新功能

  • 在完整的 JSON 报告中公开每个基准因热节流而导致的休眠持续时间

bug 修复

  • 在 Android 插件和 Android 块之后,不再需要应用 Gradle 插件
  • 在使用分区存储的 Android 10 设备上添加了对基准报告的支持

版本 1.0.0-alpha02

2019 年 6 月 6 日

发布了 androidx.benchmark:1.0.0-alpha02androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha02。点击此处可查看此版本中包含的提交内容。

请注意,我们将 JSON 架构视为 API。我们计划遵循与其他 API 相同的稳定性约束:进入 Beta 版后架构即变得稳定(极偶尔会有例外情况),并在最终版本中进行修复,在次要版本中仅添加新内容,而在主要版本中更改/移除内容。

API 变更

  • 翻新了 JSON 架构。对 JSON 架构的后续更改很可能仅限于新增特性:

    • 重新组织了结果对象结构,以支持将来的更多指标组 (b/132713021)
    • 在顶级对象中添加了测试运行上下文信息(例如,设备和 build 信息以及时钟是否处于锁定状态)(b/132711920)
    • 现在,时间指标名称中带有“ns”(b/132714527)
    • 扩充了每个报告指标的统计信息(最大值、中位数、最小值),并移除了简化的“nanos”摘要统计信息 (b/132713851)
  • 移除了 XML 输出 (b/132714414)

  • BenchmarkState.reportData API 中移除了热限制检测 (b/132887006)

bug 修复

  • 修复了 ./gradlew lockClocks 在某些最新的 OS 设备上不粘滞的问题 (b/133424037)
  • 停用了模拟器的限制检测 (b/132880807)

版本 1.0.0-alpha01

2019 年 5 月 7 日

发布了 androidx.benchmark:benchmark:1.0.0-alpha01。点击此处可查看此版本中包含的提交内容。