ProfileInstaller

  
让库能够提前预填充要由 ART 读取的编译轨迹。
最近更新时间 稳定版 候选版 Beta 版 Alpha 版
2024 年 9 月 4 日 1.3.1 1.4.0-rc01 - -

声明依赖项

如需添加 ProfileInstaller 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库

在应用或模块的 build.gradle 文件中添加所需工件的依赖项:

Groovy

dependencies {
    implementation "androidx.profileinstaller:profileinstaller:1.4.1"
}

Kotlin

dependencies {
    implementation("androidx.profileinstaller:profileinstaller:1.4.1")
}

如需详细了解依赖项,请参阅添加 build 依赖项

反馈

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

创建新问题

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

版本 1.4

版本 1.4.0-rc01

2024 年 9 月 4 日

发布了 androidx.profileinstaller:profileinstaller:1.4.0-rc01,该版本与上一个 Beta 版相比没有变化。版本 1.4.0-rc01 中包含这些提交内容

版本 1.4.0-beta01

2024 年 8 月 21 日

发布了 androidx.profileinstaller:profileinstaller:1.4.0-beta01,该版本与上一个 Alpha 版相比没有变化。版本 1.4.0-beta01 包含这些提交内容

版本 1.4.0-alpha02

2024 年 8 月 7 日

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

新功能

  • 向配置文件安装程序添加了 API 35 支持。(6f9f6fa)

