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

news2024/11/19 20:39:43

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 = false
            signingConfig = signingConfigs.getByName("debug")
            matchingFallbacks += "release"
        }
}

生成启动规则

@RunWith(AndroidJUnit4::class)
class StartupProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun 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.coloradmin.cn/o/1389622.html

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

相关文章

SDRAM小项目——命令解析模块

简单介绍&#xff1a; 在FPGA中实现命令解析模块&#xff0c;命令解析模块的用来把pc端传入FPGA中的数据分解为所需要的数据和触发命令&#xff0c;虽然代码不多&#xff0c;但是却十分重要。 SDRAM的整体结构如下&#xff0c;可以看出&#xff0c;命令解析模块cmd_decode负责…

知存科技助力AI应用落地:WTMDK2101-ZT1评估板实地评测与性能揭秘

文章目录 一、前言二、深入了解存算一体技术2.1 什么是存算一体2.2 存算一体技术发展历程2.3 基于不同存储介质的存内计算芯片性能比较 三、国产存算一体&#xff0c;重大进展3.1 知存科技&#xff1a;我国存算一体领域的研发领导者 四、知存科技新型 WTM2101 SOC 评估板使用评…

【RTOS】快速体验FreeRTOS所有常用API(9)中断管理

目录 九、中断管理9.1 基本概念9.2 两套API9.3 中断服务程序 九、中断管理 该部分暂无代码 9.1 基本概念 FreeRTOS中的中断管理主要涉及&#xff1a;两套API、中断服务编写 不能阻塞、不能处理耗时任务ISR的优先级高于任务&#xff1a;即使是优先级最低的中断&#xff0c;它的…

【小黑嵌入式系统第十五课】μC/OS-III程序设计基础(四)——消息队列(工作方式数据通信生产者消费者模型)、动态内存管理、定时器管理

上一课&#xff1a; 【小黑嵌入式系统第十四课】μC/OS-III程序设计基础&#xff08;三&#xff09;——信号量&#xff08;任务同步&资源同步&#xff09;、事件标记组&#xff08;与&或&多个任务&#xff09; 前些天发现了一个巨牛的人工智能学习网站&#xff0c…

美媒:OpenAI删除了禁止其技术被用于军事用途的条款

据美国调查新闻网站“拦截者”&#xff08;The Intercept&#xff09;1月12日报道&#xff0c;美国知名人工智能企业、ChatGPT母公司OpenAI近日悄悄修改了其产品的使用条款&#xff0c;删除了禁止将OpenAI技术用于军事用途的条文。 报道称&#xff0c;在今年1月10日之前&#…

