Android性能优化 | DEX 布局优化和启动配置文件

Android性能优化 | DEX 布局优化和启动配置文件

引言

使用DEX布局优化和启动配置文件是优化Android应用性能的有效途径。DEX布局优化可以通过优化应用程序中的DEX文件布局,从而加快Android应用的启动速度和执行速度。启动配置文件则提供了一种灵活的方式来控制应用程序的启动流程和加载顺序,从而更好地优化应用程序的性能。

要使用DEX布局优化和启动配置文件,首先需要安装Jetpack Macrobenchmarks版本1.2.0-alpha14或更高版本,并确保Android Gradle插件(基准配置文件、DEX布局优化以及改进了配置文件编译)的版本符合最低要求。其次,为了简化设置,建议使用基准配置文件Gradle插件。

https://maven.google.com/web/index.html?q=benchmark&hl=zh-cn#androidx.benchmark:benchmark-macro-junit4:1.2.0-alpha14

使用启动配置文件进行DEX布局优化是一项实验性功能,需要添加实验性标记。为了获得最佳性能,还需要在应用程序代码中进行一些必要的修改。同时,请注意目前不支持使用第三方构建系统如Bazel等。

启动配置文件

启动配置文件与基准配置文件类似,都是描述应用程序中关键类和方法的配置文件。但是,启动配置文件不同于基准配置文件的地方在于,启动配置文件主要描述了应用程序启动时至关重要的类和方法。这些类和方法必须先做好加载准备,以保证应用程序能够快速启动。

需要注意的是,应用程序启动通常是多个关键用户历程 (CUJ) 的组合。因此,在启动配置文件中,可以定义这些关键 CUJ,并确定它们的加载顺序和执行流程。同时,启动配置文件还需使用人类可读格式 (HRF),与基准配置文件相同。

与基准配置文件不同的是,启动配置文件无法由库提供,也不受 Android Gradle 插件合并的约束。这是因为库不一定充分了解应用启动的关键类和方法有哪些。因此,在编写启动配置文件时,最好由 Jetpack Macrobenchmark 衍生,并与专门针对应用启动的 CUJ 结合使用。此外,在基准配置文件中,除了应用启动外的其他优化也会被包含进去,例如减少动画期间或应用启动以外的关键用户历程 (CUJ) 期间的卡顿。

最后,需要注意的是,启动配置文件存储在 src/<variantName>/main/baselineProfiles/startup-prof.txt 中。因此,在进行 DEX 布局优化时,需要确保存储位置正确,并且与专门针对应用启动的 CUJ 结合使用,从而达到最佳优化效果。

DEX 布局优化

通过优化应用程序中的 DEX 文件布局,可以显著加快 Android 应用的启动速度和执行速度。这一优化措施的主要目标是减少应用启动期间发生的主要页面故障的数量,提高用户体验。

具体而言,这项优化的核心思想是将启动期间要执行的所有代码添加到主要 classes.dex 文件中,同时将所有非启动代码从主要 classes.dex 文件中移除。这样做的好处在于,启动时需要加载的代码量将大大减少,从而可以降低启动时间并提升性能。

值得注意的是,这一优化措施并非简单地将所有代码都放入一个 DEX 文件中,而是需要根据应用程序的具体情况来进行调整。通过合理规划 DEX 文件布局,可以根据不同的场景和需求,将代码分配到多个 DEX 文件中,并优化其加载顺序和执行流程。

使用 DEX 布局优化

接下来讲述如何使用DEX布局优化

构建启动配置文件

首先,您需要创建一个启动配置文件。

在项目设置方面,在前面的示例中,我们以一个名为com.example.app的app模块为例进行了插桩测试。

当您使用Jetpack Macrobenchmark生成启动配置文件规则时,您需要在build.gradle文件中定义一个新的基准变体。这个基准变体与发布变体相似,但您需要关闭缩减功能。

项目设置

以下是取自应用模块的build.gradle文件的代码示例:

