性能、性能还是性能---下一代Android性能框架分析

news2024/11/28 8:43:30


性能优化的重要性和难度毋庸置疑,事实上,性能优化也是一个永无止境的游戏,总会发现有一些东西需要优化。但是不可避免的是,这也是一个边际效益递减的事情,项目或应用获得的收益在一定程度上也会逐渐降低。What’s new in next generation Android Performance?在现在的手机红海市场,不只是硬件越发同质化,软件(Android + Linux Kernel)在创新方面也渐渐放缓的脚步。作为手机用户,你最看重的手机哪个特性,性能、稳定性、安全、续航或其他?今天我们来分析和展望下一代Android 性能所需具备的特点。

在最新的Google I/O 2023大会上,Pichai着重强调了All in AI的趋势。在过去的几年里,Android一直在努力使工作变得更加简单和有益,在Baseline Profiles、Android Studio、libraries 等方面有了进一步的改进优化,因而提供了更好的启动性能改进。

Baseline Profiles

通过避免即时(JIT)编译,将应用程序启动和运行时的代码执行速度提高了大约30%。通过构建工具来简化Baseline Profiles文件的创建和维护,包括一个新的Android Studio模板和Gradle插件。

使用Baseline profile Gradle Plugin简化概要文件生成

Gradle Plugin使得在本地开发和CI期间生成和维护基线配置文件变得更加容易。它执行生成基线概要文件并将其安装到应用程序模块中的所有必要步骤。要使用该插件,需要在项目中添加一个instrumented test module,并定义一组测试,用于在应用中跟踪流程,以模拟关键的用户进程。当运行instrumented test module时,Gradle Plugin会跟踪在这些用户进程中执行的所有类和方法,并基于这些类和方法生成Baseline Profiles,然后将生成的Baseline Profiles文件复制到应用程序模块的源代码中。

在应用插件后,可以在构建的脚本中使用新的BaselineProfile块对其进行配置,GenerateBaselineProfile Gradle任务运行所有BaselineProfile文件测试,生成的BaselineProfile文件存储在生成的文件夹中。这些特性消除了在本地和远程CI服务器上自动生成BaselineProfile的gap。通过指定在生成BaselineProfile时使用的Gradle Managed Device,甚至不需要附加物理设备。

详细内容可以查看测试用例代码和Guide Docs来进一步学习和实践。

使用AGP 8+创建和管理多个Baseline Profile源文件

AGP 8以后支持多个源文件、特定于变体的BaselineProfile,并支持上面提到的新的Gradle插件。目前默认位置是src/main/baselineProfiles/,存储在此目录中的Baseline Profile源文件将被提取并合并到应用程序中,这也使得能够为应用程序中各个线程存储单独的配置文件。

Android Studio基线配置文件生成器模板

为了帮助开发者快速上手使用BaselineProfile,Android Studio Hedgehog(2023.1.1)添加了BaselineProfile生成器模块向导模板。通过使用这个模板,你的应用可以用一种视觉辅助的方式设置BaselineProfile。

具体路径为:File > New > New Module,并从模板列表中选择Baseline Profile Generator。

这个模块创建了一个包含基本生成器和基准的新的Baseline Profile测试模块。BaselineProfileGenerator类为您创建了一个基本的配置文件,startupbenchmark可以验证一切正常工作。此外,Gradle插件将在相关模块中应用。最后,为了应对Android的依赖,将添加Profileinstaller,以帮助本地验证和向后兼容性。

从这里开始,所需要做的就是执行Generate Baseline Profile运行配置,该配置运行包括Baseline Profile生成器,并将生成的概要文件复制到src/release/generated/baselineProfile。

运行配置调用:app:generateBaselineProfile任务,查找所有Baseline Profile生成器并运行。

BaselineProfileGenerator只启动应用程序并等待应用程序启动完成,所以官方建议为应用中的每个关键用户线程创建基线配置文件。

启动配置文件和Dex布局优化

从8.1版本开始,Android Gradle Plugin (AGP)可以将应用程序启动所需的代码拉入应用程序的主索引文件中,这种优化称为索引布局优化,有助于减少应用程序启动期间的索引页面错误。这可以显著加快应用程序的启动速度,因为在应用程序完成启动之前,只需要加载一个索引文件。

