基准测试

在 Android Studio 中准确测量代码的性能。
最新更新 稳定版 候选发布版 Beta 版 Alpha 版
2024 年 11 月 13 日 1.3.3 - - 1.4.0-alpha05

声明依赖项

要添加对 Benchmark 的依赖项,必须将 Google Maven 代码库添加到您的项目中。阅读Google 的 Maven 代码库以了解更多信息。

宏基准测试

要在您的项目中使用宏基准测试,请将以下依赖项添加到您的build.gradle文件(用于您的宏基准测试模块)中

Groovy

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

Kotlin

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

微基准测试

要在您的项目中使用微基准测试,请将以下依赖项添加到您的build.gradle文件(用于您的微基准测试模块)中

Groovy

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

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

Kotlin

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

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

微基准测试库还提供一个 Gradle 插件,可与您的微基准测试模块一起使用。此插件会为模块设置构建配置默认值,设置基准测试输出复制到主机,并提供 ./gradlew lockClocks 任务

要使用此插件,请在顶级build.gradle文件的`plugins`块中包含以下行

Groovy

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

Kotlin

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

然后将插件应用于基准测试模块的build.gradle文件

Groovy

plugins {
  id 'androidx.benchmark'
}

Kotlin

plugins {
    id("androidx.benchmark")
}

反馈

您的反馈有助于改进 Jetpack。如果您发现新的问题或有改进此库的想法,请告知我们。在创建新问题之前,请查看此库中现有问题。您可以通过点击星号按钮为现有问题添加您的投票。

创建新的问题

查看问题跟踪器文档以了解更多信息。

1.4 版

1.4.0-alpha05 版

2024 年 11 月 13 日

androidx.benchmark:benchmark-*:1.4.0-alpha05 已发布。1.4.0-alpha05 版包含这些提交

错误修复

  • 修复了 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 设备上的应用。此支持已在某些场景中进行测试,但如果它对您不起作用,请告知我们一个错误。(I9fcbeb/356684617b/373641155)

错误修复

  • 在基准构建中,isProfileable 现在始终被覆盖,并且在基准构建和nonMinified(基线配置文件捕获)构建中,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 运行时性能。捕获 JIT、类初始化(如果可用)和类验证的数量和总持续时间。此外,更改CaptureInfo 以包含可选的 ART 主线版本(默认为空)。(I930f7)
  • coefficientOfVariation添加到基准 JSON 输出中,以显示给定基准运行中的稳定性。(Ib14ea)

错误修复

  • 修复了当 AVD 设备包含空格时CollectBaselineProfileTask的问题。(Ia0225b/371642809)
  • 针对StartupMode.COLD异常的错误进行了推测性修复:Package <packagename> must not be running prior to cold start!。现在,MacrobenchmarkScope.killProcess()(包括在每次迭代之前运行的一个,用于实现StartupMode.COLD行为)将等待以验证应用程序的所有进程都已停止运行。(I60aa6b/351582215)
  • 修复了在某些已 root 的模拟器上显示 UNLOCKED_ 错误的问题。(Ic5117)
  • 此库现在使用JSpecify 空值注释,它们是类型使用。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)

错误修复

  • BaselineProfileRule现在通过在块结束时向每个正在运行的进程发出信号以转储配置文件来收集多进程应用程序的配置文件。如果基于配置文件的编译从未成功找到要广播到的进程,则编译将失败,因为在其中包含配置文件数据是不正常的。此外,还添加了一个 instrumentation 参数来控制转储等待持续时间: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)
  • 微基准指标现在在 Perfetto 追踪中显示为计数器。(3214854)
  • 添加了禁用 JIT 的实验性脚本(需要 root/运行时重启),以及重置设备性能/测试状态。这些目前尚未发布为 Gradle 任务。(7c3732b)
  • 添加了基准参数,用于在模拟器上运行时跳过测试。当启用automaticGenerationDuring构建时,基准测试也将触发基线配置文件生成。如果使用模拟器,这将失败。使用新的参数skipBenchmarksOnEmulator,我们可以跳过测试。(0c2ddcd)
  • 更改性能事件启用逻辑,使其在 API 23+ 上运行。(2550048)

API 变更

  • 将现有的实验性PerfettoConfig参数移动到新的ExperimentalConfig对象中。

错误修复

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

1.3 版本

1.3.3 版本

2024年10月16日

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

错误修复

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

1.3.2 版本

2024年10月2日

androidx.benchmark:benchmark-*:1.3.2 已发布。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.3.1 版本

2024年9月18日

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

错误修复

  • 添加了 Gradle 属性 androidx.baselineprofile.suppressWarnings 用于抑制所有基线配置文件警告 (I7c36eb/349646646)
  • 修复了基线配置文件 Gradle 插件,使其使用应用创建的现有 nonMinified…benchmark…,而不是创建包装器。( Ia8934b/361370179)
  • 修复了在模拟器上启用 automaticGenerationDuringBuild 时出现的 java.lang.AssertionError: ERRORS (not suppressed): EMULATOR 错误。现在使用新的参数来跳过测试。( If3f51b/355515798)
  • 微基准测试代码混淆 - 保留基准库 Proguard 中 org.junit.runner.notification.RunListener 的子类 (Ic8ed5b/354264743)
  • 修复了 TraceSectionMetric 以忽略非终止片段。以前这些片段被认为持续时间为 -1,例如在求和或查找最小持续时间期间。( If74b7)
  • 修复了 FrameTimingGfxInfoMetric 中的一个问题,该问题在进程尚未运行时启动指标会导致崩溃。( I6e412)

1.3.0 版本

2024年8月21日

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