buildTypes {...create("benchmark") {initWith(buildTypes.getByName("release")isMinifyEnabled = falsesigningConfig = signingConfigs.getByName("debug")matchingFallbacks += "release"}
}

生成启动规则

@RunWith(AndroidJUnit4::class)
class StartupProfileGenerator {@get:Ruleval baselineProfileRule = BaselineProfileRule()@Testfun startup() =baselineProfileRule.collect(packageName = "com.example.app",includeInStartupProfile = true) {// This scenario just starts the activity and waits for it to draw// the first frame. If you have animations or async content in your// startup, wait for them with UiAutomator.startActivityAndWait()}
}

运行测试会输出下面内容:

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
Landroidx/compose/runtime/ComposerImpl;

将输出文件的内容复制到 src/main/baselineProfiles/startup-prof.txt

启用 DEX 布局优化

Android提供了实验性属性 android.experimental.r8.dex-startup-optimization,以支持DEX布局优化。

需要注意的是,启用此标记后,主要 DEX 文件将只包含应用启动所需的类,这可以显著减少启动时间并提升性能。但如果您的应用程序之前从未使用过MultiDex,则现在需要启用MultiDex功能。

因此,在启用android.experimental.r8.dex-startup-optimization属性时,需要确保您的应用程序已经配置好MultiDex,并且所有相关类和方法都已正确分配到各个DEX文件中。这样才能确保您的应用程序在启动时获得最佳效果。

android {// ...experimentalProperties["android.experimental.r8.dex-startup-optimization"] = true
}

构建具有 DEX 布局优化功能的 APK

./gradlew :app:assembleRelease

结论

总的来说,使用DEX布局优化和启动配置文件是优化Android应用性能的有力工具,可以显著提升应用程序的启动速度和执行效率。但在使用时需要注意相关版本和设置的要求,以确保获得最佳效果。

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

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

相关文章

股票涨跌原理

相信很多人都知道&#xff0c;在每一个价位上成交的多头订单和空头订单的数量都是相等的&#xff0c;那为什么会上涨和下跌&#xff0c;背后的原理是什么&#xff1f; 举个生活中的例子&#xff1a; 其实在交易市场上的成交与我们日常生活中的买卖商品成交是类似的&#xff0…

【杂谈】如何测试EEPROM可以保存数据100年以及擦写次数,磨损均衡问题,阿伦尼乌斯方程的老化测试法

【引出问题】 引用帖子&#xff1a;How Do You Test If An EEPROM Can Hold Data For 100 Years? | Hackaday 在hackaday上看到一篇有意思的帖子&#xff0c;如何测试 EEPROM 是否可以保存数据 100 年以及EERPOM的耐久性问题 比如Microchip的文档里面介绍&#xff0c;EEPRO…

C++I/O流——(4)格式化输入/输出(第一节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

独立服务器和云服务器的区别

独立服务器和云服务器的区别是很多用户在选择服务器时要做的课程&#xff0c;那么独立服务器和云服务器的区别有哪些呢? 独立服务器和云服务器是两种不同的服务器部署方式&#xff0c;它们在性能、成本、资源利用、安全性和维护等方面存在显著差异。 1. **性能对比**&#xff…

【DC-6靶场渗透】

文章目录 前言 一、确定靶场地址 二、信息收集 三、账号枚举并破解 四、寻找漏洞 五、反弹shell 六、提权 前言 今天做一下DC6靶场 一、确定靶场地址 1、查看靶机mac地址 2、kali使用nmap&#xff0c;arp-scan工具扫描 nmap -sn 172.16.100.0/24 arp-scan 172.16.100.0/24 I…

Kali Linux保姆级教程|零基础从入门到精通,看完这一篇就够了!(附工具包)

作为一名从事网络安全的技术人员&#xff0c;不懂Kali Linux的话&#xff0c;连脚本小子都算不上。 Kali Linux预装了数百种享誉盛名的渗透工具&#xff0c;使你可以更轻松地测试、破解以及进行与数字取证相关的任何其他工作。 今天给大家分享一套Kali Linux资料合集&#xf…

【大模型评测】常见的大模型评测数据集

开源大模型评测排行榜 https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard 其数据是由其后端lm-evaluation-harness平台提供。 数据集 1.英文测试 MMLU https://paperswithcode.com/dataset/mmlu MMLU&#xff08;大规模多任务语言理解&#xff09…

公网对讲|酒店无线对讲系统

提高工作效率 酒店对讲机可以帮助酒店员工实现快速、有效的内部沟通&#xff0c;从而提高服务质量。例如&#xff0c;前台接待人员可以通过对讲机及时通知客房服务人员为客人提供快速入住服务&#xff0c;或者通知餐饮部门为客人提供送餐服务。此外&#xff0c;对讲机还可以帮…

我劝你千万不要去做CSGO游戏搬砖

大家好&#xff0c;我是阿阳。今天我要给大家讲解一下做CSGO游戏搬砖项目前必须知道的五个问题。作为一个做这个项目已经三年多的老手&#xff0c;我带过的搬砖学员已经有好几百人了。在这个过程中&#xff0c;也积累了不少经验和教训&#xff0c;希望能够通过这篇文章给大家一…

Vue创建项目配置情况

刚开始接触vue项目创建和运行因为node版本和插件版本不一致时长遇到刚装好插件&#xff0c;项目就跑不起来的情况&#xff0c;特此记录一下 vue -V vue/cli 5.0.8 node -v v12.22.12 npm -v 6.14.16 关闭驼峰命名检查、未使用语法检查 package.json文件内容&#xff1a; {&…

数学建模常见算法的通俗理解(更新中)

目录 1.层次分析法&#xff08;结合某些属性及个人倾向&#xff0c;做出某种决定&#xff09; 1.1 粗浅理解 1.2 算法过程 1.2.1 构造判断矩阵 1.2.2 计算权重向量 1.2.3 计算最大特征根 1.2.4 计算C.I.值 1.2.5 求解C.R.值 1.2.6 判断一致性 1.2.7 计算总得分 2 神经网…

Verdaccio中,创建私服时,如何用VERDACCIO_PUBLIC_URL修改页面上资源文件的域名

更多内容&#xff0c;欢迎访问&#xff1a;Verdaccio npm私服时&#xff0c;遇到更多问题 用 Verdaccio 搭建私服时&#xff0c;当使用定义的域名访问时&#xff0c;报错&#xff0c;原因是JS等资源文件的访问域名是 127.0.0.1:4873&#xff0c;并不是我们想要的域名: 通过查看…

2024年第二届“华数杯”国际大学生数学建模竞赛 (B题 ICM)| 光伏发电分析 |数学建模完整代码+建模过程全解全析

光伏发电是一种重要的可再生能源。将太阳能转化为电力可以减少对传统能源的依赖,具有显著的环保和可持续发展优势。全球范围内,光伏发电正在迅速发展。目前,许多国家将光伏发电作为推动清洁能源转型的重要手段。这些国家在政策支持、技术创新和市场发展方面增加了对光伏发电的投…

视频改字视频制作系统,祝福视频,告白视频改字系统搭建开发定制

一、视频改字制作系统功能介绍&#xff1a; 素材同步&#xff0c;极速下载&#xff0c;会员充值&#xff0c;达人分销&#xff0c;积分系统&#xff0c;精美UI&#xff0c; 卡密兑换&#xff0c; 直播挂载&#xff0c; 五端兼容&#xff1a;微信小程序&#xff0c;抖音小程序&…

Kafka-RecordAccumulator分析

前面介绍过&#xff0c;KafkaProducer可以有同步和异步两种方式发送消息&#xff0c;其实两者的底层实现相同&#xff0c;都是通过异步方式实现的。 主线程调用KafkaProducer.send方法发送消息的时候&#xff0c;先将消息放到RecordAccumulator中暂存&#xff0c;然后主线程就…

JVM实战(23)——内存碎片优化

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

I2C总线和通信协议详解 (超详细配42张高清图+万字长文)

I2C总线和通信协议详解 (超详细配42张高清图万字长文) I2C&#xff08;Inter-Integrated Circuit&#xff09;通信总线&#xff0c;作为嵌入式系统设计中的一个关键组成部分&#xff0c;其灵活性和高效率使其在高级应用中备受青睐。本文旨在提供关于I2C通信总线的深度解析&…

认识并使用JWT

认识并使用JWT 一、互联网世界的用户认证二、对JWT的基本认知三、JWT的原理1 Header2 Payload3 Signature4 [参考资料](https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) 四、使用JWT1、引入依赖2、jwt的生成与解析3、测试3.1 生成jwt3.2 解析jwt 一、互…

DataXCloud部署与配置[智数通]

静态IP设置 # 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33# 修改文件内容 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.18.130 NETMASK255.255.255.0 GATEWAY192.168.18.2 DEFROUTEyes IPV4_FAILURE_FATALno IPV6INIT…

Pytorch各种Dropout层应用于详解

目录 torch框架Dropout functions详解 dropout 用途 用法 使用技巧 参数 数学理论公式 代码示例 alpha_dropout 用途 用法 使用技巧 参数 数学理论公式 代码示例 feature_alpha_dropout 用途 用法 使用技巧 参数 数学理论 代码示例 dropout1d 用途 用…