虽然AGP可以为应用程序创建单独的索引文件,但如果没有开发者自定义,它仍然不知道如何定义应用程序的启动,这就是启动配置文件的用武之地。你可以把启动配置文件看作是Baseline Profile的一个子集,它是专门为应用程序启动量身定制的。两者共享相同的格式并使用相同的底层技术。由于每个应用程序的启动都是不同的,所以libraries 不会对启动配置文件做出定制化。

与需要解释和JIT编译的应用程序(例如,在推送更新之后)相比,Baseline Profile提供了大约30%的性能提升。目前对Dex布局优化的早期测试显示,在应用程序启动时,在基线配置文件收益的基础上,性能又提高了30%。

为了充分利用Dex布局优化和启动配置文件,开发者需要让Android框架知道你的应用程序何时启动完成。如果开发者什么都不做,那么在绘制第一帧时,应用程序启动将被视为完成。要确保启动配置文件包含用户可以接管的信息,请使用reportFullyDrawn api。你可以通过FullyDrawnReporter或者Compose ReportDrawn api来实现。此外,需要在开发者认为启动完成的位置为启动基准定义终点。将对reportFullyDrawn的调用与期望在应用准备使用时显示在屏幕上的内容相匹配。

可以进一步查看Dex layout优化文档,对你的应用程序进行分析和优化。

Macrobenchmark库的新功能

Macrobenchmark够全面精准的测量Android应用程序性能,创建Baseline Profile并监控应用程序的更改是否会对应用程序性能产生影响,目前的1.2.0将很快升级为测试版,以下是一些功能亮点:

1、在基准测试中使用新的Android平台特性
从Android 13及更新版本开始,可以在非root设备或模拟器上使用BaselineProfileRule生成基线配置文件。从Android 14及更新版本开始,目标应用程序不再需要在基准测试运行之间重新安装。这使得应用程序可以保存状态,比如缓存、会话状态或登录令牌。

2、新API
当使用collectBaselineProfile方法创建基线配置文件时,可以从代码中删除 test API注释的选项。但是如果想继续使用实验性的API,可以有新API供考虑。这个API就是新引入的collectStableBaselineProfile,它开始运行并等待,直到一个Baseline Profile对于给定的迭代量被认为是稳定的。这意味着你的应用程序的Baseline Profile将更好地反映代码路径执行时应用程序中发生的事情。

@OptIn(ExperimentalStableBaselineProfilesApi::class)
@Test
fun profileGenerator() {
    rule.collectStableBaselineProfile(
        packageName = TARGET_PACKAGE,
        maxIterations = 10
    ) {
        profileBlock()
    }
}

3、更强大的指标与自定义跟踪处理
PerfettoTraceRule支持在基准测试之外的测试中自定义跟踪收集(需要API 23+)。这是一个强大的功能,允许用户收集有关测试的性能和计时数据。

PerfettoTraceProcessor支持查询跟踪内容,并且是所有现有Macrobenchmark Metric api背后的引擎。现在可以将它与TraceMetric一起使用,以与Macrobenchmark从Perfetto系统跟踪中的任何信息中使用相同的方式来定义完全自定义的指标。这是另一个强大的特性,允许用户进一步定制他们的基准测试。

4、根据benchmarks计算功耗
新的PowerMetric API可用于测量能耗和功率状态,即允许用户跟踪benchmarks的能耗。

5、Bug修复和其他改进
Macrobenchmark团队还对人体工程学进行了各种其他改进,修复了错误并改进了整体行为。要了解更多信息,请查看文档。如果想了解更多细节,可以在这里找到一个完整的发布说明列表,附带代码和跟踪issues。

Android Studio Power Profiler

Android Studio Hedgehog提供了一个新的Profiler,可以显示物理设备上的功耗,并按每个子系统进行细分(例如:相机、GPS等)。这些数据在记录系统Tracing时非常有用,并直观地将设备的功耗与应用程序中发生的操作关联起来。例如,可以A /B测试批量API调用,而不是进行单独的API调用,以优化相关功耗。使用Pixel 6+设备记录系统Traing并将其加载到Android Studio,或使用分析器直接从附加设备捕获系统Tracing。详细案例在此处

