BaguTree Compose 分享

简介: BaguTree Compose 分享

BaguTree 组织地址:jetpack.net.cn/#/blog/all


目录:


  1. Compose 是什么
  2. 如何学习 Compose
  3. 用示例了解 Compose 重组
  4. Compose 的性能怎么样
  5. Compose 与 AGP、KGP 的关系
  6. Compose 对编译速度的影响
  7. Compose 跨平台现状


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


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


一、Compose 是什么


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

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


例如一个列表控件:


  • compose:
LazyColumn() {
    items(apkInfos, key = { apk -> apk.packageName!! }) { apk ->
        AppInfoItem(apk) {}
    }
}
复制代码
  • 原生 RecyclerView


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,可以显示声明组件与状态,并且可以很直观的查看状态在组件上的流转。


image.png

3、强大的兼容性


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


image.png

Compose 中嵌套原生 View 原理

二、如何学习 Compose


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


image.png

官方学习资料:


博文资料:

书籍:

image.png


三、用示例了解 Compose 重组


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


优化前:


输出结果:
MainActivity: MainScreen start
MainActivity: Greeting start Init
MainActivity: Greeting end Init
MainActivity: MainScreen end
等待 1秒
MainActivity: MainScreen start        // 重组
MainActivity: Greeting start Modified // 重组
MainActivity: Greeting end Modified   // 重组
MainActivity: MainScreen end          // 重组
复制代码

优化后:

image.png


输出结果:
MainActivity: MainScreen start
MainActivity: Greeting start Init
MainActivity: Greeting end Init
MainActivity: MainScreen end
等待 1秒
MainActivity: Greeting start Modified  // 重组
MainActivity: Greeting end Modified    // 重组
复制代码

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


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


四、Compose 的性能


4.1 Compose 与原生启动性能比较


image.png

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

4.2、Compose Baseline Profiles 加持


image.png

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


注意:

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

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


image.png

Compose、AGP、KGP 依赖关系图


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


  • Compose Compiler

image.png

  • kotlin-android-extension

image.png

  • kapt

image.png

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

image.png

5.1 Compose 版本最佳配置:


// 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"
    } 
}
复制代码

image.png

Compose 与 Kotlin 的兼容性对应关系

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 对编译速度的影响



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

image.png

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


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

七、Compose 跨平台现状


image.png

Compose 跨平台现状图

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


image.png

总结


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


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


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

目录
相关文章
cocoscreator实现spine用外部图片进行换皮
cocoscreator实现spine用外部图片进行换皮
1131 0
|
1月前
|
人工智能 搜索推荐 JavaScript
GEO文章发布后为什么仍可能失效?
GEO文章发布后失效,常因内容无法长期存活。本文提出“六层验证模型”:Survive(存活)→Retrieve→Read→Use→Cite→Recommend,强调内容须先稳定公开、可访问、可验证,方能成为AI可信信源。官网为原始事实源,第三方平台仅作传播放大器。(239字)
212 7
|
8月前
|
机器学习/深度学习 人工智能 算法
大模型微调PPO原理:让AI学会人类价值观的核心算法
PPO(近端策略优化)是大模型对齐人类价值观的核心强化学习算法。它通过截断重要性采样与KL约束,实现稳定、渐进的策略更新,在ChatGPT、Claude等系统中驱动RLHF训练。原理简洁、工程友好,已成为大模型对齐事实标准。
|
3月前
|
人工智能 JSON 自然语言处理
企业如何量化品牌在AI回答场景中的曝光表现
本文提出VPSI四维量化框架(可见度、显著性、情感度、影响度),解决AI回答中品牌曝光难以衡量的痛点,提供可落地的技术实现与评估体系,助力企业从经验判断转向数据驱动的品牌管理。
260 0
|
4月前
|
存储 人工智能 弹性计算
2026年阿里云618大促政策详解:新老用户权益与补贴规则
2026年阿里云618以**“AI加速季,智惠生产力”**为主题,活动周期为6月1日至6月30日,为期30天,是阿里云年度力度最大的云产品促销活动。本次大促投入**5亿元算力补贴**,覆盖轻量应用服务器、ECS云服务器、GPU高性能实例、数据库、AI大模型、存储与CDN等全品类产品,构建“新客秒杀、老客同价、企业补贴、AI特惠”的完整优惠体系。政策层面打破行业“首年低价、次年涨价”的痛点,推出**续费同价至2029年**、**新老用户权益互通**、**企业迁云高额补贴**等核心规则,同时将AI产品纳入优惠核心,通义千问主力模型直降97%,GPU实例低至1.5折。本文从活动基础信息、核心优惠政策
978 3
|
3月前
|
存储 数据可视化 物联网
基于阿里云DataV的智慧园区能耗可视化大屏实践
本文介绍基于阿里云DataV的智慧园区能耗可视化方案:融合合众致达NB-IoT/Cat.1智能表计、IoT平台、Lindorm时序数据库与函数计算,实现零代码、积木式多角色大屏搭建。解决数据上云后决策难问题,支持物业、EHS、租户等差异化视图,5天快速上线,告警响应缩至90秒,投诉下降81%。(239字)
490 0
|
10月前
|
监控 Java 开发工具
Android 崩溃监控实战:一次完整的生产环境崩溃排查全流程
某 App 新版上线后收到大量用户投诉 App 闪退和崩溃。仅凭一条崩溃日志和会话追踪,团队如何在2小时内锁定「快速刷新导致数据竞态」这一根因?本文带你复现真实生产环境下的完整排查路径:从告警触发、堆栈分析、符号化解析,到用户行为还原——见证 RUM 如何让“无法复现的线上崩溃”无所遁形。
1305 98
|
6月前
|
人工智能 API Apache
31B 干掉 405B:Google Gemma 4,正在终结参数军备竞赛
一个 31B 参数的模型,在全球开源大模型排行榜上排名第三。它身前倒下的,是 Qwen 3.5 的 397B,是 Llama 的 405B。
928 2
|
10月前
|
Linux 虚拟化 iOS开发
macOS Tahoe 26.2 (25C56) 发布,ISO、IPSW、PKG 下载
macOS Tahoe 26.2 (25C56) 正式版 ISO、IPSW、PKG 下载
1984 0
|
缓存 Android开发 iOS开发
Kotlin跨平台Compose Multiplatform实战指南
Kotlin Multiplatform (KMP) 结合 Compose Multiplatform,助力开发者用一套代码构建跨平台应用(Android、iOS、桌面和 Web)。本文提供实战指南,涵盖环境搭建、项目结构、共享 UI 编写、平台适配、状态管理及资源处理等内容。通过 expect/actual 处理差异,借助官方文档与示例项目学习,减少重复代码,优化多平台开发体验。
3358 18