Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Compose 线上分享会内容

Compose 线上分享会内容

作者头像
codelang
发布于 2022-11-30 06:49:35
发布于 2022-11-30 06:49:35
1.2K00
代码可运行
举报
文章被收录于专栏:codelangcodelang
运行总次数:0
代码可运行

本次分享有录屏,可查看 BaguTree 组织地址,感谢校长、强哥、超哥提供的分享平台:http://jetpack.net.cn/#/blog/all[1]

本期分享目标:让还在观望的开发者们可以没有顾虑的用上 Compose

  • 在与一些开发者沟通的过程中发现,有很多开发者并不知道怎么接入 Compose,有的可能尝试接入了,但会报各种奇奇怪怪的编译错误,如果在工程接入这块就发生问题了的话,这简直就是还没入门就劝退。
  • 也有的开发者以为需要 AGP 7.0 以上才能使用 Compose,对于目前现存的老工程无法接入。但到底是哪个版本才开始支持,还是有很多人不清楚。

一、Compose 是什么

  • 为什么采用 Compose[2]

Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API,可以帮助您简化并加快 Android 界面开发,打造生动而精彩的应用。它可让您更快速、更轻松地构建 Android 界面

1、更少的代码以及更快速的开发

例如一个列表控件:

  • compose:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LazyColumn() {
    items(apkInfos, key = { apk -> apk.packageName!! }) { apk ->
        AppInfoItem(apk) {}
    }
}
  • 原生 RecyclerView
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val rv = findViewById<RecyclerView>(R.id.rv)
val adapter = AppListAdapter()
rv.layoutManager = LinearLayoutManager(this)
rv.adapter = adapter

// 1、要写 Adapter 类
class AppListAdapter() : ListAdapter<ApkInfo, AppListAdapter.AppListViewHolder>(AppListDiff) {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppListViewHolder {
       ...
    }

    override fun onBindViewHolder(holder: AppListViewHolder, position: Int) {
        ...
    }
}

// 2、要写 ViewHolder 类
class AppListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
       ...
}
// 3、要写 Diff 类
private object AppListDiff : DiffUtil.ItemCallback<ApkInfo>() {
      ...
}
// 4、xml 部分代码

2、直观

Compose 使用声明式 API,可以显示声明组件与状态,并且可以很直观的查看状态在组件上的流转。

3、强大的兼容性

原生可以嵌套 Compose,Compose 可以嵌套原生,并且可以无缝的使用 Jetpack 组件,例如 ViewModel、LiveData、Flow 等

Compose 中嵌套原生 View 原理

二、如何学习 Compose

学习一门框架的几个步骤:

官方学习资料:

  • 了解官方走向:Jetpack Compose 路线图[3]
  • 了解 Compose 的样貌:使用 Jetpack Compose 更快地打造 更出色的应用[4]
  • 官方教程文档 : Jetpack Compose 使用入门[5]
  • 跟着官方动手实践:Compose Codelabs[6]
  • 参考官方写的应用:Compose-Sample[7]
  • Compose 补充库,有很多 UI 框架:Accompanist[8]

