==============================================

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 Multiplatform(CMP)在 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 裡的檔案,那麼只有這個模組會被編譯:

  • 獨立編譯: 每個函式體獨立編譯,更改一個函式不會影響同類的其他函式
  • 狀態保持: 編譯器分析修改後的程式碼,確保只重組受影響的範圍,所有既有狀態在重載過程中保持不變,即使組合可組件(composable)重新排序
  • 參數刷新: 熱重載後,執行時會重新評估所有參數,確保所有參數都反映最新的程式碼

而對於資源檔(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 天的免費試用期
  • 個人版: $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 的支援,整體來說確實不錯。

那麼,你覺得這個外掛如何?你會為了這個外掛買單嗎?

連結


原文出處:https://juejin.cn/post/7619754867242975284


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝14   💬10   ❤️2
399
🥈
我愛JS
📝2   💬9   ❤️2
88
🥉
💬1  
4
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付