Compose 1.6 发布:性能大升级、拖放新功能、文本新变化...

news2024/10/4 14:55:51

在这里插入图片描述

翻译自:

https://android-developers.googleblog.com/2024/01/whats-new-in-jetpack-compose-january-24-release.html

基于 1 月 24 号的 Compose 发行计划,我们正式推出了 Jetpack Compose 1.6 版本。

作为 Android 平台备受推崇的原生 UI 工具包,一众知名 App 都在使用 Compose 进行开发,比如 Threads、Reddit 和 Dropbox 等。如今,性能表现已成为 Compose 技术的重中之重,也是本次发布的 1.6 版本的核心焦点,包括:持续改进的 Modifier 系统、重要 API 的效率提升等等。

如果开发者想要尝试该版本,需要将 Compose BOM 升级到 2024.01.00

implementation platform('androidx.compose:compose-bom:2024.01.00')

1. 性能提升

此次发布的 Compose 在性能上有了全面的提升。在对标测试中,与 2023 年 8 月 23 日发行的版本相比,滚动性能提高了约 20%,启动耗时缩短了约 12%

当然,和上个 Compose 版本一样,大多数 App 无需额外修改代码,只需升到最新版本即可获得这些提升。

通过调研我们发现 Compose 在内存分配和初始化上存在可以优化的点,我们做了些调整来确保 Compose 框架只在必要时执行内存、初始化方面的操作来获得上述的提升。

这些改提升涉及到 Compose 所有的 API,尤其是文本控件、可点击控件、Lazy 列表和图形控件。

此外,由于我们一直在针对 Modifier.Node 进行着重构,这也在一定程度上促成了性能的提升。我们还提供了新的 Modifier 指南来指导开发者如何使用 Modifier.Node 来创建自定义的 Modifier。

配置外部 stable 类范围

Compose 编译器 1.5.5 里引入了一个新的编译选项:为 App 提供一个配置稳定性 class 范围的文件。

kotlinOptions {
    freeCompilerArgs += [
            "-P",
            "plugin:androidx.compose.compiler.plugins.kotlin:stabilityConfigurationPath=" +
                    project.absolutePath + "/compose_compiler_config.conf"
    ]
}

开发者可以在该文件里将任何 class 标记为 stable class,这些 class 可以来自于自己模块内的、外部 lib 中的,甚至是标准 lib 中的。

// Consider LocalDateTime stable
java.time.LocalDateTime
// Consider kotlin collections stable
kotlin.collections.*
// Consider my datalayer and all submodules stable
com.datalayer.**
// Consider my generic type stable based off it's first type parameter only
com.example.GenericClass<*,_>

有了这个配置,开发者无需再将这些 class 抽出来,额外封装到 stable class 中了。

需要说明的是,之前的标准的 stable 约束仍然有效,新的编译选项只是提供了另一种更方便让 Compose 编译器知道 App 将那些 class 视为 stable class 的途径。

有关 stable 配置的更多信息,可以参阅稳定性配置文档指南。

生成代码的性能改进

本次版本中,Compose 编译器 plugin 生成的代码也得到了改进。因为代码都是在 Composable 函数中生成的,对这些代码做些微小调整就能带来性能的巨大改进。

Compose 编译器会追踪 Compose 的 State 对象,以便在值发生变化时知道需要重组哪些可组合对象。但是通过调研我们发现,在很多情况下,一些 State 的值只会被读取 1 遍、或者压根不会被读取,但最终仍执行了频繁的、无意义的重组。本次更新将允许编译器可以跳过这些不需要的追踪。

Compose 编译器 1.5.6 还默认启用了“固有记忆”模式。该模式会在编译时内嵌"记住"功能,以考虑那些需要记住的 Composable 函数的参数信息。这个功能可以加快已记忆表达式是否需要重新评估的处理速度。

但也意味着如果在 remember 函数内部设置断点,调试的时候该函数可能不会被调用,因为编译器已删除了 remember 的使用,并采用其他不同的代码代替。

强制跳过重组模式

我们还致力于让开发者编写的代码自然而然地具备更高的性能。编译器将直观编写的代码进行优化,让开发者无需深入了解 Compose 的内部结构,就能明白为什么有的时候可组合函数会在不该重组的时候进行了重组。

此版本的 Compose 添加了一个叫做"强跳过模式"的实验性模式。该模式放宽了哪些变化可以跳过重组的规则,让它朝着开发者所期望的方向发展。启用后,如果传递进可组合函数的参数是相同实例的对象,即便参数类型是不稳定的,那么这些可组合函数也会被跳过重组。

此外,强跳过模式会自动记住组合中捕获了 unstable 类型值的 lambdas,而此前版本的默认行为是只记住捕获了 stable 类型值的 lambdas。

需要提醒的是:该模式目前是实验性质的,还不能用于生产环境,所以默认情况下是禁用的。当然,我们正在评估它的效果,并计划在 Compose 1.7 中默认启用它。

开发者可以参阅我们的强跳过模式指南,尝试使该模式并反馈发现的任何问题。

