2026,Android Compose 终于支持 Hot Reload 了,但是收费

2026 年了,Android 的 Jetpack Compose 终于支持了 Hot Reload ,但是它不是 Google 或者 JetBrains 出品,而是个人开发者 Jaewoong Eum(skydoves)实现的一个 IDEA 插件: Compose HotSwan

Compose HotSwan 作为 Android Studio/IntelliJ IDEA 插件,它的核心功能是让 Jetpack Compose 代码支持类似 Flutter 的 Hot Reload

实际上 Compose Multiplatfrom 在 1.8.0 的时候就推出过 Hot Reload ,1.10 默认启动,但 JetBrains 只支持了桌面的 JVM 场景,因为 CMP 的 Hot Reload 严重依赖 JetBrains Runtime (JBR) 这个定制 JVM ,JBR 用 DCEVM(Dynamic Code Evolution VM)补丁来强制回退到解释执行模式从而支持 Hot Reload。

详细可见:《Compose Hot Reload 为什么只支持桌面 JVM,它和 Live Edit 又有什么区别?》

所以 CMP 的 Hot Reload 不支持 Android ,而 Compose HotSwan 的作用就是做了一个支持这个流程的插件,让用户在修改完 UI 代码或资源文件后,在 Android 平台也可以即时 Hot Reload。

根据官网描述,HotSwan 支持场景有:

  • 增量编译: 当你保存文件时,它只编译被修改的 Kotlin 文件和资源(使用 Kotlin 增量编译 + D8)
  • 类提取: 仅提取发生变化的 .class.dex 字节码
  • 内存交换(Class Swap): 将新的字节码通过底层技术注入到正在运行的 Android 进程内存,替换旧的类定义
  • 触发重组(Recompose): 自动触发 Compose 的重组机制,让新的 UI 代码在不丢失当前 remember 状态的情况下重新渲染

也就是 HotSwan 会监听 IDE 的文件保存,当用户保存 .kt 或资源文件时,插件会通过匹配文件路径与项目模块结构来识别该文件属于哪个 Gradle 模块。

所以 HotSwan 只在包含更改文件的模块上运行增量构建,如果你编辑了 :feature:home 里的文件,那么只有这个模块会被编译:

  • 独立编译 :每个函数体独立编译,更改一个函数不会影响其同类函数
  • 状态保持 :编译器分析修改后的代码,确保只重组受影响的范围,所有现有状态在重载过程中保持不变,即使组合可组合体重新排序
  • 参数刷新 :热重载后,运行时重新评估所有参数,确保所有参数都反映最新的代码

而对于资源文件(res/ 目录),HotSwan 采用不同的同步路径,它直接不编译 Kotlin,而是运行 processDebugResources 生成编译后的资源 APK 文件,然后应用到设备上进行实时补丁。

另外,HotSwan 会有一个运行在应用内的本地代理,当你的应用开启调试模式后,代理会被加载到 Android 运行时,而这个也就要求 Android API 等级为 28(Android 9.0 Pie)以上

Gradle 插件会自动将调试变体的 minSdk 设置为 28,不营销 Release 。

同时,HotSwan 插件支持以下 Android Studio 和 IntelliJ IDEA 2024.3 及更高版本:

  • Android Studio Meerkat (2024.3)
  • Android Studio Narwhal (2025.1)
  • Android Studio Otter (2025.2)
  • Android Studio Panda (2025.3, Preview)

当然,最重要的是,HotSwan 插件是针对 Kotlin 2.3.0 编译器 API 设计,所以编译器插件必须基于特定的最低版本构建,也就是 Kotlin 2.3.0+。

另外,不可避免的,HotSwan 插件依赖 AGP 8.7.3 版本的具体 Gradle 任务名称和输出目录,所以你的 AGP 也必 ≥ 8.7.3+

