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 路线图,了解我们目前正在考虑和开发的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

杨氏矩阵和杨辉三角

杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于O(N); 分析 若要满足要求时间复杂度小于O(N)&#xff0c;就不能每一行一个个…

IO进程线程 2024.2.19

1.使用fread和fwrite完成两个文件的拷贝 #include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("./tset.txt","w"))NULL){perror("open error");ret…

AT24C02(I2C总线)通信的学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、存储器介绍二、AT24C02芯片二、I2C总线I2C电路规范I2C时序结构I2C数据帧AT24C02数据帧 总结 前言 学习AT24C02(I2C总线)芯片 一、存储器介绍 RAM&#xf…

应急响应实战笔记03权限维持篇(1)

第1篇&#xff1a;Windows权限维持--隐藏篇 0x00 前言 攻击者在获取服务器权限后&#xff0c;通常会用一些后门来维持权限&#xff0c;如果你想让你的后门保持的更久些&#xff0c;那么请隐藏好它&#xff0c;使之不易被管理员发现。 0x01 隐藏文件 1、利用文件属性 最简单…

C++右值引用和移动语义

C右值引用和移动语义 在C中&#xff0c;我们经常会遇到左值和右值的概念。左值是可以获取地址的表达式&#xff0c;只要是一个变量&#xff0c;那他就一定是个左值。而右值则是临时的&#xff0c;不能赋值&#xff0c;也没有持久的内存地址。 int&& a 10; //a是右指…

前端首屏、白屏与卡顿性能优化?你想要的都在这里!

您好&#xff0c; 如果喜欢我的文章或者想上岸大厂&#xff0c;可以关注公众号「量子前端」&#xff0c;将不定期关注推送前端好文、分享就业资料秘籍&#xff0c;也希望有机会一对一帮助你实现梦想 首屏秒开 首屏秒开主要可以分为 4 个方法——懒加载&#xff0c;缓存&#…

备战蓝桥杯---动态规划(入门3之子串问题)

本专题再介绍几种经典的字串问题。 这是一个两个不重叠字串和的问题&#xff0c;我们只要去枚举分界点c即可&#xff0c;我们不妨让c作为右区间的左边界&#xff0c;然后求[1,c)上的单个字串和并用max数组维护。对于右边&#xff0c;我们只要反向求单个字串和然后选左边界为c的…

day03-股票数据报表与导出

day03-股票数据表报与导出 目标 理解涨幅榜业务需求;理解涨停跌停概念&#xff0c;并涨停跌停基本实现;理解涨停跌停SQL分析流程&#xff0c;并根据接口文档自定义实现;理解echarts基本使用;掌握easyExcel基本使用,并实现涨幅榜数据导出功能; 第一章 股票涨幅统计 1、涨幅榜…

获取 OpenAI Sora 访问权限:立即申请!

OpenAI的Sora是一种尖端的文本到视频的人工智能模型&#xff0c;它能够根据文本描述创建高清、详细的视频&#xff0c;这让人相当兴奋。这项技术代表了人工智能驱动的内容创作的重大飞跃&#xff0c;通过实现更动态、更吸引人的故事讲述和信息共享&#xff0c;为各个行业带来了…

Linux下多核CPU指定程序运行的核

设置程序在指定CPU核心运行 一、如何查看程序运行的CPU信息 1.1 查看当前系统CPU有几个核心 查看CPU核心数量&#xff1a;lscpu 1.2 查看程序的PID ps aux|grep cpu_test1.3 查看程序可运行的CPU taskset -c -p pid1.4 设置程序在指定核心上运行 1.4.1 通过运行时的参数设…

Linux系统——http协议介绍

目录 引言——Internet起源 一、http协议——超文本传输协议 1.http相关概念 2.访问浏览器的过程 3.http协议通信过程 4.http相关技术 4.1WEB开发语言 4.2html 4.3CSS 4.4JS 5.MIME——Multipurpose Internet Mail Extensions 多用途互联网邮件扩展 6.URI URN URL的…

【CentOS】Linux 文件与目录管理

目录 1、目录的切换、新增和删除 &#xff08;1&#xff09;cd (change directory&#xff0c;切换目录) &#xff08;2&#xff09;pwd (显示目前所在的目录) &#xff08;3&#xff09;mkdir (make directory&#xff0c;建立新目录 ) &#xff08;4&#xff09;rmdir (…

leetcode:494.目标和

解题思路&#xff1a;1.因为每个数字都有正负两种选择&#xff0c;所以可以采用回溯算法。&#xff08;会超时&#xff09; 2.分成两个集合&#xff0c;分别为正数集合&#xff08;left&#xff09;和负数&#xff08;right&#xff09;集合。 left right Sum ---> righ…

阿里云服务器操作系统有哪些?如何选择?

阿里云服务器镜像怎么选择&#xff1f;云服务器操作系统镜像分为Linux和Windows两大类&#xff0c;Linux可以选择Alibaba Cloud Linux&#xff0c;Windows可以选择Windows Server 2022数据中心版64位中文版&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器操…

力扣OJ题——相交链表

题目&#xff1a;160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 思路一&#xff08;暴力求解&#xff09;&#xff1a; A链表的每个节点依次跟B链表中节点进行…

芯课堂 | 华芯微特系列芯片CAN中断配置

​今天小编给大家带来的是华芯微特全系列芯片如何配置CAN中断模块的详细介绍&#xff0c;包括CAN各自中断以及错误处理方式&#xff0c;大家一起来看看吧。 Part 1&#xff1a;CANRX中断 CAN接受和发送模块各有64位深的FIFO用于缓存&#xff0c;如果像上图一样打开了RX非空中断…

java面试题之redis篇

1.redis 中的数据类型有哪些 随着 Redis 版本的更新&#xff0c;后面又支持了四种数据类型&#xff1a; BitMap&#xff08;2.2 版新增&#xff09;、HyperLogLog&#xff08;2.8 版新增&#xff09;、GEO&#xff08;3.2 版新增&#xff09;、Stream&#xff08;5.0 版新增&am…

C#||应用框体设计计算器

题目&#xff1a; 设计一个简单计算器 思路&#xff1a; 首先在应用框体中设计自己喜欢的计算器格式&#xff0c;接着编辑其中的函数。抽取一个Call函数用来显示从键盘输入的数字&#xff0c;cleanall()函数进行清屏操作&#xff0c;mode&#xff08;&#xff09;函数进行四…

Android EditText关于imeOptions的设置和响应

日常开发中&#xff0c;最绕不开的一个控件就是EditText&#xff0c;随之避免不了的则是对其软键盘事件的监听&#xff0c;随着需求的不同对用户输入的软键盘要求也不同&#xff0c;有的场景需要用户输入完毕后&#xff0c;有一个确认按钮&#xff0c;有的场景需要的是回车&…

ChatGPT如何提供实用且高质量的建议和指导,提高编程效率和准确性

ChatGPT4.0的功能包括&#xff1a; 无限制ChatGPT模型使用 GPT-4模型使用 GPT-4图像分析功能 GPT-4联网功能 GPT-4高级数据分析功能 GPT-4高级插件功能 DALLE-3高级AI绘图功能 如何能高效地处理文本、文献查阅、PPT编辑、编程、绘图和论文写作已经成为您成功的关键。而 …