通过基准配置文件改善应用性能
作者 / Android 开发者关系工程师 Florina Muntenescu
启动时间的重要性
应用性能和用户参与度的相关性在许多应用中都有所体现。用户希望应用响应迅速且能快速加载,而 启动时间 就是衡量应用性能和质量的主要指标之一。
我们的一些合作伙伴已经投入大量时间和资源来优化应用启动情况。例如,您可以阅读了解 Facebook 的优化历程。
本文我们将讨论基准配置文件和其改善应用和开发库性能的方式,包括它们如何将启动时间缩短了最高 40%。虽然本文侧重于应用启动,但是基准配置文件也可以极大改善卡顿情况。
回顾
Android 9 (API 级别 28) 在 Play Cloud 中引入了 ART 优化配置文件,以缩短应用启动时间。在云配置文件可用时,我们看到应用的冷启动在不同设备上平均快了至少 15%。
配置文件的工作原理
当应用在安装或更新后首次启动时,它的代码以解释模式运行,直到被 JIT。由于存储和加载完全编译的应用所需的开销较大,自 Android 6 开始,Java 和 Kotlin 代码在 APK 中编译为 dex 字节码,而不是完全编译为机器代码。应用中经常被使用以及用于应用启动的类和方法,都会被写入配置文件。一旦设备进入闲置模式,ART 就基于这些配置文件编译应用,以加快后续的应用启动。
从 Android 9 (API 级别 28) 开始,Google Play 也会提供云配置文件。当应用在设备上运行时,ART 生成的配置文件由 Play 商店应用上传并在云端聚合。为应用上传了足够的配置文件后,Play 应用将使用聚合的配置文件来进行后续的安装。
存在的问题
虽然云配置文件在可用时很有帮助,但并非总是在应用安装后即可使用。收集和聚合配置文件通常要几天时间,而许多应用会每周更新,这就是问题所在。而且许多用户会在云配置文件可用之前安装更新。Google Android 团队开始寻找其他方法来改善配置文件延迟。
解决方案
基准配置文件 是提供配置文件的一个全新机制,可在 Android 7 (API 级别 24) 和更高版本上使用。基准配置文件是由 Android Gradle 插件 生成的 ART 配置文件,使用可由应用和库提供的人类可读懂的配置文件格式。示例如下:
HSPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I HLandroidx/compose/runtime/ComposerImpl;->validateNodeExpected()V PLandroidx/compose/runtime/CompositionImpl;->applyChanges()V HLandroidx/compose/runtime/ComposerKt;->findLocation(Ljava/util/List;I)I
△ Compose 库的示例
二进制文件存储在 APK 资源目录中的特定位置 (assets/dexopt/baseline.prof)。
基准配置文件在构建时创建,作为 APK 的一部分发送到 Play 中,然后在下载应用时,从 Play 发送至用户。基准配置文件在云配置文件尚不可用时,填补了 ART 云配置文件流水线中的空白,在云配置文件可用时,则会自动与其合并。
△ 此示意图展示了从创建到向最终用户交付的基准配置文件工作流程。
基准配置文件最大的优势之一是可以 在本地开发和评估,这样开发者可以看到真实的最终用户性能改进情况。它们还支持较低的 Android 版本 (7 和更高版本),而云配置文件只在 Android 9 及以上版本中提供。
影响
应用开发者
2021 年初,Google 地图的发布周期从两周改为一周。更频繁的更新意味着更频繁地舍弃本地预编译,以及更多用户在没有 Play Cloud 配置文件的情况下,遇到启动缓慢的情况。通过使用基准配置文件,Google 地图将平均启动时间缩短了 30%,搜索速度相应增长了 2.4%,对于这样一个成熟的应用来说,这是巨大的性能改进。
库开发者
库中的代码与应用中的代码类似,默认都不是完全编译,如果它在启动的关键路径中发挥重要作用,则可能存在问题。
Jetpack Compose 是一个不属于 Android 系统映像的界面库,因此与大多数 Android 视图工具包代码不同,它在安装时并未完全编译。这导致了性能问题,尤其是在应用前几次冷启动时。
为解决这一问题,Compose 使用了配置文件安装程序。该程序附带了基准配置文件规则,可以缩短 Compose 应用的启动时间并减少卡顿。
Google Play 商店的搜索结果页已经使用 Compose 进行重写。在集成 Compose 的基准配置文件规则后,渲染初始搜索结果页 (包括图像) 的时间缩短了约 40%。
Android 团队还将基准配置文件添加到了相关的 AndroidX 库。这可让所有使用这些库的 Android 应用受益。ConstraintLayout 发现 附带的配置文件规则 将动画帧时间缩短了超过 1 毫秒。
如何使用基准配置文件
创建自定义基准配置文件
所有应用和库开发者都可以从添加基准配置文件中获益。理想状态下,开发者为最关键的用户旅程创建配置文件,来确保不管云配置文件是否可用,这些旅程都拥有始终快速的性能。您可以查看 详细指南,了解如何为应用和库开发者设置基准配置文件。
更新依赖项
如果您还未准备好为应用生成基准配置文件,您仍然可以受益于更新依赖项。如果您使用 Android Gradle 插件 7.1.0-alpha05 或更高版本构建应用,您将获得包含在 APK 中的基准配置文件,这些配置文件已经由库 (例如 Jetpack) 提供。Google Play 在安装时借助这些配置文件编译应用。您可以将这些配置文件作为 构建应用的补充部分。
衡量改进情况
不要忘记衡量应用改进情况。您可以 按照步骤操作,了解如何在本地衡量使用生成的配置文件的启动情况。
欢迎您分享体验反馈。
如有其他发现的问题或者内容建议,欢迎您 点击这里 向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
详细了解 Synchronized 锁升级过程
前言 首先,synchronized 是什么?我们需要明确的给个定义——同步锁,没错,它就是把锁。 可以用来干嘛?锁,当然当然是用于线程间的同步,以及保护临界区内的资源。我们知道,锁是个非常笼统的概念,像生活中有指纹锁、密码锁等等多个种类,那 synchronized 代表的锁具体是把什么锁呢? 答案是—— Java 内置锁。在 Java 中,每个对象中都隐藏着一把锁,而 synchronized 关键字就是激活这把隐式锁的把手(开关)。 先来简单了解一下 synchronized,我们知道其共有 3 种使用方式: 修饰静态方法:锁住当前 class,作用于该 class 的所有实例 修饰非静态方法:只会锁住当前 class 的实例 修饰代码块:该方法接受一个对象作为参数,锁住的即该对象 使用方法就不在这里赘述,可自行搜索其详细的用法,这不是本篇文章所关心的内容。 知道了 synchronized 的概念,回头来看标题,它说的锁升级到底是个啥?对于不太熟悉锁升级的人来说,可能会想: 所谓锁,不就是啪一下锁上就完事了吗?升级是个什么玩意?这跟打扑克牌也没关系啊。 对于熟悉的人来说,可能会...
- 下一篇
分布式任务调度:你知道与不知道的事
导语 对于定时任务大家应该都不会陌生,从骨灰级别的Crontab到Spring Task,从QuartZ到xxl-job,随着业务场景越来越多样复杂,定时任务框架也在不断的升级进化。 那么今天就来跟大家从以下三个方面聊一聊分布式任务调度:从单机定时任务到分布式任务调度平台的演进过程、腾讯云分布式任务调度平台TCT是如何应运而生的、TCT具体落地案例情况和解决了哪些核心问题。 作者介绍 崔凯 腾讯云 CSIG 微服务产品中心产品架构师 多年分布式、高并发电子商务系统的研发、系统架构设计经验,擅长主流微服务架构技术平台的落地和实施 目前专注于微服务架构相关中间件的研究推广和最佳实践的沉淀,致力于帮助企业完成数字化转型 场景类型 定时任务的场景千千万,但它的本质模型是个啥,怎么来理解定时任务呢,此处好有一比。定时任务其实就是老师给学生布置作业,比如: 每天晚上7点准时开始写作业,写完了让家长检查签字。 “每天晚上7点准时”是对时间精度和周期性的要求,是7点不是8点,是每天不是每周;“写作业”是对任务执行内容的明确,是写作业不是看奥特曼;“写完了让家长检查签字”使得“写作业”和“家长检查签字”...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7