性能、性能还是性能

我们为什么要如此关注系统性能,不论是Android还是Linux Kernel?因为这是影响用户体验最关键的部分,尤其是在手机场景下,对于用户来说,快速响应的应用意味着更好的用户体验。对于企业来讲,性能优越的产品也是核心价值,可以产生技术壁垒,增强产品竞争力。

在研究性能时,找到正确的起点是一个巨大的挑战。基于eBPF和AI等其他手段,从Linux kernel到Android APP全链路打通,从可观测性的角度,逐步趋近于云原生、服务器等领域的APM框架,这也是未来的一个发展方向。

性能优化,道阻且长,吾辈需持续努力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ReentrantLock 原理

目录 ReentrantLock 概述 ReentrantLock 的原理 什么是 AQS ? 获取锁资源(以⾮公平锁为例) tryAcquire addWaiter acquireQueued 释放锁资源 ⾮公平锁体现在哪⾥? 调试代码 总结 ReentrantLock 概述 ReentrantLock是Lock接⼝的默认实现,是⼀…

【Linux】-关于Linux的指令(下)

💖作者:小树苗渴望变成参天大树 ❤️‍🩹作者宣言:认真写好每一篇博客 💨作者gitee:gitee 💞作者专栏:C语言,数据结构初阶,Linux,C 文章目录 前言一、时间相关的指令二、cal指令三、find -name指…

Centos7 经典模式安装GBase 8s 图文教程

Centos7安装GBase 8s 图文教程 前言1.1 硬件要求1.2 系统要求1.3 虚拟 PC 软件1.4 安装及配置数据库服务器1.4.1 创建 gbasedbt 组和用户1.4.2 创建 GBase 8s 数据库安装目录1.4.3 上传并解压安装包1.4.4 执行安装 参考文献 前言 本篇博文分享如何在Centos7 x86架构的系统中安…

第2章-Selenium-API操作

目标: 1. 熟练应用八种元素定位方式 2. 掌握对元素和浏览器的操作方法 3. 掌握键盘鼠标的操作 4. 掌握元素等待的操作 5. 掌握下拉选择框、 警告框和滚动条的操作 6. 掌握如何切换frame框架和多窗口 7. 掌握如何实现窗口截图 1.元素定位 1. 掌握id、 name、 cla…

【leetcode】622 二叉树的最大宽度

题目描述 给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同&#…

MATLAB 之 M 文件和程序控制结构(顺序、选择、循环)

文章目录 一、M 文件1. M 文件的建立与打开1.1 建立新的 M 文件1.2 打开已有的 M 文件 2. M 文件的分类 二、 程序控制之顺序结构1. 数据的输入2. 数据的输出3. 程序的暂停 三、程序控制之选择结构1. if 语句2. switch 语句3. try 语句 四、程序控制之循环结构1. for 语句2. wh…

畸变像差校正技术(畸变相位补偿)发展现状及其仿真实验研究-技术汇总-Matlab代码

▒▒本文目录▒▒ 一、引言二、物理方法2.1 基于二次曝光法的畸变像差补偿仿真实验验证 三、数值方法3.1 基于主成分分析法的畸变像差补偿仿真实验验证3.2 基于标准多项式拟合法的畸变像差校正仿真实验验证3.3 基于最小二乘拟合法的畸变像差校正仿真实验验证3.4 基于泽尼克多项…

Simulink 自动代码生成电机控制——永磁同步电机参数获取

目录 前言 极对数测量 电阻测量(Rs) 电感测量(Ld和Lq) 磁链测量 总结 前言 在建模之前或者需要更换一个新电机,需要获取目标电机的电气参数,如果参数不对,对于电流环参数的整定&#xff0…

2023/05/08~14 刷题记录

A - Plus and Multiply 题意: 题解: 题目说可以将集合里面的数字 *a 或者 b 操作,并将新的值放进集合中,首先想到 dfs 暴力求解,但是太暴力了,直接 时间超限 。通过观察我们可以知道,要求 n 是否…

前端模块化