bug 修复

  • 移除了对新平台 API 访问权限的手动概述,因为在将 R8 与 AGP 7.3 或更高版本(例如 R8 版本 3.3)搭配使用时,系统会自动通过 API 建模来实现上述目的;而对于使用 AGP 8.1 或更高版本(例如 D8 版本 8.1)的所有 build,这种情况会自动发生。建议未使用 AGP 的客户端更新到 D8 8.1 或更高版本。详情请参阅这篇文章。(If6b4cb/345472586

版本 1.4.0-alpha01

2024 年 2 月 7 日

发布了 androidx.profileinstaller:profileinstaller:1.4.0-alpha01版本 1.4.0-alpha01 中包含这些提交内容

bug 修复

  • 为配置文件验证程序中未嵌入任何配置文件添加了错误代码。(Ifb109b/313928520
  • 修复了在 Android U (API 34) 及模拟器上丢弃着色器时崩溃的问题。(I031cab/274314544
  • 在配置文件安装程序中启用了对 Android U 的支持。(Iaf177)
  • 修复了 Android U 上的配置文件安装程序因进程启动时当前配置文件未创建为空而失败的问题。(Ie3899)
  • 修复了 V_015S 配置文件格式中的方法位图转码。(aosp/2906631) 和 (aosp/2847740)

版本 1.3

版本 1.3.1

2023 年 5 月 3 日

发布了 androidx.profileinstaller:profileinstaller:1.3.1版本 1.3.1 中包含这些提交内容

bug 修复

  • 在配置文件安装程序中启用了对 Android U 的支持 (Iaf177)
  • 修复了 Android U 上的配置文件安装程序因进程启动时当前配置文件未创建为空而失败的问题。(Ie3899)

版本 1.3.0

2023 年 3 月 22 日

发布了 androidx.profileinstaller:profileinstaller:1.3.0版本 1.3.0 中包含这些提交内容

自 1.2.0 以来的重要变更

  • 修复了 ProfileInstallReceiver 中的 NullPointerException。(b/243851384)
  • 添加了 ProfileVerifier API,用于在应用中检查基准配置文件是否已编译、已安排或缺失(I263a4b/246653809
  • 添加了新的 shell 广播,使 Macrobenchmark 能够将内存中的配置文件数据完全刷写到磁盘,以用于生成基准配置文件。在使用 BaselineProfileRule 来通过Macrobenchmark 库捕获基准配置文件时,以及使用 CompilationMode.Partial(warmupIterations) 评估配置文件性能时,都需要此广播。
  • 添加了诊断代码,以检测压缩的基准配置文件。由于 CPU 开销的原因,Profileinstaller 在 Macrobenchmark 或生产环境中无法安装压缩的基准配置文件,并且在构建应用时应避免安装压缩的基准配置文件,方法是更新到 Studio/AGP Electric Eel 或 bundletool 版本 1.13.1I86413b/261998144
  • 为 Macrobenchmark 添加了钩子,用于捕获配置文件和放置着色器缓存,在未取得 root 权限的设备上生成基准配置文件或进行 Macrobenchmark 测试时需要使用这些钩子(Ie0a7db/250083467b/253094958)(Ia5171b/231455742

版本 1.3.0-rc01

2023 年 3 月 8 日

发布了 androidx.profileinstaller:profileinstaller:1.3.0-rc01,该版本与上个 Beta 版相比没有变化。版本 1.3.0-rc01 中包含这些提交内容

版本 1.3.0-beta01

2023 年 2 月 8 日

发布了 androidx.profileinstaller:profileinstaller:1.3.0-beta01版本 1.3.0-beta01 中包含这些提交内容

API 变更

  • 不再支持处理压缩的配置文件。打开和解压缩会导致启动期间增加 CPU 占用率(占用时长达到几十毫秒),因此添加了诊断功能以发现存在压缩错误的基准配置文件。(I86413b/261998144

版本 1.3.0-alpha03

2023 年 1 月 11 日

发布了 androidx.profileinstaller:profileinstaller:1.3.0-alpha03版本 1.3.0-alpha03 中包含这些提交内容

bug 修复

  • 允许处理已压缩或未压缩的基准配置文件 (Ic61a0)
  • 通过修复 profileinstaller 清单中的广播注册表,修复了 MacrobenchmarkScope.dropShaderCache(),使其不再崩溃(I5c728b/258619948

版本 1.3.0-alpha02

2022 年 11 月 9 日

发布了 androidx.profileinstaller:profileinstaller:1.3.0-alpha02版本 1.3.0-alpha02 中包含这些提交内容

API 变更

  • 为基准添加了钩子,用于丢弃着色器缓存,以确保冷启动的性能保持一致,尤其是在使用预热迭代的配置文件进行编译时。必须进行这项更新,才能使用 benchmark-macro-junit4:1.2.0-alpha05 或更高版本测量冷启动。如需了解 Benchmark 库的 API 变更,请参阅 Benchmark 1.2.0-alpha07 页面。(Ia5171b/231455742

版本 1.3.0-alpha01

2022 年 10 月 24 日

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

API 变更

  • 添加了 ProfileVerifier API,用于从应用内检查基准配置文件是否已编译、已安排或缺失(I263a4b/246653809
  • 添加了新的 shell 广播,使 Macrobenchmark 能够将内存中的配置文件数据完全刷写到磁盘,以用于生成基准配置文件。在使用 BaselineProfileRule 来通过Macrobenchmark 库捕获基准配置文件时,以及使用 CompilationMode.Partial(warmupIterations) 评估配置文件性能时,都需要此广播。(Ie0a7db/250083467b/253094958

版本 1.2.2

版本 1.2.2

2023 年 1 月 11 日

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

bug 修复

  • 允许处理已压缩或未压缩的基准配置文件 (Ic61a0)

版本 1.2.1

版本 1.2.1

2022 年 12 月 7 日

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

新功能

  • 为 S_V2 (API 32) 和 TIRAMISU (API 33) 启用了 profileinstaller (b/254900303)。

版本 1.2.0

版本 1.2.0

2022 年 7 月 27 日

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

自 1.1.0 以来的重要变更

  • 现在支持在 Android 12 及更高版本上使用 ART 配置文件格式。
  • ProfileInstallReceiver 中添加了新的 API,以便在使用基准配置文件时通过 Macrobenchmarks 获得更加一致的结果。

版本 1.2.0-rc01

2022 年 6 月 15 日

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

  • 此版本与 androidx.profileinstaller:profileinstaller:1.2.0-beta03 完全相同。

版本 1.2.0-beta03

2022 年 6 月 1 日

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

版本 1.2.0-beta02

2022 年 5 月 18 日

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

  • 没有更改,需要保留以支持 Compose 1.2.0-beta02 版本。

版本 1.2.0-beta01

2022 年 5 月 11 日

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

API 变更

  • ProfileInstallReceiver 中添加了新的 API,以便在使用基准配置文件时通过 Macrobenchmarks 获得更加一致的结果。(If2ae5b/215740637

bug 修复

  • 尝试在 Android 12 及更高版本上使用元数据 V_001 格式时,Profile Installer 会抛出一条有用的消息。(aosp/1978526b/217502387
  • Profile Installer 现在使用 androidx.startup 版本 1.1.1。(aosp/2077099b/229828376

版本 1.2.0-alpha02

2022 年 1 月 26 日

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

此版本与 1.2.0-alpha01 完全相同。

版本 1.2.0-alpha01

2022 年 1 月 12 日

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

新功能

  • 现在支持在 Android 12 及更高版本上使用 ART 配置文件格式。

版本 1.1.0

版本 1.1.0

2022 年 2 月 9 日

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

版本 1.1.0-rc01

2021 年 12 月 15 日

发布了 androidx.profileinstaller:profileinstaller:1.1.0-rc01,该版本与 1.1.0-beta04 相比没有更新。版本 1.1.0-rc01 中包含这些提交内容

版本 1.1.0-beta04

2021 年 12 月 1 日

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

版本 1.1.0-beta03

2021 年 11 月 17 日

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

bug 修复

  • 进行了更新,现在支持 Compose 1.1.0-beta03

版本 1.1.0-beta02

2021 年 11 月 3 日

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

bug 修复

  • 进行了更新,现在支持 Compose 1.1.0-beta02

版本 1.1.0-beta01

2021 年 10 月 27 日

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

  • 与 1.1.0-alpha07 相比没有变化。

版本 1.1.0-alpha07

2021 年 10 月 13 日

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

新功能

  • 现在支持在 Android N 上使用 profm

版本 1.1.0-alpha06

2021 年 9 月 29 日

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

bug 修复

  • 修复了 N、O 和 O_MR1 上的 profileinstaller 转码问题。(I12d75)

版本 1.1.0-alpha05

2021 年 9 月 15 日

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

bug 修复

  • 针对 MultiDex APK 修复了 Android Nougat 和 Android Oreo 的配置文件转码功能。

版本 1.1.0-alpha04

2021 年 9 月 1 日

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

bug 修复

  • 修复了 ProfileInstaller,方便使用基准配置文件的应用使用 CompilationMode.BaselineProfile 运行 MacroBenchmark。(I42657b/196074999

版本 1.1.0-alpha03

2021 年 8 月 18 日

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

bug 修复

  • 更改了 profileinstaller 跳过行为,以便在应用文件目录下的文件中记录 PackageInfo.lastUpdatedTime,并在下次运行时安装配置文件之前参照它。(Ib93d1)
  • 调整了 P、Q 和 R 设备上的配置文件格式,以符合 ART 要求 (I84e89)

版本 1.1.0-alpha02

2021 年 8 月 4 日

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

进行了更新,以与 Compose 1.1.0-alpha01 兼容。

版本 1.1.0-alpha01

2021 年 7 月 21 日

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

bug 修复

  • 修复了会在某些情况下会触发严格模式的 bug。

版本 1.0

版本 1.0.4

2021 年 10 月 13 日

发布了 androidx.profileinstaller:profileinstaller:1.0.4版本 1.0.4 中包含这些提交内容

  • 进行了更新,现在支持 Compose 1.0.4

版本 1.0.3

2021 年 9 月 29 日

发布了 androidx.profileinstaller:profileinstaller:1.0.3版本 1.0.3 中包含这些提交内容

  • 进行了更新,现在支持 Compose 1.0.3

版本 1.0.2

2021 年 9 月 1 日

发布了 androidx.profileinstaller:profileinstaller:1.0.2版本 1.0.2 中包含这些提交内容

bug 修复

  • 为 P、Q 和 R 设备添加了配置文件转码功能。此更改意味着这些设备将对配置文件进行转码,以确保写入的配置文件始终可供 ART 使用。以前,在这些平台上会跳过转码,有时会导致 ART 无法处理源配置文件。开发者 API 没有任何变化。

版本 1.0.1

2021 年 8 月 4 日

发布了 androidx.profileinstaller:profileinstaller:1.0.1版本 1.0.1 中包含这些提交内容

进行了更新,以与 Compose 1.0.1 兼容。

版本 1.0.0

2021 年 7 月 28 日

发布了 androidx.profileinstaller:profileinstaller:1.0.0版本 1.0.0 中包含这些提交内容。

1.0.0 的主要功能

ProfileInstaller 是一个新库,可让库和应用定义“配置文件规则”并将 ART 配置文件信息与一个 APK 捆绑起来,此库将在应用启动后安装这些配置文件。该库可用于提升应用性能。

如需详细了解具体的配置文件规则及其工作方式,请参阅 1.0.0-beta01 的详细版本说明。

版本 1.0.0-rc02

2021 年 7 月 14 日

发布了 androidx.profileinstaller:profileinstaller:1.0.0-rc02版本 1.0.0-rc02 中包含这些提交内容

版本 1.0.0-rc01

2021 年 7 月 1 日

发布了 androidx.profileinstaller:profileinstaller:1.0.0-rc01版本 1.0.0-rc01 中包含这些提交内容

这是 RC 版本,与 Beta 版相比没有任何变化。

版本 1.0.0-beta01

2021 年 6 月 16 日

发布了 androidx.profileinstaller:profileinstaller:1.0.0-beta01版本 1.0.0-beta01 中包含这些提交内容

库的用途

ProfileInstaller 是一个新库,可让库和应用定义“配置文件规则”并将 ART 配置文件信息与一个 APK 捆绑起来,此库将在应用启动后安装这些配置文件。该库可用于提升应用性能。

此配置文件安装是通过 androidx.startup 库完成的。如果您出于某种原因想要停用此配置文件安装,可以修改该清单,将其移除:


       <provider
           android:name="androidx.startup.InitializationProvider"
           android:authorities="${applicationId}.androidx-startup"
           android:exported="false"
           tools:node="merge">
           <meta-data android:name="androidx.profileinstaller.ProfileInstallerInitializer"
                     tools:node="remove" />
       </provider>

如果您的应用具有复杂的启动要求,并且您希望使用 ProfileInstaller.writeProfile API 手动触发此配置文件安装,这种方法特别有用。

什么是配置文件规则?

  • 库的配置文件规则是在位于 src/main 或等效目录内的文本文件 baseline-prof.txt 中指定的。该文件会每行指定一个规则,在此情况下,规则是指用于与库中的方法或类匹配的格式。这些规则的语法是使用 adb shell profman --dump-classes-and-methods ... 时所用的便于用户看懂的 ART 配置文件格式的超集。这些规则采用两种形式,一种用于方法,一种用于类。

  • 方法规则采用以下格式:

    <FLAGS><CLASS_DESCRIPTOR>-><METHOD_SIGNATURE>
    
  • 类规则采用以下格式:

    <CLASS_DESCRIPTOR>
    
  • 其中,<FLAGS>HSP 中的一个或多个字符,用于指示相应方法应标记为“Hot”“Startup”还是“Post Startup”。

  • <CLASS_DESCRIPTOR> 是目标方法所属类的描述符。例如,类 androidx.compose.runtime.SlotTable 的描述符为 Landroidx/compose/runtime/SlotTable;

  • <METHOD_SIGNATURE> 是方法的签名,其中包含方法的名称、参数类型和返回值类型。例如,LayoutNode 中的 fun isPlaced(): Boolean 方法具有签名 isPlaced()Z

  • 这些格式可以包含通配符(***?),以便让单个规则能够涵盖多个方法或类。

规则的作用是什么?

  • 如果某个方法具有 H 标志,则表示该方法为“hot”方法,应提前进行编译。

  • 如果某个方法具有 S 标志,则表示系统会在启动时调用该方法,应提前进行编译,以避免在启动时耗费资源进行编译以及解析该方法。

  • 如果某个方法具有 P 标志,则表示系统会在启动后调用该方法。

  • 如果某个类出现在此文件中,则表示系统会在启动过程中使用该类,应在堆中预先分配该类,以避免耗费资源来加载它。

运作方式

  • 库可以定义要打包到 AAR 制品中的那些规则。如果事后构建了某个 APK,并且其中包含这些制品,系统会将这些规则合并在一起,并使用合并后的规则来构建特定于该 APK 的紧凑二进制 ART 配置文件。然后,当设备安装该 APK 后,ART 就可以利用此配置文件,以便预先编译应用的特定部分,从而提升应用性能(特别是首次运行时的性能)。请注意,这对可调试应用没有任何影响。

  • 规则文件应命名为 baseline-prof.txt,并放在主源代码集的根目录中(它应该是 AndroidManifset.xml 文件的同级文件)

  • 目前,只有在您使用 Android Gradle 插件 7.0 及更高版本时,才能利用这些文件,并且这些文件目前只能通过 gradle.properties 中的标志启用:

    # Enable adding baseline-prof.txt files to AAR artifacts, and binary profiles to APKs
    android.experimental.enableArtProfiles=true
    

配置文件需要一种平衡

  • 如果配置文件以适当方式设计,优先包含位于启动路径以及对性能至关重要的方法和类,将可以带来最佳结果。但如果在配置文件中包含太多方法或类,最终可能会对内存消耗和磁盘使用情况造成完全负面的影响,因此,如果您自行定义配置文件规则,建议开始时先保守一点。