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

在这里插入图片描述

翻译自:

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.mzph.cn/news/690163.shtml

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

相关文章

P4447 [AHOI2018初中组] 分组题解

题目 小可可的学校信息组总共有n个队员&#xff0c;每个人都有一个实力值。现在&#xff0c;一年一度的编程大赛就要到了&#xff0c;小可可的学校获得了若干个参赛名额&#xff0c;教练决定把学校信息组的n个队员分成若干个小组去参加这场比赛。 但是每个队员都不会愿意与实…

安全测试工具安装指南:在统信UOS上部署Burp Suite

原文链接&#xff1a;安全测试工具安装指南&#xff1a;在统信UOS上部署Burp Suite 大家好&#xff01;在网络安全领域&#xff0c;Burp Suite是一款不可或缺的工具&#xff0c;它提供了从初级映射和分析应用程序攻击面到查找和利用安全漏洞的一系列功能。今天&#xff0c;我将…

Shiro-05-shiro 基础知识补充密码学+哈希散列

密码学 密码术是隐藏或混淆数据的过程&#xff0c;因此窥探眼睛无法理解它。 Shiro的加密目标是简化JDK的加密支持并使之可用。 需要特别注意的是&#xff0c;密码通常不是特定于主题的&#xff0c;因此Shiro API的其中一个领域不是特定于主题的。 即使未使用“主题”&…

【elk查日志 elastic(kibana)】

文章目录 概要具体的使用方式一&#xff1a;查找接口调用历史二&#xff1a;查找自己的打印日志三&#xff1a;查找错误日志 概要 每次查日志&#xff0c;我都需要别人帮我&#xff0c;时间长了总觉得不好意思&#xff0c;所以这次下定决心好好的梳理一下&#xff0c;怎么查日…

spellman电源维修X3635系列CCM5P4X3635

Spellman高压发生器维修Perkin Elmer分析仪电源维修CCM5P4X3635 Perkin Elmer W102266 X射线高压发生器spellman电源维修X4297系列CT机高压电源维修CT42&#xff1b;CT70系列。SPELLMAN高压发生器应用于东芝CT机XVISION/EX、AUKLET系列、ASTEION系列、以及多排系列&#xff0c…

一文概括|CSC访问学者/博士后/联培申请及派出流程详解

为帮助申请者了解国家留学基金委&#xff08;CSC&#xff09;的政策&#xff0c;以及申报及派出的全过程&#xff0c;知识人网小编利用本文简略介绍并提出规划建议。 公派留学包括国家、地方&#xff08;含省市、行业、学校医院等单位&#xff09;资助派出。而国家公派则由留学…

HarmonyOS开发篇—数据管理(分布式数据服务)

分布式数据服务概述 分布式数据服务&#xff08;Distributed Data Service&#xff0c;DDS&#xff09; 为应用程序提供不同设备间数据库数据分布式的能力。通过调用分布式数据接口&#xff0c;应用程序将数据保存到分布式数据库中。通过结合帐号、应用和数据库三元组&#xf…

软件测试实训系统建设方案2024

软件测试实训室解决方案 一 、方案概述 软件测试实训解决方案是一个复杂且至关重要的过程&#xff0c;它确保了软件在开发过程中的各个模块能够正确地集成和交互。通过这一系列的测试步骤&#xff0c;开发团队能够及时发现并修复潜在的问题&#xff0c;从而提高软件的整体质量…

【漏洞复现-通达OA】通达OA share存在前台SQL注入漏洞

一、漏洞简介 通达OA&#xff08;Office Anywhere网络智能办公系统&#xff09;是由北京通达信科科技有限公司自主研发的协同办公自动化软件&#xff0c;是与中国企业管理实践相结合形成的综合管理办公平台。通达OA为各行业不同规模的众多用户提供信息化管理能力&#xff0c;包…

【Java EE初阶十五】网络编程TCP/IP协议(二)

1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大&#xff0c;但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类&#xff1a; 1、ServerSocket&#xff1a;给服务器使用的类&#xff0c;使用这个类来绑定端口号 2、Socket&#xf…

全网最容易理解的KMP算法讲解

引言 其实网上有很多讲解KMP算法的文章&#xff0c;详略不一&#xff0c;我认为有两点没有解释清楚&#xff1a; 第一点&#xff1a;匹配失败以后&#xff0c;模式串的位移 第二点&#xff1a;next数组的生成算法 希望本篇文章能将KMP算法清晰易懂的拆解开来。 暴力匹配 …

网络同步—帧同步和状态同步解析

概述 同步就是要多个客户端表现效果是一致的&#xff0c;而且对于大多数的游戏&#xff0c;不仅仅要表现一致&#xff0c;还要客户端和服务器的数据也是一致的。所以同步是个网络游戏概念&#xff0c;只有网络游戏才需要同步&#xff0c;而单机游戏是不需要同步的。 帧同步和…

算法-3-基本的数据结构

单双链表 1.单链表双链表如何反转 import java.util.ArrayList; import java.util.List;public class Code01_ReverseList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {public int…

掘根宝典之C++深复制与浅复制(复制构造函数,默认复制构造函数)

到目前为止我们已经学了构造函数&#xff0c;默认构造函数&#xff0c;析构函数&#xff1a;http://t.csdnimg.cn/EOQxx 转换函数&#xff0c;转换构造函数&#xff1a;http://t.csdnimg.cn/kiHo6 友元函数&#xff1a;http://t.csdnimg.cn/To8Tj 接下来我们来学习一个新函数…

python毕设选题 - 大数据全国疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的…

2024阿里云云服务器ECS价格表出炉

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

【Funny Game】 人生重开模拟器

目录 【Funny Game】 人生重开模拟器&#xff01; 人生重开模拟器&#xff01; 文章所属专区 Funny Game 人生重开模拟器&#xff01; 人生重开模拟器&#xff0c;让你体验从零开始的奇妙人生。在这个充满惊喜和挑战的游戏中&#xff0c;你可以自由选择性别、出生地、家庭背景…

String.format()详细用法

String 类有一个强大的字符串格式化方法 format()。下面是常用的方法总结。 一、占位符类型 String formatted String.format("%s今年%d岁。", "小李", 25); // "小李今年25岁。" 二、字符串和整数格式化 // 将第二个入参拼接到模板中,入参长…

职业性格在求职应聘和跳槽中的作用

性格测试对跳槽者的影响大不大&#xff1f;首先我们要弄清楚两个问题&#xff0c;性格对我们的职业生涯又没有影响&#xff0c;性格测试是什么&#xff0c;职场中有哪些应用&#xff1f;性格可以说从生下来就有了&#xff0c;随着我们的成长&#xff0c;我们的性格也越来越根深…

大模型训练流程(一)预训练

预训练GPU内存分析&#xff1a; GPU占用内存 模型权重 梯度 优化器内存&#xff08;动量估计和梯度方差&#xff09; 中间激活值*batchsize GPU初始化内存 训练流程 &#xff08;选基座 —> 扩词表 —> 采样&切分数据 —> 设置学习参数 —> 训练 —>…