2. 文本控件新变化

默认不再添加内边距

本版本开始,Compose 会将文本控件的 includeFontPadding 属性的默认值改为 false。该属性的目的是在文本顶部和底部,根据字体尺寸添加额外的内边距。

改为 false 后,默认情况下文本的布局将会更贴近常用的设计工具,从而更容易匹配设计规范。

升级后,开发者可以看到如下的文本 padding 的细微变化。关于这项变化的详细信息可以参考专门的介绍:Fixing Font Padding in Compose Text。
在这里插入图片描述

支持非线性字体缩放

另外,本版本开始采用非线性字体缩放技术,以提高文本的可读性和可操作性。该技术通过应用非线性缩放曲线,来防止屏幕上的大型文本元素被缩放过大。这种策略意味着:缩放的时候,大尺寸文本和小尺寸文本的缩放速度是不同的。

3. 拖放新功能

Compose 基础模块里新增了对平台级拖放(drag and drop)功能的支持,允许在多窗口模式下的 App 之间拖放内容。该 API 与 View 的接口完全兼容,这意味着从 View 拖拽出来的视图可以被直接放入 Compose 中进行展示,反之亦然。

如果要使用此 API,可以参阅 Compose 拖拽的代码示例。

在这里插入图片描述

4. 其他新功能

当然,本次版本还包括其他功能,篇幅有限,感兴趣的开发者可自行探究:

  1. 在 Lazy list 控件中支持使用 LookaheadScope
  2. 解决了在 Lazy list 控件中已经停用但仍保持活跃状态便于重用的可组合函数默认不会从语义树中过滤掉的 issue
    • https://issuetracker.google.com/187188981
  3. 可以使用 keyframesWithSpline 通过单调样条插值任何 N 维值,它对于插入 OffsetIntOffsetDpOffset 等位置值特别有用
    • https://developer.android.com/jetpack/androidx/releases/compose-animation#1.6.0-beta01
  4. 添加了对鼠标选择(包括文本)的支持
    • https://issuetracker.google.com/180639271

尝试起来吧

非常感谢各位开发者向官方的 Compose 问题收集网站 提交的 issue 和新功能请求:是这些层出不穷的反馈帮助我们改进 Compose 以及引入所需的各式新 API。

欢迎继续提供反馈意见,帮助我们把 Compose 做大做强!

如果想知道 Compose 的下一步是什么?请查看我们的 Compose 路线图,了解我们目前正在考虑和开发的功能。

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

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

相关文章

vm centos7 docker 安装 mysql 5.7.28(2024-02-18)

centos系统版本 [rootlocalhost mysql5.7]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) docker版本 拉取指定版本镜像 docker pull mysql:5.7.28 docker images 创建挂载目录&#xff08;数据存储在centos的磁盘上&#xff09; mkdir -p /app/softwa…

【Python机器学习】详解Python机器学习进行时间序列预测

&#x1f517; 运行环境&#xff1a;Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

GWO优化kmeans

GWO&#xff08;灰狼优化器&#xff09;是一种群体智能优化算法&#xff0c;它模拟了灰狼的社会结构和狩猎行为。GWO算法通过模拟灰狼的等级制度、狩猎策略和搜索机制来寻找问题的最优解。而K-means是一种经典的聚类算法&#xff0c;用于将数据点划分为K个簇。将GWO优化算法应用…

LeetCode.589. N 叉树的前序遍历

题目 589. N 叉树的前序遍历 分析 我们之前有做过LeetCode的 144. 二叉树的前序遍历&#xff0c;其实对于 N 插树来说和二叉树的思路是一模一样的。 二叉树的前序遍历是【根 左 右】 N叉树的前序遍历顺序是【根 孩子】&#xff0c;你可以把二叉树的【根 左 右】想象成【根 孩…

数据结构之线性表插入与删除运算

线性表 线性表的定义 线性表&#xff0c;或称表&#xff0c;是一种非常灵便的结构&#xff0c;可以根据需要改变表的长度&#xff0c;也可以在表中任何位置对元素进行访问、插入或删除等操作。另外&#xff0c;还可以将多个表连接成一个表&#xff0c;或把一个表拆分成多个表…

网站常见的攻击类型有什么,如何针对性防护

在互联网时代&#xff0c;几乎每个网站都存在着潜在的安全威胁。这些威胁可能来自人为失误&#xff0c;也可能源自网络犯罪团伙所发起的复杂攻击。无论攻击的本质如何&#xff0c;网络攻击者的主要动机通常是谋求经济利益。这意味着不管是什么网站类型潜在的威胁一直都存在。 在…

使用傅里叶实现100倍的压缩效果(附Python源码)

傅里叶变换&#xff08;Fourier Transform&#xff09;是一种将一个函数&#xff08;在时间或空间域&#xff09;转换为另一个函数&#xff08;在频率域&#xff09;的数学变换方法。它在信号处理、图像处理、通信等领域有广泛应用。 实现过程 将傅里叶系数核心的1%保留&…

挑战杯 地铁大数据客流分析系统 设计与实现