Springboot+vue的智能无人仓库管理(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的智能无人仓库管理&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的智能无人仓库管理&#xff0c;采用M&#xff08…

基于Springboot的私人健身与教练预约管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的私人健身与教练预约管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三…

java基础:求数组的和以及平均数案例分析

/* * * 解题思路&#xff1a;首先定义一个包含数字的数组hens&#xff0c; * 然后使用循环遍历数组中的每个元素&#xff0c;并将其累加到sum变量中。 * 最后&#xff0c;将sum除以数组长度得到平均值avg。最终将结果打印输出到控制台。*/ 代码如下&#xff1a; package idea;…

机器学习算法实战案例:GRU 实现多变量多步光伏预测

文章目录 1 数据处理1.1 数据集简介1.2 导入库文件1.3 数据集处理1.4 训练数据构造 2 模型训练与预测2.1 模型训练2.2 模型多步预测2.3 预测可视化 答疑&技术交流机器学习算法实战案例系列 1 数据处理 1.1 数据集简介 实验数据集采用数据集7&#xff1a;常州普利司通光伏…

[linux]同步缓冲区数据到flash

一、需求 由于linux自身策略问题&#xff0c;在某些情况下需主动同步数据到flash。 二、方案 同步数据的两种方式&#xff1a;sync和fsync 2.1sync 将整个缓冲区同步至flash。性能较差。 2.2fsync -d [file] 将某一文件的数据同步至flash。 三、应用实例 3.1sync 3.2f…

虚拟服务器的监控和管理

IT 网络中虚拟环境的出现给 IT 管理员带来了一些挑战&#xff0c;虚拟环境降低了管理硬件和软件的成本和复杂性&#xff0c;同时&#xff0c;他们通常需要 IT 管理员管理更多的空间&#xff0c;以确保完全可见和快速解决问题。 虚拟服务器在现代 IT 基础架构中越来越普遍&…

NXP采用RS RTS测试系统,验证28纳米RFCMOS雷达单芯片 |百能云芯

Rohde & Schwarz的雷达目标模拟器R&S RTS&#xff0c;作为汽车雷达的颠覆性解决方案&#xff0c;尤其是其能够电子模拟非常近距离物体的能力&#xff0c;已被用于验证NXP半导体的下一代雷达传感器参考设计的性能。 这一合作使汽车行业在汽车雷达的发展上迈出了一步&…

.net core 6 集成nacos的服务注册和配置中心

1、安装nuget包 2、加上配置文件 "nacos": {"ServerAddresses": [ "http://127.0.0.1:8848" ],"GroupName": "DEFAULT_GROUP","ClusterName": "DEFAULT","ServiceName": "webapi"…

【Linux实用篇】项目部署 基于Shell脚本自动部署

目录 1. 项目部署 1.1 手动部署项目 1.2 基于Shell脚本自动部署 1.2.1 介绍 1.2.2 推送代码到远程 1.2.3 Git操作 1.2.4 Maven安装 1.2.5 Shell脚本准备 1.2.6 Linux权限 1.2.7 授权并执行脚本 1.2.8 设置静态IP 1. 项目部署 之前我们讲解Linux操作系统时&#xff0…

基于拓扑图与领导跟随法的编队控制算法

matlab2020可运行 https://download.csdn.net/download/ljjjjjjjjjjj/88750436

导航与定位技术已成为移动机器人的核心技术之一

随着移动机器人技术的不断发展和应用领域的扩大&#xff0c;导航与定位技术已成为移动机器人的核心技术之一。本文将介绍移动机器人导航与定位技术的发展现状、技术前沿和面临的挑战。 ​ 一、导航与定位技术的发展现状 移动机器人的导航与定位技术是实现自主移动的关键。目前…

Vscode——运行java项目

1、安装JDK&#xff08;已安装请忽略&#xff09; 教程&#xff1a;https://blog.csdn.net/qq812457115/article/details/117451011 验证是否已安装&#xff0c;命令符输入 java -version2、安装Maven&#xff08;已安装请忽略&#xff09; 教程&#xff1a;https://blog.csdn…

LeetCode刷题---反转链表II

LeetCode官方给出的解题思路 在需要反转的区间里&#xff0c;每遍历到一个节点&#xff0c;让这个新节点来到反转部分的起始位置。 使用了三指针的思想。 定义三个节点: curr&#xff1a;指向待反转区域的第一个节点 left&#xff1b; next&#xff1a;永远指向 curr 的下一个节…

怎样实现安全便捷的网间数据安全交换?

数据安全交换是指在数据传输过程中采取一系列措施来保护数据的完整性、机密性和可用性。网间数据安全交换&#xff0c;则是需要进行跨网络、跨网段甚至跨组织地进行数据交互&#xff0c;对于数据的传输要求会更高。 大部分企业都是通过网闸、DMZ区、VLAN、双网云桌面等方式实现…

电脑软件:沙盒 Sandboxie 快速上手使用教程

目录 一、软件简介 二、软件功能 三、安装步骤 四、 软件使用 一、软件简介 沙盘Sandboxie中文版是一款非常好用的系统安全工具软件&#xff0c;沙盘Sandboxie中文版能够很好的进行安全测试&#xff0c;拥有一个安全的环境&#xff0c;你不用担心自己的浏览记录被曝光&am…