博文资料:

  • 官方公众号:Jetpack Compose(https://mp.weixin.qq.com/mp/homepage?__biz=Mzk0NDIwMTExNw==&hid=13&sn=92a0fbf8f1b75db9d1db83e858da83fd&scene=18)
  • fundroid Compose 系列(https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=Mzg5MzYxNTI5Mg==&scene=1&album_id=1846144099200876545&count=3&token=2135010104&lang=zh_CN#wechat_redirect)
  • Compose 博物馆文档[9]
  • Compose 博物馆开源项目[10]

书籍:

  • 购买链接:《Jetpack Compose 从入门到实战》(王鹏,关振智,曾思淇)[11]

三、用示例了解 Compose 重组

引用朱涛老师文章的示例:

优化前:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输出结果:
MainActivity: MainScreen start
MainActivity: Greeting start Init
MainActivity: Greeting end Init
MainActivity: MainScreen end
等待 1MainActivity: MainScreen start        // 重组
MainActivity: Greeting start Modified // 重组
MainActivity: Greeting end Modified   // 重组
MainActivity: MainScreen end          // 重组

优化后:

image.png

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输出结果:
MainActivity: MainScreen start
MainActivity: Greeting start Init
MainActivity: Greeting end Init
MainActivity: MainScreen end
等待 1MainActivity: Greeting start Modified  // 重组
MainActivity: Greeting end Modified    // 重组

一句话总结:状态读取发生在哪个 Scope,状态更新的时候,哪个 Scope 就发生重组

上面的代码段就是采用 lambda 延迟到 Greeting 方法来读取 state.value 值,将重组限制在 Greeting 这个可组合项的作用域中。

四、Compose 的性能

  • 相比 XML , Compose 性能到底怎么样?- 掘金[12]
  • Google I/O : Jetpack Compose 中常见的性能问题 - 掘金[13]
  • Jetpack Compose 笔记(3) - 重组的性能风险[14]

4.1 Compose 与原生启动性能比较

结论:Compose 的冷启动略逊于原生,两者相差 124ms,但在热启动与温启动状态下,Compose 性能又优于原生

4.2、Compose Baseline Profiles 加持

结论:有 Profiles 加持时,启动优化了 30ms

注意:

  • 通过查看 AGP 源码了解到,Baseline Profiles 的 task 只在 AGP 7.0 版本才支持,7.0 以下的 AGP 跑 Compose项目时,享受不到 Baseline Profiles 带来的优化

五、Compose 与 AGP(android-gradle-plugin)、KGP(kotlin-gradle-plugin) 的关系

Compose、AGP、KGP 依赖关系图

基于 KCP(kotlin compiler plugin) 的插件有:

  • Compose Compiler
  • kotlin-android-extension
  • kapt

Kotlin 插件的工作过程(图来自朱涛老师文章)

5.1 Compose 版本最佳配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// project build.gradle
buildscript {
   ext.kotlin_version = '1.6.10'
   ext.compose_version = '1.1.0'
   ...
   dependencies {
      ...
      classpath 'com.android.tools.build:gradle:4.1.0'
      classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
   }
}

// app build.gradle
android {
    ...
    buildFeatures{
        compose true
    }
    // 重点:覆盖掉 AGP 中的默认配置
    composeOptions{
        kotlinCompilerVersion  "$compose_version"
        kotlinCompilerExtensionVersion  "$kotlin_version"
    } 
}

Compose 与 Kotlin 的兼容性对应关系[17]

5.2 Compose 在 AGP 不同版本的表现

  • AGP 4.2.0 以下不支持正式版本的 Compose。在查看 AGP 4.1.0 时,该版本内置的 compose-compiler 依赖是 androidx.compose:compiler,而正式版本的依赖是 androidx.compose.compiler:compiler
  • AGP 4.2.0 开始支持正式版本的 Compose。可根据 composeOptions 来自由配置 compose 版本,但版本需要参考兼容性文档
  • AGP 7.0 以下不支持 ArtProfileTask,这会导致无法生成 baseline.prof 文件,进而享受不到 Baseline Profiles 带来的性能优化,结果就是性能不佳
  • AGP 7.0 开始支持正式版 Compose 与 Baseline Profiles

六、Compose 对编译速度的影响

  • Kotlin 编译之路 “JAVA编译器”[18]
  • Kotlin 编译之路 “Kotlin编译器”[19]
  • Jetpack Compose 导致的编译劣化 | KCP 简介 - 掘金[20]

如果反编译过 Compose 项目的话,你会发现代码里面有各种在编译期间自动插入的 composer 代码:

然后再来探讨下,compose compiler 到底耗不耗时?需不需要去重点关注?我的总结是:

  • 耗时是肯定的,但是不是痛点,我觉得得看项目结构,当项目采用壳工程+组件化方式开发,module 的耗时早就被打 aar 给均摊掉了,在主工程集成时,并不会影响编译耗时

七、Compose 跨平台现状

Compose 跨平台现状图

iOS 、Mac 端跨平台初见端倪,但目前还是实验阶段:

总结

业务开发上,目前 Android 技术发展已经进入存量阶段,现在已经很难再出现一款框架或是技术,来颠覆我们项目的生产,Compose 的推出,无疑是给 Android 生态增添了一份生机。

对于要不要使用 Compose 这个问题,我的建议是:先尝试了解,学习官方文档,然后尝试写一些 Demo,对照着公司的项目,用 Compose 去仿写几个页面,如果整体问题不大的话,可以尝试对公司项目的二三级页面进行改造,然后通过性能监控或是用户反馈的方式,来收集一些意见。

不过话也说回来,Jetpack Compose 容器依然是一个 ViewGroup,没有脱离原生 View 体系,我觉得,问题应该不会太大,最多就是代码使用不当,重组作用域扩大,导致页面卡顿,但这种在开发期间是可以通过调试和监控可发现的,所以,大家赶紧用起来吧。

参考资料

[1]

http://jetpack.net.cn/#/blog/all: http://jetpack.net.cn/#/blog/all

[2]

为什么采用 Compose: https://developer.android.com/jetpack/compose/why-adopt?hl=zh-cn

[3]

Jetpack Compose 路线图: https://developer.android.com/jetpack/androidx/compose-roadmap

[4]

使用 Jetpack Compose 更快地打造 更出色的应用: https://link.juejin.cn/?target=https%3A%2F%2Fdeveloper.android.google.cn%2Fjetpack%2Fcompose

[5]

Jetpack Compose 使用入门: https://link.juejin.cn/?target=https%3A%2F%2Fdeveloper.android.google.cn%2Fjetpack%2Fcompose%2Fdocumentation

[6]

Compose Codelabs: https://link.juejin.cn/?target=https%3A%2F%2Fcodelabs.developers.google.com%2F%3Fcat%3DAndroid%26text%3DCompose

[7]

Compose-Sample: https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fandroid%2Fcompose-samples

[8]

Accompanist: https://link.juejin.cn/?target=https%3A%2F%2Fgoogle.github.io%2Faccompanist%2F

[9]

Compose 博物馆文档: https://jetpackcompose.cn/docs/

[10]

Compose 博物馆开源项目: https://jetpackcompose.cn/docs/open-source-project/compose-douban

[11]

《Jetpack Compose 从入门到实战》(王鹏,关振智,曾思淇): https://item.jd.com/13290169.html

[12]

相比 XML , Compose 性能到底怎么样?- 掘金: https://juejin.cn/post/7008522702835154980

[13]

Google I/O : Jetpack Compose 中常见的性能问题 - 掘金: https://juejin.cn/post/7097066597222711327

[14]

Jetpack Compose 笔记(3) - 重组的性能风险: https://chenhe.me/post/jetpack-compose-notes3-recompose-performance-risk/

[15]

Improving performance - Baseline Profiles: https://developer.android.com/topic/performance/baselineprofiles#measuring-improvements

[16]

说一说Android的Dalvik,ART与JIT,AOT: https://zhuanlan.zhihu.com/p/53723652

[17]

Compose 与 Kotlin 的兼容性对应关系: https://developer.android.com/jetpack/androidx/releases/compose-kotlin

[18]

Kotlin 编译之路 “JAVA编译器”: https://zhuanlan.zhihu.com/p/76140170

[19]

Kotlin 编译之路 “Kotlin编译器”: https://zhuanlan.zhihu.com/p/76622754

[20]

Jetpack Compose 导致的编译劣化 | KCP 简介 - 掘金: https://juejin.cn/post/7115653622926409759

[21]

GitHub - JetBrains/compose-jb: https://github.com/JetBrains/compose-jb

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 扣浪 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Compose 与 AGP、KGP 的关系
在学习 Compose 的时候,有没有同学有一种困惑,Compose 到底是哪个 AGP 版本开始支持的,然后还会听到一些声音说,Compose 从 AGP 7.x 才开始支持,可当我使用 IntelliJ IDEA 创建 KMP 项目时,AGP 版本明明是 4.2.2,所以,为了搞清楚这个问题,我准备探索下 Compose 与他们之间的关系。
codelang
2022/11/30
1.2K0
Compose 与 AGP、KGP 的关系
Compose Desktop体验
最近 JetBarin 公司发布了 Compose Desktop[1]。是的,你没听错,就是 Google 用于 Android 上的 Compose[2]。
bennyhuo
2020/12/17
4.4K0
Compose Desktop体验
Baseline Profiles 在 Compose 中的应用
如下是官方使用 Baseline Profiles 在应用启动上提升的百分比,来自 《 Performance best practices for Jetpack Compose[1]》:
codelang
2022/11/30
1.1K0
Baseline Profiles 在 Compose 中的应用
Android Dev Summit '21 精彩内容盘点
每年9/10月份 Google 都会举行为期约2天的 Android Dev Summit,在活动上 Google 的技术专家们会分享一些 Android 领域的技术动向以及开发心得。
玖柒的小窝
2021/11/05
1.7K0
Android Dev Summit '21 精彩内容盘点
Jetpack Compose 使用前后对比
为了包含 Jetpack Compose 1.0.0-beta05 的更新内容,这篇文章在第一次发布后做出了更新。如果您希望查看 原始版本,请点击 这里。
Android 开发者
2022/03/09
1.2K0
Jetpack Compose 使用前后对比
Jetpack-Compose 学习笔记(一)—— Compose 初探
历时两年,Android 团队推出了全新的原生 Android 界面 UI 库——Compose。当然,Compose 也是属于 Jetpack 工具库中的一部分,官方宣称可以简化并加快 Android 上的界面开发,可以用更少的代码去快速打造生动而精彩的应用。1.0 版本就在上个月底刚刚发布,而且可以在生产环境中使用!不管咋样,先上手看一看!
修之竹
2022/08/19
2.3K0
Jetpack-Compose 学习笔记(一)—— Compose 初探
Android Jetpack组件 Compose 使用介绍
  一直以来,在Android 中构建UI页面是一个很耗时的操作,我们需要图形界面和xml去创建布局,通过预览达到我们想要的效果,而Jetpack推出的新组件Compose就解决了这个痛点,下面让我们来了解它,使用它。
晨曦_LLW
2022/03/28
3K0
Android Jetpack组件 Compose 使用介绍
Android Jetpack Compose开发体验
作为Android开发者,xml布局和Compose布局大家应该很熟悉,而Compose作为Android平台上第二款支持声明式UI的框架,第一款是Flutter框架了。
Rouse
2024/06/11
4390
Android Jetpack Compose开发体验
我是怎么学习 Compose 的
最近一直在看 Compose 相关的东西,也算是从了解到入了个门,在将近一个月的课后(下班)学习中,输出了 3 篇原理性相关的文章,从文章标题可以看出,我是从原生与 Compose 之间的交互进行探索的:
codelang
2022/08/30
8970
我是怎么学习 Compose 的
Jetpack Compose开篇 之 HelloWorld
此前我更新了Jetpack Architecture系列的文章,如果你还不了解Jetpack,可以移步至 Android JetPack系列文章 ,持续更新中
黄林晴
2020/12/01
1.9K0
Jetpack Compose开篇 之 HelloWorld
一文带你了解 Google I/O 2022 精彩汇总与个人感想
作为时隔 3 年再次回归海岸线圆形剧场,谷歌这次 I/O 大会可以说是干活满满,特别是本次大会的“线上会场”,Adventure 用类似“元宇宙”的概念,让广大开发者可以在“游戏”中逛遍所“展厅”,同时通过完成各种有趣的小游戏来参与大会,甚至你还可以钓鱼挂机...当然,最重要的是可以和全球各个开发者线上交流,这无疑是本次大会最优秀的一环。
GSYTech
2022/05/24
3.1K0
原创|Android Jetpack Compose 最全上手指南
在今年的Google/IO大会上,亮相了一个全新的 Android 原生 UI 开发框架-Jetpack Compose, 与苹果的SwiftIUI一样,Jetpack Compose是一个声明式的UI框架,随着了今年安卓和苹果两大移动平台相继推出自己的UI开发框架Jetpack Compose 和SwiftIUI,标志着移动操作系统正式全面拥抱声明式 UI 开发模式。
音视频开发进阶
2019/11/20
6.5K0
原创|Android Jetpack Compose 最全上手指南
Jetpack Compose | 声明式 UI 编程的革命
下载地址 developer.android.google.cn/studio/prev… ,这里下载的是 2020.3.1 版的AndroidStudio 。
张风捷特烈
2021/03/04
1.7K0
Jetpack Compose | 声明式 UI 编程的革命
Android Compose 新闻App(二)ViewModel、Hlit、数据流
  在上一篇文章中我们构建了网络框架了,现在可以在页面中通过liveData的Observe回调中看到网络数据的返回。
晨曦_LLW
2022/04/15
1.5K0
Android Compose 新闻App(二)ViewModel、Hlit、数据流
技术漫谈之——Jectpack Compose
最近Jetpack Compose发布了Beta版本,抽时间了解了一下Compose带来的改变和其中的一些原理。本文不会讲解具体API,只是比较随意的分享自己的一些疑问以及在探寻答案过程中的一些收获。
BlueSocks
2022/03/31
9980
技术漫谈之——Jectpack Compose
安卓软件开发:Jetpack Compose 和 Material 3 实现高级登录页面(Kotlin)
在项目的 build.gradle 文件中添加 Compose 和 Material 3 的依赖项:
Nimyears
2024/09/14
9410
使用 Jetpack Compose 提升 Play 商店的用户体验
作者 / Google Play 技术负责人 Andrew Flynn 和 Jon Boekenoogen
Android 开发者
2022/04/02
3.3K0
使用 Jetpack Compose 提升 Play 商店的用户体验
开发一款 SDK 需要注意哪些问题
当业务方的 Java 环境是 1.8 时,如果 SDK 是使用 Java 11 编译,则调用 SDK 相关代码的地方在编译时将会报错:
codelang
2024/02/17
3390
开发一款 SDK 需要注意哪些问题
一起看 I/O | Jetpack 组件的新特性
作者 / Amanda Alexander, Product Manager, Android
Android 开发者
2022/09/01
3.3K0
一起看 I/O | Jetpack 组件的新特性
从0上手Jetpack Compose,看这一篇就够了~
2月底的时候,Android 官方发布了Compose的完整课程。了解到许多小伙伴还没开始学习Compose,所以我写了一篇基础文章,让我们一起轻松上手Compose~
黄林晴
2024/01/11
1.8K0
从0上手Jetpack Compose,看这一篇就够了~
推荐阅读
相关推荐
Compose 与 AGP、KGP 的关系
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验