当然,由于 Android ART 对类重定义有严格限制(不允许在运行时更改类的结构、内存布局或方法签名),按 ART 的常规限制,运行时类重定义通常不允许修改类结构 ,但 HotSwan 通过额外的编译器与运行时处理,对部分结构性变化做了扩展支持,比如同文件新增函数、Data Class 新增属性等,不过这类能力并不是无限制的,而且在 API 30+ 上体验更完整,API 28/29 更容易回退到完整构建 ,其他如:

  • 函数添加与删除:

    • 支持:同一个文件内添加新的 Composable 或 Kotlin 函数并调用
    • 不支持: 跨文件的函数添加/删除,以及修改 inline 函数(内联函数在编译时被展开,没有独立单元可供替换)
  • Data Class(数据类)修改:

    • 支持: 向 Data Class 添加新属性(HotSwan 通过二进制转换处理了这种变化)
    • 不支持: 删除现有属性或修改属性类型,因为这会破坏内存布局
  • 构造函数(Constructor):

    • 支持: 为 Data Class 添加构造参数
    • 不支持: 修改普通类(如 ViewModel、Repository)的构造函数
  • 接口与父类:

    • 不支持: 修改类实现的接口或继承的父类,这属于类层次结构变更,系统会直接拒绝
  • 资源文件(Resources):

    • 支持: 修改现有资源的值(如改字符串内容、颜色值)
    • 不支持: 添加全新的资源(如新增一个 string 或 drawable)。因为新增资源会改变 R 类的字段分配,导致 ID 移位
  • Lambda 表达式:

    • 大部分支持: 增加或删除 Lambda 通常可以自动处理
    • 不支持: 如果修改导致编译器生成的匿名类(Helper Class)发生剧烈偏移且无法对齐时,热重载会失败

所以,API 30+ 支持更广的 Hot Reload ,比如新增函数、新增 enum 值、新增 data class 属性等,而 API 28/29 对这些通常要 full rebuild 。

当然,另一个角度,其实最大的限制是,它是一个收费插件

  • 它提供 14 天的免费试用期
  • 个人版: <math xmlns="http://www.w3.org/1998/Math/MathML"> 5 / 月或 5/月 或 </math>5/月或48/年
  • 商业版: $15/月

虽然它比 "Live Edit" 更强大,但是收费这个场景,确实会让插件的推广存在比较大的难度,当然,插件还带了一些其他增项支持的场景,例如自动截图支持:

每次成功 Hot Reload 后自动抓取设备截图,并将它和触发重载的 git diff 配对,然后在 IDE 工具窗口中出现一条按时间顺序排列的缩略图条,可以实时查看的 UI 变更历史

底部还有细节面板,会包含各种元数据(时间戳、构建时长)和导致变更的 git 差异,可以准确看到导致每种视觉状态的代码变动:

另一个增项是 ,HotSwan MCP 服务器支持通过 MCP 将任何 AI 助手连接到正在运行的 Android 应用 ,所有的 AI 工具都可以编辑 Compose 代码、触发热重载、捕捉设备截图,也就是可以让 AI 更便捷调试 UI ,这一步在 2026 还是很贴心的。

整体来看,HotSwan 的设计哲学是「尽可能热重载,不行就自动重编」, 它通过魔改编译器插件绕过了 Android 系统的部分限制,但对于彻底改变类结构的操作,依然还是需要依赖传统的重启式增量更新,但是思路确实是别处心裁,整个插件实现也相对完善,特别还有针对 AI 的支持,整体来说确实不错。

那么,你觉得这个插件如何?你会为了这个插件买单吗

链接

hotswan.dev/

相关推荐
hpoenixf8 小时前
2026 年前端面试问什么
前端·面试
还是大剑师兰特8 小时前
Vue3 中的 defineExpose 完全指南
前端·javascript·vue.js
泯泷8 小时前
阶段一:从 0 看懂 JSVMP 架构,先在脑子里搭出一台最小 JSVM
前端·javascript·架构
mengchanmian9 小时前
前端node常用配置
前端
华洛9 小时前
利好打工人,openclaw不是企业提效工具,而是个人助理
前端·javascript·产品经理
xkxnq9 小时前
第六阶段:Vue生态高级整合与优化(第93天)Element Plus进阶:自定义主题(变量覆盖)+ 全局配置与组件按需加载优化
前端·javascript·vue.js
A黄俊辉A10 小时前
vue css中 :global的使用
前端·javascript·vue.js
小码哥_常10 小时前
被EdgeToEdge适配折磨疯了,谁懂!
前端
小码哥_常10 小时前
从Groovy到KTS:Android Gradle脚本的华丽转身
前端