文章目录 1 前言1.1 实现目的 2 数据集2.2 数据集概况2.3 数据字段 3 实现效果3.1 地铁数据整体概况3.2 平均指标3.3 地铁2018年9月开通运营的线路3.4 客流量相关统计3.4.1 线路客流量排行3.4.2 站点客流量排行3.4.3 入站客流排行3.4.4 整体客流随时间变化趋势3.4.5 不同线路客…

【Redis】理论进阶篇------Redis的持久化

一、前言 前面学习了Redis的相关的十大数据类型以及用SpringBoot集成我们的Redis的工具代码的书写。从这篇文章开始&#xff0c;就会从Redis相关的一些理论&#xff08;也是面试和工作的热点知识&#xff09;如&#xff1a;Redis的持久化、Redis的订阅发布模型、Redis集群环境搭…

RF框架自定义测试库开发

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Audition 2023(Au)下载安装及详细安装教程

Audition(Au)的介绍 Adobe Audition&#xff08;简称Au&#xff0c;原名Cool Edit Pro&#xff09;是由Adobe公司开发的一个专业音频编辑和混合环境。Audition专为在照相室、广播设备和后期制作设备方面工作的音频和视频专业人员设计&#xff0c;可提供先进的音频混合、编辑、控…

《汇编语言》- 读书笔记 - 第10章-CALL 和 RET 指令

《汇编语言》- 读书笔记 - 第10章-CALL 和 RET 指令 10.1 ret 和 retf检测点 10.1 10.2 call 指令10.3 依据位移进行转移的 call 指令检测点 10.2 10.4 转移的目的地址在指令中的 call 指令检测点 10.3 10.5 转移地址在寄存器中的 call 指令10.6 转移地址在内存中的 call 指令检…

LabVIEW高速信号测量与存储

LabVIEW高速信号测量与存储 介绍了LabVIEW开发的高速信号测量与存储系统&#xff0c;解决实验研究中信号捕获的速度和准确性问题。通过高效的数据处理和存储解决方案&#xff0c;本系统为用户提供了一种快速、可靠的信号测量方法。 项目背景 在科学研究和工业应用中&#xf…

session和cookie理解

目录 1、理解无状态 2、Session和Cookie理论 3、使用session存储数据 前言&#xff0c;理解session与cookie对于我们做web测试、接口测试、性能测试都是非常有帮助的。 cookie是一些数据信息&#xff0c;存储在浏览器端。 session是存储于服务器端的特殊对象&#xff0c;服务器…

Java并发基础:CompletableFuture全面解析

内容概要 CompletableFuture类使得并发任务的处理变得简单而高效&#xff0c;通过简洁的API&#xff0c;开发者能轻松创建、组合和链式调用异步操作&#xff0c;无需关心底层线程管理&#xff0c;这不仅提升了程序的响应速度&#xff0c;还优化了资源利用率&#xff0c;让复杂…

【Redis】 如何保证数据不丢失?

目录 1.Redis 持久化 1.1 RDB 持久化 1.2 AOF 持久化 1.3 混合持久化 2.Redis 集群 2.1 主从同步 2.2 哨兵模式 2.3 Redis Cluster 小结 1.Redis 持久化 持久化是指将数据从内存中存储到持久化存储介质中&#xff08;如硬盘&#xff09;的过程&#xff0c;以便在程序重…

C++之Easyx——图形库的基本准备工作

什么是Easyx&#xff1f; EasyX Graphics Library 是针对 Visual C 的免费绘图库&#xff0c;支持 VC6.0 ~ VC2022&#xff0c;简单易用&#xff0c;学习成本极低&#xff0c;应用领域广泛。目前已有许多大学将 EasyX 应用在教学当中。 它比Red PandaDev C上的图形库功能要强…

好用的UI自动化测试平台推荐

随着软件行业的不断发展&#xff0c;建立一个完善的自动化测试体系变得至关重要。目前&#xff0c;自动化测试主要涵盖接口自动化测试和UI自动化测试两个主要领域。就目前而言&#xff0c;企业在UI自动化测试方面的覆盖率仍然相对较低。 接口自动化测试可以模拟和执行应用程序…

怎么清理mac系统缓存系统垃圾文件 ?怎么清理mac系统DNS缓存

很多使用苹果电脑的用户都喜欢在同时运行多个软件&#xff0c;不过这样会导致在运行一些大型软件的时候出现不必要的卡顿现象&#xff0c;这时候我们就可以去清理下内存&#xff0c;不过很多人可能并不知道正确的清内存方式&#xff0c;下面就和小编一起来看看吧。 mac系统是一…

虚拟机--pc端和macOS端互通

windows开启虚拟化 要在Windows系统中开启虚拟化&#xff0c;您可以按照以下步骤操作&#xff1a; 准备工作&#xff1a; 确保您的计算机CPU支持虚拟化技术。在BIOS中开启相应的虚拟化支持。 开启虚拟化&#xff1a; 打开控制面板&#xff0c;点击程序或功能项&am…