什么是模块化 事实上模块化开发最终目的是将程序划分成一个个小的结构在这个结构中编写属于自己的逻辑代码,有自己的作用域,不会影响到其他的结构这个结构可以将自己希望暴露的变量、函数、对象等导出给其他结构使用。可以通过某种方式,导入…

电脑软件:国内最好用解压缩软件 7-Zip 新版本发布

5 月 9 日消息,7-Zip 是一款拥有极高压缩比的的开源压缩软件,支持 LZMA2 等 7 种开源算法,以及支持较广泛的压缩格式 .7z,体积不大(1.5MB)、功能完善,除了默认 UI 不符合国内审美外几乎没什么可…

Oracle数据库安装教程,并实现公网远程连接【内网穿透】

✨ 目录 🎈 前言🎈 1. 数据库搭建🎈 2. 内网穿透🎈 2.1 安装cpolar内网穿透🎈 2.2 创建隧道映射 🎈 3. 公网远程访问🎈 4. 配置固定TCP端口地址🎈 4.1 保留一个固定的公网TCP端口地址…

Java经典笔试题—day08

Java经典笔试题—day08 🔎选择题🔎编程题🥝两种排序方法🥝求最小公倍数 🔎结尾 🔎选择题 (1)下列选项中关于Java中super关键字的说法正确的是() A.super关键字是在子类对象内部指代…

JAVA JDK下载安装手册

JDK的介绍与安装 JDK简介 JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。编写 Java 程序必须使用 JDK,它提供了编译和运行 Java 程序的环境。是整个java开发的核心。 准备JDK 本次使用的是JDK1.8 如下所示: 下载完…

记两道AES-CBC题

文章目录 知识导入(AES-CBC模式)题一(buu [ACTF新生赛2020]crypto-aes 1)题目描述:题目分析:知识导入os.urandom(n)函数比特,字节,二进制数之间的关系AES.new(key,AES.MODE_CBC,iv) 题二(crack AES-CBC IV)…

小黑子—Java从入门到入土过程:第九章-IO流

Java零基础入门9.0 Java系列第九章- IO流1. 初识IO流2. IO流的体系2.1 字节流2.1.1 FileOutputStream 字符串输出流2.1.1 - I 字符串输出流的细节2.1.1 - II FileOutputStream写数据的3种方式2.1.1 -III FileOutputStream写数据的两个小问题 2.1.2 FileInputStream 字符串输入流…

点线面产生局部坐标系以及计算到世界坐标系的旋转矩阵

欢迎关注更多精彩 问题描述 给定点O,线段AB,平面OP,求以OP法向为某一轴,以AB在OP上的投影为另一轴,O为原点的局部坐标系。要求给出X,Y,Z轴的单位向量,以及原点O. 求出转换到世界坐标系的旋转矩阵RT。 如…

ChatGPT的简单了解

ChatGPT 是 InstructGPT 的同级模型,它经过训练可以按照提示中的说明进行操作并提供详细的响应。 InstructGPT论文:https://arxiv.org/pdf/2203.02155.pdf InstructGPT怎么准备和标记数据集:https://harryliu.blog.csdn.net/article/detail…

【连续介质力学】张量的性质2

张量的代数操作 张量的性质 张量迹 Tensor Trace 定义 e ^ i ⨂ e ^ j \hat e_i \bigotimes \hat e_j e^i​⨂e^j​的迹: T r ( e ^ i ⨂ e ^ j ) e ^ i ⋅ e ^ j δ i j Tr(\hat e_i \bigotimes \hat e_j) \hat e_i \cdot \hat e_j \delta_{ij} Tr(e^i​⨂e^j​)e^i​⋅…

总结如何申请注册 GitHub 教师教育优惠 Benefits for Teachers 来免费使用 copilot

目录 1. GitHub 教师教育优惠有什么2. 如何申请教师教育优惠呢2.1 选择学校2.2 更改个人信息2.3 准备证明材料2.4 提交申请2.5 遇到的问题2.5.1 问题 12.5.2 问题 22.5.3 问题 3 3. 申请免费的 GitHub Copilot 学生注册不在此处赘述了,网上有很多教程可以参考。但是…