ProfileInstaller

  
让库能够提前预填充要由 ART 读取的编译轨迹。
最近更新时间 当前稳定版 下一候选版 Beta 版 Alpha 版
2021 年 8 月 4 日 1.0.1 - - 1.1.0-alpha02

声明依赖项

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

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

Groovy

dependencies {
    implementation "androidx.profileinstaller:profileinstaller:1.1.0-alpha05"
}

Kotlin

dependencies {
    implementation("androidx.profileinstaller:profileinstaller:1.1.0-alpha05")
}

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

反馈

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

创建新问题

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

版本 1.1.0-alpha01

版本 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

版本 1.0.1

2021 年 8 月 4 日

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

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

版本 1.0.0

版本 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
    

配置文件需要一种平衡

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