自 1.2.0 版本以来的微基准测试更改

  • 在大多数设备上运行微基准测试时,方法跟踪默认启用
    • 方法跟踪作为单独的阶段运行,在测量之后 - 这使得能够从单个基准测试运行中输出准确的测量结果和方法跟踪
    • 在某些 Android 操作系统和 ART 版本上,方法跟踪会影响后续的测量阶段 - 在这些版本上,方法跟踪默认禁用,并且会向 Studio 输出打印警告
  • 主线程基准测试和 ANR
    • 添加了 measureRepeatedOnMainThread 用于 UI 线程基准测试(例如,与 Compose/View UI 交互的那些基准测试),以避免在运行许多秒时出现 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 版本以来的宏基准测试更改

  • 宏基准测试的方法跟踪全面改进。
    • 现在,方法跟踪的范围限定为 measureBlock 的持续时间,如果进程多次启动,则可以捕获多个会话。
    • 以前,方法跟踪仅适用于 StartupMode.COLD 基准测试,并且不会为未重新启动目标进程的 measureBlocks 捕获任何内容。
    • 修复了宏基准测试中的方法跟踪刷新,以便即使在较慢的设备上,方法跟踪也应该完全捕获并有效。( I6349ab/329904950)
  • 在进程被终止时,正确转储各个 warmUp 迭代期间的 ART 配置文件,以便 CompilationMode.Partial(warmup=N) 测量的精度更高。( I17923)
  • 删除着色器广播失败消息
    • 添加调试建议以删除着色器广播失败消息
    • 添加两个 instrumentation 参数,用于覆盖着色器丢弃行为,以解决在对未使用 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 跟踪记录。请注意,配置不正确的配置可能会导致内置指标类失败。( Idfd3db/309841164b/304038384)
  • 在运行宏基准测试之前取消后台 dexopt 作业,以减少干扰。( I989ed)
  • 宏基准测试现在等待 1 秒钟,以便目标应用程序刷新 ART 配置文件(以前等待 500 毫秒)。( I85a50b/316082056)
  • TraceSectionMetric 改进
    • 注意:以下 TraceSectionMetric 更改可能会影响 CI 使用中的输出,并可能导致不连续性或破坏解析
    • 总和现在是默认值,因为此指标的大多数用法都是针对重复事件,而第一个会在这些情况下丢弃数据。
    • 更改为更具可定制性,并提供更多可用模式。
    • 模式名称现在嵌入在指标输出名称中(在 Studio 和 JSON 中)。
    • 现在支持使用 Trace.{begin|end}AsyncSection 创建的片段。
  • 指标
    • 功耗 - 添加了 PowerMetric.deviceSupportsHighPrecisionTrackingPowerMetric.deviceBatteryHasMinimumCharge()PowerMetric.deviceSupportsPowerEnergy()
    • Metric.getResult 重命名为 getMeasurements 以匹配返回类型。
    • 向所有启动检测失败添加了 log.w/异常标签。这不会更改当前行为(因此某些错误会抛出,而其他错误则会默默地无法检测到启动),只是使其更容易理解。通常,Log.w() 并无法报告启动指标的那些是缺少非帧事件的情况,除了帧计时信息(来自 UI/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或基准构建类型时启用基线配置文件生成和基准测试。(Ib8f05b/324837887
  • 修复了在 AGP 8.3.0-alpha15 之前将库基线配置文件包含在 AAR 中的问题。(I1d2afb/313992099
  • 修复了基线和启动配置文件在生成任务结束时的输出 URL。(I802e5b/313976958

自 1.2.0 版以来的其他重要更改

  • 追踪捕获
    • 将从错误启动 Perfetto 时出现的 EXITCODE 2 错误降低为已记录的警告
    • 在基准测试中默认启用 AIDL 追踪(需要 API 28)(Ia0af2b/341852305
    • 在基准测试中默认启用 porter tag 追踪。这会捕获例如唤醒锁追踪点。(Icfe44b/286551983
    • 增加了追踪捕获启动超时时间,以避免在较慢的设备上启动追踪时发生崩溃(I98841b/329145808
    • 添加了公共 API PerfettoTraceProcessor.Session.queryMetrics,包含 JSON、textproto 和 proto 二进制(未解码)变体。这些允许您查询内置于TraceProcessor中的指标(I54d7fb/304038382
    • 在 Perfetto 追踪记录上启用阻塞启动,以降低在追踪开始时丢失数据的风险。仅在 API 33+ 上支持。(Ie6e41b/310760059
  • JSON 输出
    • 在 JSON 输出的基准测试上下文中添加了其他信息
      • context.artMainlineVersion - Art 主线模块的整数版本(如果设备上存在,则为-1
      • context.build.id - 等于 android.os.Build.ID
      • context.build.version.codename - 等于 android.os.Build.VERSION.CODENAME
      • context.build.version.abbreviatedCodename - 对应于预发行代号的第一个字母(包括正式版本)(Ie5020
    • 添加了 profilerOutput 列表到 JSON 输出,以便于围绕性能分析追踪(例如 Perfetto、方法追踪)进行工具处理(I05dddb/332604449
    • 在基准模块中使用 Android 测试编排器时添加了警告,因为这会导致每个模块的输出 JSON 文件被重复覆盖。(Ia1af6b/286899049
    • 当文件名超过 200 个字符时抛出异常,以避免在写入或后期处理文件时出现不明确的崩溃。(I4a5ab

1.3.0-rc01 版

2024 年 8 月 7 日

androidx.benchmark:benchmark-*:1.3.0-rc01 已发布。1.3.0-rc01 版包含 这些提交

错误修复

  • 修复了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 版)以及在使用 AGP 8.1 或更高版本(例如 D8 8.1 版)的所有构建中,这将通过 API 建模自动发生。建议不使用 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 版包含 这些提交

错误修复

  • 在启动 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
  • 微基准测试现在将正确抛出异常以防止方法追踪干扰测量。当方法追踪被强制启用(通过检测参数或MicrobenchmarkConfig),并且在方法追踪后尝试进行测量时,这会在某些设备上发生。受影响的设备运行的是 API 26-30 或某些受此干扰影响的 ART 主线模块版本,并且可以通过 ProfilerConfig.MethodTracing.affectsMeasurementOnThisDevice 在运行时检测到。(Iafb92b/303660864

错误修复

  • 将推荐的最大 agp 版本提升至 9.0.0-alpha01。(I5bbb0
  • 将编译模式添加到基准测试上下文(If5612b/325512900
  • 默认启用 AIDL 追踪(需要 API 28)(Ia0af2b/341852305
  • 在 JSON 输出的基准测试上下文中添加了其他信息
    • context.artMainlineVersion - Art 主线模块的整数版本(如果设备上存在,则为 -1)
    • context.build.id - 等于 android.os.Build.ID
    • context.build.version.codename - 等于 android.os.Build.VERSION.CODENAME
    • context.build.version.abbreviatedCodename - 对应于预发行代号的第一个字母(即使在正式版本中也是如此)(Ie5020
  • 修复了 StackSampling 以遵守 androidx.benchmark.profiling.sampleDurationSecondsIb1d53
  • 将宏到通用依赖项更改为 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 版包含 这些提交

错误修复

  • 当宏基准指标对所有迭代返回零值时,抛出更清晰的异常(Iab58fb/314931695
  • 向微基准 ProGuard 规则中添加了其他解决方法规则,包括对侦听器规则和其他观察到的警告/错误的支持。(I14d8fb/329126308b/339085669
  • 方法追踪在宏基准测试期间作为单独阶段运行,并且不再影响测量。(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 追踪记录。请注意,配置不正确的配置可能会导致内置的指标类失败。(Idfd3db/309841164b/304038384
  • 为了清晰起见,将 PowerMetric.deviceSupportsPowerEnergy 重命名为 PowerMetric.deviceSupportsHighPrecisionTrackingI5b82f
  • 添加了 PowerMetric.deviceBatteryHasMinimumCharge()PowerMetric.deviceSupportsPowerEnergy(),以便根据设备电源测量能力更改或跳过基准测试。(I6a591b/322121218

错误修复

  • 添加了与之前的基线配置文件的比较(I824c8b/269484510
  • 添加了用于禁用警告的 DSL(Ic4debb/331237001
  • 禁用基准测试变体时,将异常更改为信息日志(I8a517b/332772491
  • 简化了捕获宏基准测试方法跟踪的过程,使其范围限于实际 measureBlock() 的持续时间。之前,它从目标进程启动开始,并且仅支持冷启动(Iee85ab/300651094
  • 避免在 Perfetto 追踪处理器启动缓慢时崩溃(I98841b/329145808

版本 1.3.0-alpha03

2024年4月17日

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

新功能

  • 添加了公共 API PerfettoTraceProcessor.Session.queryMetrics API,包含 JSON、textproto 和 proto 二进制(未解码)变体。这些允许您查询 TraceProcessor 中内置的指标I54d7fb/304038382
  • profilerOutput 添加到 JSON 输出中,以便于围绕分析追踪(例如 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,并重新排序了参数,使更常用的参数 (mode) 在参数列表中更靠前,减少了指定参数名称的需求。(Ibf0b0b/315830077b/322167531
  • Metric.getResult 重命名为 getMeasurements 以匹配返回类型(I42595

错误修复

  • 修复以确保基准测试在 automaticGenerationDuringBuild 关闭时使用生成的基线配置文件(Ic144fb/333024280
  • 修复了 BaselineProfile Gradle 插件属性覆盖,以便在自定义 nonMinified 或基准测试构建类型时启用基线配置文件生成和基准测试。(Ib8f05b/324837887
  • 修复了宏基准测试中的方法跟踪刷新,以便即使在较慢的设备上也能完全捕获并验证方法跟踪。(I6349ab/329904950
  • 启用 Perfetto 追踪记录上的阻塞启动,以减少在追踪开始时丢失数据的风险。仅在 API 33+ 上支持。(Ie6e41b/310760059
  • 在基准测试模块中使用 Android 测试协调器时添加警告,因为这会导致每个模块的输出 JSON 文件被重复覆盖。(Ia1af6b/286899049
  • 强制使用 ','(逗号)作为千位分隔符,以保证 Studio 输出的一致性,忽略设备区域设置(I3e921b/313496656
  • TraceSectionMetric 现在支持使用 Trace.{begin|end}AsyncSection 创建的切片。(I91b32b/300434906
  • 将 log.w/异常标签添加到所有启动检测失败中。这不会改变当前行为(因此某些错误会抛出,而其他错误会默默地未能检测到启动),只是使其更易于理解。通常,那些 Log.w() 并未能报告启动指标的是那些缺少非帧事件的情况,当检测到启动时会抛出异常,除了帧计时信息(来自 UI/RT 切片)。(Id240fb/329145809
  • 在运行宏基准测试之前取消后台 dexopt 作业,以减少干扰。( 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 规则在微基准测试中实现实验性 R8 支持。请注意,此支持是实验性的,需要 AGP 8.3 来缩小库模块测试的代码。使用以下方法在你的基准测试模块的 build.gradle 中启用 R8 缩小/优化,这将导致性能显著提高,具体取决于工作负载。(I738a3b/184378053

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

错误修复

  • 修复了方法跟踪警告,使其与微基准测试输出位于单独的行上。(I0455cb/328308833

版本 1.3.0-alpha01

2024年2月21日

androidx.benchmark:benchmark-*:1.3.0-alpha01 已发布。版本 1.3.0-alpha01 包含这些提交。

API 变更

  • 重命名了 MicrobenchmarkConfig 布尔参数,以避免不必要的词语“should”(Ia8f00b/303387299
  • 添加了 BenchmarkRule.measureRepeatedOnMainThread,以便主线程基准测试(例如触摸视图或 Compose UI 的基准测试)可以避免触发 ANR,尤其是在 CI 中的大型套件期间。(I5c86d
  • 添加了 FrameTimingGfxInfoMetric,这是 FrameTimingMetric 的实验性替代实现,其测量值直接来自平台,而不是从 Perfetto 追踪中提取。(I457cbb/322232828
  • 添加了在单个 warmUp 迭代期间转储 ART 配置文件的能力。(I17923
  • TraceSectionMetric API 的一些更改
    • 添加 Mode.MinMode.Max
    • 添加标签参数以覆盖节名称作为指标标签
    • 将模式名称添加到输出中以阐明指标含义
    • 将默认值更改为 sum,因为此指标的大多数用途都是针对重复事件。请注意 CI 使用中的这些更改,因为它可能会创建不连续性或破坏解析。(Ic1e82b/301892382b/301955938

错误修复

  • 在指定的托管设备不存在时,改进了基线配置文件 Gradle 插件中的错误消息(Idea2bb/313803289
  • 在 AGP 8.3.0-alpha15 之前修复了在 AAR 中包含库基线配置文件的问题(I1d2afb/313992099
  • 修复了生成任务结束时基线和启动配置文件输出 URL(I802e5b/313976958
  • 调整了数据源超时,以尝试修复 java.lang.IllegalStateException: Failed to stop [ProcessPid(processName=perfetto, pid=...)]I8dc7db/323601788
  • 添加两个 instrumentation 参数,用于覆盖着色器丢弃行为,以解决在对未使用 ProfileInstaller 1.3 的应用进行基准测试时发生的崩溃问题。
    • androidx.benchmark.dropShaders.enable=true/false:可用于跳过所有着色器丢弃(包括在 StartupMode.Cold 启动中进行的丢弃),尤其是在对尚未使用 profileinstaller 1.3 的应用进行基准测试时。
    • androidx.benchmark.dropShaders.throwOnFailure=true/false:可用于容忍尝试丢弃着色器时发生的失败,例如在对未安装 profileinstaller 1.3 的应用进行基准测试时。( I4f573)
  • 当预期UI线程上的方法跟踪耗时超过几秒钟时,跳过该跟踪,并在抛出异常时清理方法跟踪。(I6e768)
  • 当文件名超过 200 个字符时抛出异常,以避免在写入或后期处理文件时出现不明确的崩溃。(I4a5ab
  • 修复了跟踪开始和结束处未终止的帧可能被配对在一起的问题,这会导致错误地报告为单个极长的帧。(I39353, b/322232828)
  • 在 API 30+ 上重新安装 API 30-33 的包时,使用--skip verification清除用户构建上的 ART 配置文件。这有助于绕过在某些类型的设备上导致失败的 Play Protect 警告。(Ic9e36)
  • 当非系统应用(如系统 UI 或启动器)时,使用am force-stop终止应用。(I5e028)
  • Macrobenchmark 现在等待1 秒以使目标应用程序刷新 ART 配置文件(之前等待500 毫秒)。(I85a50, b/316082056)
  • 改进 FrameTimingMetric 在未生成帧时的错误,并在指标解析失败时始终输出指向跟踪的链接,以帮助诊断问题。( I956b9)
  • 修复了FrameTimingMetric中无法解析帧 ID(尤其是在某些 OEM 设备上)导致的崩溃问题。(Ia24bc, b/303823815, b/306235276)
  • 放宽了 FrameMetrics 中检查的严格性,并向错误消息添加了更多详细信息。( Iadede)

1.2 版本

1.2.4 版本

2024年4月17日

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

错误修复

  • 修复了基线配置文件 srcset 未在基准变体中设置的问题。还修复了库中automaticGenerationDuringBuild导致循环依赖的问题。(I28ab7, b/333024280)
  • 当非系统应用(如系统 UI 或启动器)时,使用am force-stop终止应用。这修复了由于进程终止未完全成功而导致StartupMode.COLD基准测试因“Package $package must not be running prior to cold start!”而崩溃的问题。(I5e028)

1.2.3 版本

2024年1月24日

已发布androidx.benchmark:benchmark-*:1.2.31.2.3 版本包含这些提交。

错误修复

  • 当 AGP 版本为 8.3.0 或更高版本时,从基线配置文件 Gradle 插件中删除异常。
  • 在 AGP 8.3.0-alpha15 之前,修复了在 AAR 中包含库基线配置文件的问题。

1.2.2 版本

2023年12月1日

已发布androidx.benchmark:benchmark-*:1.2.21.2.2 版本包含这些提交。

基线配置文件

1.2.1 版本

2023年11月15日

已发布androidx.benchmark:benchmark-*:1.2.11.2.1 版本包含这些提交。

新功能

1.2.0 版本

2023年10月18日

已发布androidx.benchmark:benchmark-*:1.2.01.2.0 版本包含这些提交。

自 1.1.0 版本以来的重要更改

基线配置文件

  • 新的基线配置文件 Gradle 插件 自动执行在您的测试和构建工作流程中捕获和包含基线配置文件。
  • BaselineProfileRule.collect 现在稳定,它是以前实验性BaselineProfileRule.collectBaselineProfile API 的精简版本
    • 只需指定packageName,并驱动您的应用
  • 对于生成基线配置文件的库,您现在可以在代码中(BaselineProfileRule.collect 参数)或更简单地在 Gradle 插件中过滤生成的规则
  • 修复

宏基准测试

  • 编译
    • Macrobenchmark 现在可以正确地完全重置每次编译的编译状态——这需要在 Android 14 之前重新安装 APK,因此如果您希望在正在衡量的对象中保留状态(如用户登录),强烈建议在 Android 14+ 上进行基准测试。
    • 您还可以通过单独控制应用程序编译并使用CompilationMode.Ignore()检测参数跳过编译来解决此问题
  • 检测参数

    • 支持androidx.benchmark.dryRunMode.enable 检测参数(已在微基准测试中可用),用于更快速的验证运行(例如,在创建基准测试时或在预提交时)
    • 支持androidx.benchmark.profiling.mode=StackSamplingMethodTracing
    • 添加了androidx.benchmark.enabledRules 以允许运行时过滤基线配置文件与宏基准规则测试
    • 添加了androidx.benchmark.perfettoSdkTracing.enable 参数以启用使用 tracing-perfetto 进行跟踪,例如 Compose 重新组合跟踪。请注意,当与StartupMode.COLD一起使用时,由于跟踪库是在应用程序启动期间加载和启用的,因此计时将受到显着影响。
  • 需求

    • Macrobenchmark 现在需要目标应用程序中版本 1.3.0 或更高的ProfileInstaller,以启用配置文件捕获/重置和着色器缓存清除。
  • 新的实验性指标 API

  • 修复

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

微基准测试

  • 功能
    • 分析已移至单独的阶段,位于其他指标之后,因此一个测试运行可以同时显示准确的计时和分析结果。
  • 实验性 API
    • 添加了实验性的MicrobenchmarkConfig API,用于定义自定义指标和配置跟踪和分析。可用于捕获方法跟踪或捕获跟踪点(但请注意跟踪开销)。
    • 添加了实验性 API,用于分别控制BenchmarkStateBenchmarkRule,无需 JUnit
    • 添加了实验性的PerfettoTrace 记录以启用捕获 Perfetto 跟踪,并具有自定义配置,独立于基准 API。
  • 修复
    • 解决 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-rc021.2.0-rc02 版本包含这些提交。

错误修复

  • 修复基准文件输出,不再破坏BaselineProfile插件文件复制。文件已生成并从设备复制,但已重命名,因此 Gradle 插件无法看到它们。(I8dbcc, b/303034735, b/296453339)
  • 阐明了将tracing-perfetto从宏基准模块注入目标应用程序时出现的加载错误消息。

1.2.0-rc01 版本

2023年9月20日

已发布androidx.benchmark:benchmark-*:1.2.0-rc011.2.0-rc01 版本包含这些提交。

错误修复

  • 当 Perfetto SDK 跟踪无法在基准测试中初始化时,现在会抛出一个异常(包含补救说明)。(I6c878, b/286228781)
  • 修复了将 ART 方法追踪转换为 Perfetto 格式时的 OOM 崩溃问题。(I106bdb/296905344
  • (宏基准测试)在 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

错误修复

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

1.2.0-beta03 版本

2023 年 8 月 9 日

androidx.benchmark:benchmark-*:1.2.0-beta03 已发布。1.2.0-beta03 版本包含这些提交。

API 变更

  • 添加了一个参数,用于将 TraceSectionMetric 过滤到仅目标包,默认启用。(Ia219bb/292208786

错误修复

  • 为了与工件名称和其他引用保持一致,将 fullTracing.enable 检测参数重命名为 perfettoSdkTracing.enablefullTracing.enable 将继续作为后备方案使用。(I7cc00
  • 基准库内部跟踪点(包括微基准循环/阶段跟踪)现在将显示在 Studio 系统跟踪查看器中,并在 Perfetto 中嵌套在正确的进程下。(I6b2e7b/293510459
  • 删除了 API 31+ 上的宏基准测试不可分析错误,并在 eng/userdebug 根设备上跳过可分析性检查。(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

错误修复

  • 在操作系统配置错误导致跟踪失败时,宏基准测试会报告错误,此问题最近在 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 版本包含这些提交。

错误修复

  • 修复了 Studio 中基准测试输出中警告有时被抑制的问题,并解决了 Studio 中基准测试输出中的前导空格无法显示的问题。(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

错误修复

  • 宏基准测试支持 androidx.benchmark.profiling.mode = MethodTracing。(I7ad37b/285912360
  • 微基准测试分析已移至单独的阶段,因此它在测量之后按顺序执行,而不是替换它。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 参数更改为非空,并使用等效的默认值,以便在文档中更清晰地说明默认过滤行为。(I3816e

错误修复

  • dryRunMode 中禁用 IsolationActivity 和 Perfetto 跟踪以显著提高性能,因为这些是大部分运行时。(Ie4f7d
  • 使用检测测试参数 androidx.benchmark.profiling.mode=StackSamplingandroidx.benchmark.profiling.sampleFrequency 支持宏基准测试中的调用堆栈采样。(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 版本包含这些提交。

错误修复

  • 修复了 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 跟踪支持,其中包括微基准测试和实验性 PerfettoTrace API。在此版本之前,某些设备上的 UiAutomation 连接不可靠。(I78e8c
  • 添加了用于 PerfettoTraceProcessor 的公共实验性 API,以启用解析追踪内容。这是朝着基于 Perfetto 追踪数据的完全自定义指标迈出的一步。(I2659eb/219851406

1.2.0-alpha11 版本

2023 年 3 月 8 日

已发布 androidx.benchmark:benchmark-*:1.2.0-alpha111.2.0-alpha11 版本包含这些提交。

错误修复

  • 修复了在使用包含多个 APK 的应用包重新安装或提取配置文件时,MacrobenchmarkRuleBaselineProfileRule 中的崩溃问题。(I0d8c8b/270587281

1.2.0-alpha10 版本

2023 年 2 月 22 日

已发布 androidx.benchmark:benchmark-*:1.2.0-alpha101.2.0-alpha10 版本包含这些提交。

新功能

  • 在 Android 14 及更高版本上,宏基准测试不再重新安装目标应用程序以重置编译状态,这要归功于新的平台功能。以前,需要一个已 root 的设备,或者在每次基准测试运行之前处理所有应用程序状态(例如用户登录)的移除。(I9b08cb/249143766

错误修复

  • 修复了 DryRunMode 在使用空配置文件时不再崩溃的问题,这是由于跳过了编译。相反,它运行单次迭代并提取配置文件以确保捕获到某些内容。(I2f05db/266403227
  • 修复了在旧 API 级别上检查 powerstats 是否存在时 PowerMetric 崩溃的问题。(5faaf9b/268253898

1.2.0-alpha09 版本

2023 年 1 月 11 日

已发布 androidx.benchmark:benchmark-*:1.2.0-alpha091.2.0-alpha09 版本包含这些提交。

错误修复

  • 启用将 None 传递给 androidx.benchmark.enabledRules instrumentation 参数以禁用所有基准测试/基线配置文件生成。(I3d7fdb/258671856
  • 修复了应用模块(即非自检测测试 APK)中的 PerfettoTrace 捕获问题。(I12cfc
  • 修复了 Studio 输出中基线配置文件 adb pull 参数的顺序问题。(I958d1b/261781624
  • 现在在尝试运行宏基准测试时,会正确识别 Arm 模拟器 api 33,并会正确打印警告。(69133bb/262209591
  • 在宏基准测试中,跳过没有电池的设备的电池电量检查。(fe4114b/232448937

1.2.0-alpha08 版本

2022 年 12 月 7 日

已发布 androidx.benchmark:benchmark-*:1.2.0-alpha081.2.0-alpha08 版本包含这些提交。

API 变更

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

错误修复

  • 改进了文件输出写入的安全性,这应该可以防止输出文件静默地未写入/追加,尤其是在 API 21/22 上。(If8c44b/227510293
  • 修复了 simpleperf 追踪输出以正确创建和放置文件。这通常还应该修复 Gradle 不成功拉取文件的问题。(I12a1cb/259424099
  • 改进了在 profileinstaller 过旧时打印的错误消息。现在,它会告诉您更新 profileinstaller 版本 (1.2.1) 以在 API 31 到 33 上测量基线配置文件,而不是说它不受支持。(Ia517fb/253519888
  • 修复了 API <=23 上的几个 shell 命令失败错误消息打印,包括失败的 perfetto 捕获二进制文件设置和追踪捕获失败。(Ib6b87b/258863685
  • 自动对生成的配置文件规则进行排序,以最大程度地减少它们随时间变化时的更改次数(将配置文件规则签入源代码管理时)。(Ie2509)
  • 修复了 Android 13(API 33)以下的未 root 版本上的崩溃问题,消息为 Expected no stderr from echo 3 > /proc/sys/vm/drop_caches (I6c245b/259508183)

已知问题 - MacrobenchmarkScope.dropShaderCache() 可能由于 profileinstaller 清单中缺少广播注册表而崩溃,该注册表尚未发布。(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-alpha071.2.0-alpha07 版本包含这些提交。

API 变更

  • 添加了用于测量宏基准测试中的能量和功率的 PowerMetric API。(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) 将报告宏基准测试中用于膨胀的总时间的指标 inflateMs。还删除了 API 29 要求,因为 TraceSectionMetricandroidx.tracing.Trace 一同工作,回溯到较低的 API 级别,并使用目标应用程序中的 forceEnableAppTracing。(Id7b68b/231455742

错误修复

  • 通过验证所有输出/错误,提高了所有内部 shell 命令的安全性。(I5984db/255402908b/253094958
  • 在基线配置文件 adb pull 命令中指定设备,以便如果连接了多个设备(最多一个模拟器),可以简单地复制 pull 命令。(I6ac6cb/223359380
  • 如果宏基准测试 apk 未设置为自检测,则会添加错误。此错误可防止从目标应用程序的进程中进行宏基准测试。在进程中,宏基准测试将无法编译/终止/冷启动应用程序,也无法控制其自身的权限。(I4279b
  • 修复了 measureRepeated() 中的一个问题,其中 StartupMode.COLDsetupBlock 之后不会终止目标进程。现在,与应用程序交互的 setupBlock 将不会留下正在运行的应用程序进程,以及无效的冷启动测量。(I8ebb7

1.2.0-alpha06 版本

2022 年 10 月 24 日

已发布 androidx.benchmark:benchmark-*:1.2.0-alpha061.2.0-alpha06 版本包含这些提交。

API 变更

  • BaselineProfileRule 在 Android 13 (API 33) 上不再需要 root 权限,并且不再是实验性的。(Ie0a7db/250083467b/253094958
    • 此更改还修复了如何在未 root 设备上将来自应用程序的配置文件刷新到磁盘,但这需要更新目标应用程序的 profileinstaller 依赖项。
    • 要在未 root 设备上使用 BaselineProfileRuleCompilationMode.Partial(warmupIterations),还必须将目标应用程序更新为使用 androidx.profileinstaller.profileinstaller:1.3.0-alpha01。这将启用将配置文件正确刷新到磁盘,以便可以编译/提取它。

错误修复

  • 修复了 API 33+ 上 SampledProfiling 崩溃的问题。(I40743b/236109374

1.2.0-alpha05 版本

2022 年 10 月 5 日

已发布 androidx.benchmark:benchmark-*:1.2.0-alpha051.2.0-alpha05 版本包含这些提交。

错误修复

  • 修复了 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-alpha041.2.0-alpha04版本包含这些提交。

新功能

  • 为宏基准测试添加了对dryRunMode.enable instrumentation 参数的支持(微基准测试中已可用),以便更快地进行本地开发和验证应用程序自动化(例如,在预提交中)。这会将迭代次数覆盖为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'
        }
    }
    

错误修复

  • 修复了StartupTimingMetric,使其不再需要通过MacrobenchmarkScope.startActivityAndWait()启动测量的Activity。这意味着该指标可以捕获来自例如通知、Context.startActivity()、应用内基于Activity的导航或shell命令的启动。(Ia2de6b/245414235)
  • 修复了startActivityAndWait在模拟器上尝试等待启动完成时会超时的问题,方法是降低帧检测的严格性。(Ibe2c6b/244594339b/228946895)

1.2.0-alpha03版本

2022年9月7日

发布了androidx.benchmark:benchmark-*:1.2.0-alpha031.2.0-alpha03版本包含这些提交。

新功能

  • 添加了用于独立使用BenchmarkState(与BenchmarkRule/JUnit4分离)的实验性API。(Id478fb/228489614)

错误修复

1.2.0-alpha02版本

2022年8月24日

发布了androidx.benchmark:benchmark-*:1.2.0-alpha021.2.0-alpha02版本包含这些提交。

API 变更

  • 即使已root,也默认对MacrobenchmarkScope.killProcess()使用am force stop,但在生成基线配置文件期间除外。这可以通过可选的布尔参数来覆盖。(02cce9b/241214097)

错误修复

1.2.0-alpha01版本

2022年7月27日

发布了androidx.benchmark:benchmark-*:1.2.0-alpha011.2.0-alpha01版本包含这些提交。

新功能

  • 新的tracing-perfetto-common组件允许工具在公开它的应用程序中启用Perfetto SDK跟踪 (I2cc7f)
  • 添加了androidx.benchmark.enabledRules instrumentation 参数,以启用将宏基准测试运行过滤为仅基准测试或仅基线配置文件生成。例如,仅在模拟器上生成BaselineProfiles时,传入“Macrobenchmark”或“BaselineProfile”即可只运行一种类型的测试。也支持逗号分隔的列表。(I756b7b/230371561)

    例如,在您的宏基准测试的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添加了一个新参数,用于按包名过滤输出文件 (If7338, b/220146561)
  • 使开发人员能够放电设备以测量功耗。(I6a6cb)
  • 添加了在MacrobenchmarkScope中清除着色器缓存的功能。(I32122)
  • 使开发人员能够配置所需指标类型和详细子系统类别的显示。(I810c9)
  • 以前,如果在不受支持的设备上运行,基准测试中会抛出UnsupportedOperationException。现在,只有在不受支持的设备上使用指标时(即:PowerMetric.configure),才会发生UOE。(I5cf20b/227229375)
  • 添加了TotalPowerMetricTotalEnergyMetric,用于测量宏基准测试中每个系统类别中的总功率和能量。(I3b26bb/224557371)

错误修复

  • 修复了一个问题,即在未root的构建中,编译后的方法在每个宏基准测试之间没有正确重置。不幸的是,这需要在每次迭代中重新安装apk,这将清除每个宏基准测试的应用程序数据。(I31c74b/230665435)
  • 修复了API 21/22上的跟踪记录崩溃问题 (If7fd6, b/227509388, b/227510293, b/227512788)
  • 彻底修改了活动启动完成检测,以修复启动宏基准测试中“无法读取任何指标”异常。(Ia517c)

1.1.1版本

1.1.1版本

2022 年 11 月 9 日

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

错误修复

  • 修复了android.system.ErrnoException: open failed: EACCES错误,该错误会在某些Android 11(API 30)+设备上发生。这是来自1.2.0-alpha01的修复程序的cherry-pick。(aosp/2072249)

1.1.0版本

1.1.0版本

2022年6月15日

发布了androidx.benchmark:benchmark-*:1.1.01.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-rc031.1.0-rc03版本包含这些提交。

错误修复

1.1.0-rc02版本

2022年5月11日

发布了androidx.benchmark:benchmark-*:1.1.0-rc021.1.0-rc02版本包含这些提交。

  • 请注意,此版本包含行为更改,因为现在在每个基准测试之间都会完全重新安装应用程序,以确保准确的测量。

错误修复/行为更改

  • 修复了一个问题,即应用程序编译在宏基准测试之间没有正确重置,并且在未root的构建中根本没有重置。这修复了许多运行多个测试会导致CompilationMode对测量几乎没有影响的情况。为了解决此问题,目标应用程序现在在每个测试方法中都会完全重新安装,这将清除每个宏基准测试之间的应用程序数据。(I31c74b/230665435)

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

    例如,在您的宏基准测试的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 instrumentation 参数,可以使宏基准测试和基线配置文件生成测试之间共享模块。例如,仅在模拟器上生成BaselineProfiles时,传入“Macrobenchmark”或“BaselineProfile”即可只运行一种类型的测试。(I756b7b/230371561)

    例如,在您的宏基准测试的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-rc011.1.0-rc01版本包含这些提交。

错误修复

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

1.1.0-beta06版本

2022年4月6日

发布了androidx.benchmark:benchmark-*:1.1.0-beta061.1.0-beta06版本包含这些提交。

错误修复

  • 修复了API 21/22上的跟踪记录崩溃问题 (If7fd6, b/227509388)
  • 彻底修改了活动启动完成检测,以修复启动宏基准测试中“无法读取任何指标”异常。(Ia517c)
  • 当使用CompilationMode.None()时,修复宏基准测试的启动指标。在此更改之前,CompilationMode.Partial()似乎比Compilation.None()慢。(611ac9)。

1.1.0-beta05版本

2022年3月23日

发布了androidx.benchmark:benchmark-*:1.1.0-beta051.1.0-beta05版本包含这些提交。

错误修复

1.1.0-beta04版本

2022年2月23日

发布了androidx.benchmark:benchmark-*:1.1.0-beta041.1.0-beta04版本包含这些提交。

错误修复

  • 修复了Android 10上缺少指标以及由进程名称未在跟踪中正确捕获导致的NoSuchElementException问题。(Ib4c17, b/218668335)

  • 在Q(API 29)及更高版本上使用PowerManager进行热限制检测。这大大降低了热限制检测中误报的频率(基准测试在90秒冷却后重试),并显著加快了用户构建中的基准测试速度。它还可以在时钟锁定(如果时钟锁定过高而超出设备的物理环境)时提供限制检测。(I9c027, b/217497678, b/131755853)

  • 将simpleperf采样分析过滤到仅measureRepeated线程,以简化检查(Ic3e12, b/217501939)

  • 支持多进程应用中来自命名UI子进程的指标(Ice6c0, b/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-beta031.1.0-beta03版本包含这些提交。

API 变更

  • 在宏基准测试库中添加了AudioUnderrunMetric(处于实验性标志下),以允许检测音频欠载。(Ib5972)
  • BaselineProfileRule不再接受setup块,因为它的功能与profileBlock相同。(Ic7dfe, b/215536447)

    例如:

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

错误修复

  • 修复了在后续运行中,当链接到Studio输出时,微基准测试分析器跟踪无法更新的问题。(I5ae4d, b/214917025)
  • 防止在API 23上执行编译shell命令(Ice380)
  • 重命名FrameCpuTime -> FrameDurationCpuFrameUiTime -> FrameDurationUi,以明确这些是持续时间,而不是时间戳,并与前缀匹配。(I0eba3, b/216337830)

1.1.0-beta02版本

2022年1月26日

发布了androidx.benchmark:benchmark-*:1.1.0-beta021.1.0-beta02版本包含这些提交。

错误修复

  • 微基准测试堆栈采样/方法跟踪配置文件结果现在链接在Studio输出中,类似于其他配置文件输出,并且不会抑制分配指标。(Idcb65, b/214440748, b/214253245)
  • BaselineProfileRule现在在logcat和Studio输出中打印adb pull命令,用于提取生成的BaselineProfile文本文件。(f08811)

1.1.0-beta01版本

2022年1月12日

发布了androidx.benchmark:benchmark-*:1.1.0-beta011.1.0-beta01版本包含这些提交。

错误修复

  • 修复了分析器参数启用被忽略的问题。(I37373, b/210619998)
  • 删除了已弃用的CompliationModes(I98186, b/213467659)
  • 为了清晰起见,将CompilationMode.Partial的基线配置文件参数切换为枚举。(Id67ea)

1.1.0-alpha13版本

2021年12月15日

发布了androidx.benchmark:benchmark-*:1.1.0-alpha131.1.0-alpha13版本包含这些提交。

API 变更

  • 在Android Q(API 29+)上向微基准测试输出添加低开销系统跟踪。请注意,这目前不会捕获自定义跟踪(通过android.os.Traceandroidx.tracing Jetpack API),以避免影响结果。此跟踪应该有助于诊断不稳定性,特别是来自基准测试之外的来源。(I298be, b/205636583, b/145598917)
  • CompilationModes明确分为三类 - 完全、无、部分。以前,它们的名字与编译参数(我们现在将其视为实现细节)和功能不一致。这使得跨平台版本的权衡、潜在组合和行为更加清晰。(I3d7bf, b/207132597)
  • 设置和测量现在始终成对出现,按顺序排列。您现在可以查询包名称和迭代次数(尽管在某些预热情况下,迭代次数可能是null)。(Id3b68, b/208357448, b/208369635)

错误修复

  • 修复了CompilationMode.Speed被错误地视为None的问题(I01137)

1.1.0-alpha12版本

2021年11月17日

发布了androidx.benchmark:benchmark-*:1.1.0-alpha121.1.0-alpha12版本包含这些提交。

新功能

  • 添加了实验性的TraceSectionMetric,用于基于自定义跟踪的时间测量。(I99db1, b/204572664)

错误修复

  • 每次迭代唤醒设备,以确保可以测试UI - 需要禁用锁屏。(Ibfa28, b/180963442)
  • 修复了模拟器和非ROOT设备上堆栈采样分析模式中的多个崩溃问题(Icdbda, b/202719335)
  • 删除了每次迭代结束时的0.5秒睡眠 - 如果您在此更改后看到缺少指标,请提交错误报告。(Iff6aa)
  • 减少数据丢失的可能性,并降低跟踪的内存开销(Id2544, b/199324831, b/204448861)
  • 通过切换到紧凑的调度存储格式,将跟踪大小减少约40%。(Id5fb6, b/199324831)
  • 更新了启动指标的实现,使其始终在渲染线程结束时结束。这将使跨平台版本更加一致,并且更贴近应用内测量。(Ic6b55)

1.1.0-alpha11版本

2021年11月3日

发布了androidx.benchmark:benchmark-*:1.1.0-alpha111.1.0-alpha11版本包含这些提交。

API 变更

  • 宏基准测试的minSdkVersion现在为23。(If2655)
  • 添加了一个新的实验性BaselineProfileRule,它能够为应用程序的关键用户旅程生成基线配置文件。详细文档随后提供。(Ibbefa, b/203692160)
  • 删除了measureRepeated接口变体,该变体是为Java调用者添加的,因为它导致在完成/解析方法时出现歧义。Java调用者将再次需要从measureRepeated返回Unit.Instance。如果这造成不便,请提交错误报告,我们可以在未来的版本中重新考虑这一点。(Ifb23e, b/204331495)

1.1.0-alpha10版本

2021年10月27日

发布了androidx.benchmark:benchmark-*:1.1.0-alpha101.1.0-alpha10版本包含这些提交。

API 变更

  • 向后移植StartupTimingMetric以支持API 23。此新实现还更好地处理reportFullyDrawn()以等待渲染相应的內容。(If3ac9, b/183129298)
  • 为Java调用者向多个MacrobenchmarkScope方法添加了JvmOverloads。(I644fe, b/184546459)
  • 提供替代的MacrobenchmarkRule.measureRepeated函数,该函数使用Consumer<MacrobenchmarkScope>以便在Java语言中进行惯用用法。(If74ab, b/184546459)

错误修复

  • 修复了跟踪启动不够早以及缺少指标数据的问题。这应该可以修复由库本身引起的“在基准测试期间无法读取任何指标”异常。(I6dfcb, b/193827052, b/200302931)
  • FrameNegativeSlack已重命名为FrameOverrun,以阐明其含义 - 帧超出其时间预算的程度。(I6c2aa, b/203008701)

1.1.0-alpha09版本

2021年10月13日

发布了androidx.benchmark:benchmark-*:1.1.0-alpha091.1.0-alpha09版本包含这些提交。

错误修复

1.1.0-alpha08版本

2021年9月29日

已发布 androidx.benchmark:benchmark-*:1.1.0-alpha081.1.0-alpha08 版本包含以下提交。

API 变更

  • 启用滚动宏基准测试,使其能够运行回 API 23 (If39c2b/183129298)
  • 向 UI 和 JSON 输出添加了一种新的采样指标类型,重点关注每次迭代多个样本的分位数。(I56247b/199940612)
  • 切换到贯穿基准库的浮点指标(在 Studio UI 中被截断)。(I69249b/197008210)

1.1.0-alpha07 版本

2021 年 9 月 1 日

已发布 androidx.benchmark:benchmark-*:1.1.0-alpha071.1.0-alpha07 版本包含以下提交。

API 变更

  • 将最低 API 提升至 21,以反映未来预期支持的最低 API 级别。当前支持的最低 API 继续通过 RequiredApi() 传达,当前为 29 (I440d6b/183129298)

错误修复

  • 修复了 ProfileInstaller,使其更易于使用基线配置文件的应用程序使用 CompilationMode.BaselineProfile 运行 MacroBenchmarks。(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-alpha061.1.0-alpha06 版本包含以下提交。

API 变更

  • 添加了 androidx.benchmark.iterations 检测参数,允许在本地测试/分析时手动覆盖迭代次数。(6188beb/194137879)

错误修复

  • 在 API 29+ 上切换到 Simpleperf 作为默认采样分析器。(Ic4b34b/158303822)

已知问题

  • CompilationMode.BaselineProfile 仍在开发中。目前请避免使用它来确定概要文件的质量。

1.1.0-alpha05 版本

2021 年 8 月 4 日

已发布 androidx.benchmark:benchmark-*:1.1.0-alpha051.1.0-alpha05 版本包含以下提交。

1.1.0-alpha04 由于间歇性崩溃而取消发布。 b/193827052

API 变更

错误修复

  • 降低热限制检测的积极性,如果频繁检测到限制,则重新计算基线。(I7327b)
  • 修复 FrameTimingMetric 以使其在 Android S Beta 上运行。(Ib60ccb/193260119)
  • 使用 EmptyActivity 将目标应用程序从强制停止状态中释放出来,以更好地支持 CompilationMode.BaselineProfile。(Id7cacb/192084204)
  • 将跟踪文件扩展名更改为 .perfetto-trace 以匹配平台标准。(I4c236b/174663039)
  • StartupTimingMetric 现在输出“fullyDrawnMs”指标,以衡量应用程序完成渲染所需的时间。要在您的应用程序中定义此指标,请在初始内容准备好时(例如,当您的初始列表项从数据库或网络加载时)调用 Activity.reportFullyDrawn。 (reportFullyDrawn 方法无需构建版本检查即可在 ComponentActivity 上使用)。请注意,您的测试必须运行足够长的时间才能捕获指标(startActivityAndWait 不会等待 reportFullyDrawn)。(If1141b/179176560)
  • 将向跟踪追加 UI 元数据成本降低 50+ 毫秒 (Ic8390b/193923003)
  • 大幅提高了停止跟踪时的轮询频率,这可以将启动基准运行时间减少 30+% (Idfbc1b/193723768)

1.1.0-alpha03 版本

2021 年 6 月 16 日

已发布 androidx.benchmark:benchmark-*:1.1.0-alpha031.1.0-alpha03 版本包含以下提交。

新功能

错误修复

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

    例如:

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

1.1.0-alpha02 版本

2021 年 5 月 18 日

基准测试 1.1.0-alpha02 版本带来了一个重要的基准测试组件 - Macrobenchmark。除了允许您测量 CPU 循环的 *benchmark* 之外,*macrobenchmark* 还允许您测量整个应用程序的交互(例如启动和滚动),并捕获跟踪。有关更多信息,请参阅 库文档

已发布 androidx.benchmark:benchmark-*:1.1.0-alpha021.1.0-alpha02 版本包含以下提交。

新功能

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

  • 捕获应用程序的启动、滚动/动画性能指标,无论是在本地还是在 CI 中。
  • 在 Android Studio 中捕获和检查跟踪。

错误修复

  • 解决了 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-alpha011.1.0-alpha01 版本包含以下提交。

1.1 版的新功能

  • 内存分配指标 - 基准测试现在会在预热和计时后运行一个额外的阶段,捕获内存分配计数。内存分配可能会在较旧版本的平台上导致性能问题(在 O 中为 140ns,在 M 中为 8ns - 在 Nexus5X 上测量,时钟锁定)。此指标显示在 Android Studio 控制台输出中,以及在
  • 性能分析支持 - 您现在可以捕获基准测试运行的性能分析数据,以检查代码运行缓慢的原因。基准测试支持捕获 ART 的方法跟踪或方法采样。可以使用 Android Studio 中的性能分析器通过 *文件 > 打开* 来检查这些文件。
  • Benchmark Gradle 插件现在提供默认设置以简化设置。
    • 默认情况下将 testBuildType 设置为 release,以避免使用内置代码覆盖率的依赖项。release buildType 也被配置为默认 buildType,这允许 Android Studio 在第一次打开项目时自动选择正确的构建变体。(b/138808399)
    • signingConfig.debug 用作默认签名配置 (b/153583269)

**错误修复**

  • 大幅减少了预热转换开销,其中每个基准测试的第一次测量人为地高于其他测量。这个问题在非常小的基准测试(1 微秒或更短)中更为明显。(b/142058671)
  • 修复了从命令行运行时为每个基准测试打印的 InstrumentationResultParser 错误。(I64988b/154248456)

已知问题

  • Benchmark 的命令行、Gradle 调用不会直接打印出结果。您可以通过在 Studio 中运行或解析 JSON 输出文件以获取结果来解决此问题。
  • 基准测试报告无法从安装了应用程序 ID 以“android”或“download”(不区分大小写)结尾的应用的设备中提取报告。遇到此问题的用户应将 Android Gradle Plugin 升级到 4.2-alpha01 或更高版本。

1.0.0 版本

基准测试版本 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 版本的主要功能

基准测试库允许您编写应用程序代码的性能基准测试并快速获得结果。

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

主要功能包括

  • 时钟稳定
  • 自动线程优先级
  • 支持 UI 性能测试,例如在 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 追踪

错误修复

  • 修复了由于优先级降低导致 JIT 在预热之前无法完成的度量不稳定性问题 (b/140773023)
  • 统一了 Android Gradle Plugin 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)

错误修复

  • 添加了 androidx.annotation:android-experimental-lint 依赖项,以便 Java 代码在不使用实验性 API 时能够正确生成 lint 错误,类似于 Kotlin 实验性注释为 Kotlin 调用者提供的功能。
  • 现在可以在 Android Gradle Plugin 3.6 中正确检测 additionalTestOutputDir instrumentation 参数的输出用法,以了解 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 现在被标记为实验性

错误修复

  • 修复了时钟锁定脚本,该脚本在缺少 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 的情况下使用基准测试库的新文档,包括与不同构建系统(例如 Bazel 或 Buck)一起使用的情况,以及在 CI 中运行的情况。有关更多信息,请参阅 在没有 Gradle 的情况下构建基准测试在持续集成中运行基准测试

新功能

  • Gradle 插件
    • 现在自动禁用测试覆盖率,并默认设置 AndroidBenchmarkRunner (b/138374050)
    • 在运行基准测试和使用 AGP 3.6+ 时,添加了对基于新 AGP 的数据复制的支持
  • JSON 格式添加
    • 输出总基准测试运行时间 (b/133147694)
    • 使用名称字符串的 @Parameterized 基准测试(例如 @Parameters(name = "size={0},depth={1}"))现在在 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 中
    • 可以使用 instrumentation 参数将这些错误还原为警告。例如:-e androidx.benchmark.suppressErrors "DEBUGGABLE,LOW_BATTERY"

错误修复

  • 在 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 报告中公开由于热节流而导致的每个基准测试的睡眠持续时间

错误修复

  • 不再需要在 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)
    • 将测试运行上下文信息(例如设备和构建信息以及时钟是否已锁定)添加到顶级对象 (b/132711920)
    • 时间指标名称现在在其名称中包含“ns”(b/132714527)
    • 为每个报告的指标添加了其他统计信息(最大值、中位数、最小值),并删除了简化的“纳秒”汇总统计信息 (b/132713851)
  • 删除了 XML 输出 (b/132714414)

  • BenchmarkState.reportData API 中删除了热节流检测 (b/132887006)

错误修复

  • 修复了 ./gradlew lockClocks 在某些最新的操作系统设备上不起作用的问题 (b/133424037)
  • 为模拟器禁用了节流检测 (b/132880807)

1.0.0-alpha01 版本

2019 年 5 月 7 日

androidx.benchmark:benchmark:1.0.0-alpha01 版本已发布。此版本中包含的提交可以在这里找到 这里