Daily Digest

每日新聞摘要

2026年04月10日

今日總結

內容會跟隨語言切換。

📝 今日焦點:Java 生態以「上下文增強生成」與多項版本更新與資源為主,並點選本週精選、實用講座,Jetpack Compose 推出 FlexBox、HotSwan 並討論 Daydream 與嵌入式 Compose 技巧。 🔧 效能最佳化:注意 TextureView 在 AAOS 上的過度像素與 GPU 緩衝問題,持續動畫與模糊效果亦需評估成本,並採用 StrictMode 與 daemon 清理工具降低資源浪費。 🏗 架構設計:倡導離線優先與集中化 inset 消耗模式,推動型別化導覽與可測條碼掃描實作,並檢視 BLE 範例、嵌入式 Kotlin 與 build_runner 的技術取捨。 ✅ 測試與品質:回歸可測性與現代化測試,採用 Flow 與集合不變策略提升維護度,並以範例、工具與提示庫驗證功能。

01

Java Weekly, Issue 641

Baeldung 作者:baeldung 發布:04-10 09:51

Java Weekly,第 641 期

一篇深入介紹 Context-Augmented Generation(CAG)的文章,說明在檢索前如何注入使用者身分、會話狀態與商業約束,並示範以 Spring Boot 實作。

重點摘要

焦點:以 Spring Boot 實作的 Context-Augmented Generation(CAG)
技術動態:AWS S3 Files 可透過 EFS 掛載 S3 為檔案系統
重大更新:Spring Cloud 2025.0.2、Hibernate 7.3.0.Final、Quarkus、Elasticsearch、TornadoVM

本期 Java Weekly(第641期,Baeldung)整理 Spring 與 Java 重點:主文介紹以 Spring Boot 實作的 Context-Augmented Generation(CAG),在檢索前注入使用者身分、會話狀態與商業約束;並推薦 VarHandle 原生記憶體、Dash0 可觀察性、Java 記憶體/JEPs 與 Spring AI 持久記憶等延伸閱讀;涵蓋 Bootiful Podcast、後量子密碼學、JVM 異常分析等講座,並列出多項版本更新(如 Spring Cloud 2025.0.2、Hibernate 7.3.0.Final、Helidon、Quarkus、Elasticsearch、TornadoVM)。本週精選為 Paul Graham 的《Do Things that Don't Scale》。

02

Meet FlexBox: The Powerful New Layout System for Compose

ProAndroidDev 作者:Nav Singh 發布:03-28 15:46

認識 FlexBox:Compose 的強大新佈局系統

FlexBox 整合 Row、Column 與 FlowRow 的功能,並提供對齊、換行與項目分配的細緻控制。

重點摘要

以 CSS Flexbox 為靈感,為 Jetpack Compose 提供彈性佈局
支援 direction、wrap、justifyContent、alignItems、alignContent 與 gap
每個子項可設定 grow、shrink、basis、order 與 alignSelf

Jetpack Compose 推出 FlexBox,一個參考 CSS Flexbox 的全新佈局 Composable,將 Row、Column 與 FlowRow 的功能整合為單一彈性容器。FlexBox 可根據主軸方向(Row/Column)動態排列子項目,支援換行模式與配置參數(direction、wrap、justifyContent、alignItems、alignContent、gap)。每個子項可透過 flex 設定 grow、shrink、basis、order 與 alignSelf,控制擴展、收縮與顯示順序。文章附上多個範例(列/欄成長、換行、反向等),示範固定尺寸與彈性項目的混合使用。FlexBox 讓 Compose 的自適應 UI 設計更簡潔且可控,減少在剛性與動態佈局間的取捨。

03

The Surface That Was Too Big

ProAndroidDev 作者:Rohith Gaddam 發布:03-28 15:51

太大的 Surface

TextureView 的佈局尺寸會決定 GPU 緩衝區的配置與每幀合成成本,使用 fillMaxSize 可能導致大量過度配置與雙重合成負擔。

重點摘要

TextureView 按視圖尺寸一次性分配三個緩衝區:3 × 寬 × 高 × 4 位元組。
TextureView 在應用進程內用 GL 混合,SurfaceFlinger 再次合成;SurfaceView/AndroidExternalSurface 可使用硬體 overlay 減少一次合成。
修正方法:將 Surface 大小設為設計規格、在無法控制布局時使用 setDefaultBufferSize,或在 SDK 支援 raw Surface 時遷移到 AndroidExternalSurface。

作者指出在 AAOS 上,一個用 fillMaxSize 的 TextureView 會把整個容器尺寸交給 GPU,造成三倍緩衝區的固定分配與每個 VSYNC 的合成負擔。文章以範例說明,本應為 320×480dp 的 3D 車輛視圖被擴到整個 1080×700dp 卡片,導致每個視圖多耗約 54.7MB GPU 緩衝與大量像素/秒的合成工作。即使 3D 引擎只在低速率更新,GL 合成仍按顯示刷新率執行。建議測量 onSurfaceTextureAvailable 回傳的尺寸以驗證實際交給 SDK 的像素,並以正確的維度或 setDefaultBufferSize、或在可行時改用 AndroidExternalSurface/SurfaceView 修正。對汽車 SoC 而言,連續記憶體池與有限的 overlay 平面使得表面尺寸管理成為正確性問題。

04

Finally find the Android Service of your dreams after 13 years

ProAndroidDev 作者:Pavel Nestsiarenka 發布:03-30 01:55

終於找到夢想中的 Android Service(等了 13 年)

Android 在 2012 推出的 Daydream 允許在手機睡眠時顯示自訂介面,透過在 DreamService 中嵌入 ComposeView 並綁定生命週期與 SavedState,可用 Compose 撰寫畫面。

重點摘要

Daydream(Android 4.2)可於裝置睡眠/充電時顯示自訂介面。
可用 ComposeView.setContent 並 setContentView 將 Compose 嵌入 DreamService。
在 DreamService 實作 SavedStateRegistryOwner 與 LifecycleRegistry,並綁定到 View。

作者重新發現 Android 在 2012(Android 4.2)推出的 Daydream 功能,能在手機睡眠或充電時顯示自訂介面。他示範如何在 Manifest 宣告 DreamService 並以 setContentView 設定介面;若要使用 Jetpack Compose,可建立 ComposeView 並呼叫 setContent 後設為服務內容。由於 DreamService 預設沒有 ViewTreeLifecycleOwner 與 SavedStateRegistryOwner,文章示範在 DreamService 中實作 SavedStateRegistryOwner 與 LifecycleRegistry,並以 setViewTreeLifecycleOwner 與 setViewTreeSavedStateRegistryOwner 將它們綁定到 ComposeView,使 Compose 的生命週期與儲存狀態同步。此技巧可用來製作實務可用的休眠畫面,也是一個有趣的面試話題。

05

Jetpack Compose: Animated Snake Border for Rectangle Shapes

ProAndroidDev 作者:Yuriy Skul 發布:03-30 15:49

Jetpack Compose:矩形形狀的動態蛇形發光邊框

透過把邊界拆成八個有序區段並以時間為基礎計算頭尾位置,可實現恆定速度且無接縫的蛇形動畫。

重點摘要

進度以時間驅動,避免受幀率影響的速度變化
邊界建模為 4 條直線與 4 個四分弧以支援圓角與不同半徑
在 drawWithCache 中渲染,使用 native Canvas 處理模糊暈染並將效果封裝為單一 modifier

本文提出在 Jetpack Compose 中為矩形與圓角矩形實作穩健的動態蛇形發光邊框的方法,說明為何單純旋轉在非圓形上會導致速度不均與接縫問題,並列出實作需求:平滑恆定速度、雙層蛇體(模糊暈層與細核心)、無可見接縫、支援各角半徑、狀態持久化、封裝於單一 modifier、以及運行時幾何變更的平滑過渡。實作將周長拆分為八段預先計算長度與起點,將時間進度轉為頭尾距離,再將蛇形片段分配到受影響的段落逐個繪製。模糊暈染需透過原生 Canvas 的 BlurMaskFilter,而內部描邊則重用相同路徑邏輯。文章也警告連續動畫的效能代價,並提到模糊接縫問題將在後續文章中以取樣技巧改進。

06

AI Coding Agents Are Silently Eating Your RAM If You Do Android Development

ProAndroidDev 作者:Grigoriy Shimichev 發布:03-30 15:50

如果你從事 Android 開發,AI 編碼代理正在悄悄吃掉你的記憶體

AI 代理不斷觸發 Gradle 構建,若各專案的 Gradle wrapper 或 JDK 版本不一致,daemon 無法重用,導致閒置的 Gradle 與 Kotlin 進程佔用大量 RAM。

重點摘要

AI 編碼代理會頻繁觸發 Gradle 構建。
不同專案的 Gradle/JDK 版本會阻止 daemon 重用並累積閒置進程。
Java Daemon Watcher 偵測閒置 Gradle/Kotlin daemon 並自動終止。

作者指出,使用 Claude Code、Cursor 等 AI 編碼代理的 Android 開發者,系統可能因代理頻繁觸發 Gradle 構建而逐漸變慢。不同專案的 Gradle wrapper 或 JDK 版本若不一致,daemon 無法重用,Gradle 與 Kotlin 的編譯 daemon 就會累積成為大量閒置的 Java 進程,悄悄吃掉記憶體卻沒有錯誤提示。為了解決這問題,作者開發了 macOS 小工具 Java Daemon Watcher:用 jps 列出 Java 進程、以 allowlist 篩選已知 daemon,採樣 CPU 判斷閒置並在逾時後發出 SIGTERM 結束,且不會觸碰 IDE。該工具可設定掃描間隔與逾時,自稱每週節省約 100GB RAM,程式碼採 MIT 授權並公開於 GitHub。

07

Jetpack Compose Hot Reload on Real Android Devices: Reduce the Build Time to Seconds

ProAndroidDev 作者:Jaewoong Eum 發布:04-04 17:42

在真實 Android 裝置上為 Jetpack Compose 實現熱重載:將建置時間縮短到秒級

Compose HotSwan 可在一到三秒內將修改過的類別替換到 ART 記憶體並觸發局部重組,同時盡可能保留 UI 狀態。

重點摘要

秒級熱重載可覆蓋可組合與非可組合的方法變更
保留 navigation、remember、scroll 與 ViewModel 等狀態
透過 IDE 外掛、Gradle 編譯器外掛與原生 ART agent 配合運作(建議 API 30+)

Compose HotSwan 是供 Android Studio/IntelliJ 的 IDE 外掛與 Gradle 編譯器外掛,能在實體裝置或模擬器上實現 Jetpack Compose 的快速熱重載。它只對變更過的模組做增量編譯,從 DEX 中抽取修改後的類別,將其傳到裝置並以原生 agent 在 ART 記憶體中替換方法體,再觸發受限範圍的重組以保留 slot table 結構與內嵌狀態。HotSwan 支援可組合函式內部變更、新增或重排序可組合元件、非可組合方法(如 ViewModel 與商業邏輯)以及資源值修改;但像新增資源鍵或變更類別結構等會需要完整重建。安裝需三步:安裝 IDE 外掛、加入 Gradle 外掛、同步並執行;提供兩週試用。

08

Android 16’s Edge-to-Edge Mandate: Why Your “Simple Fix” Will Break at Scale

ProAndroidDev 作者:Sarveshwar Maheshwari 發布:04-05 15:10

Android 16 的 Edge-to-Edge 強制令:為何你的「簡單修補」在大規模會失效

只在 onCreate 加上 enableEdgeToEdge()、灑幾個 systemBarsPadding() 並不能解決多模組混合應用的插槽與重疊問題。

重點摘要

針對 SDK 35 的應用須支援 Edge-to-Edge,系統欄不再是可忽略的「緩衝區」。
零散的 padding 修補會造成 double-padding、z-index 衝突和可點擊區域失效。
應建立中央化的 inset 消耗機制(如 CompositionLocal 帳本),由基礎設施統一處理 Insets。

Android 16 對針對 SDK 35 的應用強制啟用 Edge-to-Edge,這對混合 Compose 與舊式 Fragment 的大型專案不是單純的 UI 微調,而是結構性改動。文章指出,僅靠 enableEdgeToEdge() 和少量 Modifier.systemBarsPadding() 會導致 double-padding 與 z-index 碰撞,使 CTA 浮空或被底部手勢區吞掉。作者建議以「Inset Consumption 帳本」為模式,中央化處理已被消耗的 Padding(範例為 ProductionGradeScaffold 與 CompositionLocal 提供),避免在 ViewModel 或各 feature 中硬編 padding,也別再依賴 android:fitsSystemWindows。正確做法是把 Insets 當成平台基礎設施來處理,防止面對新裝置或 cutout 時遍地維護負債。

09

Barcode Reader App using Kotlin Compose

Medium Kotlin 作者:Kabi 發布:04-10 10:01

使用 Kotlin Compose 的條碼讀取器應用程式

在快速演進的 Android 開發領域中,建置一個快速且可靠的條碼掃描器仍然是常見的需求。

重點摘要

以 Kotlin Compose 建構條碼掃描功能
強調掃描的速度與可靠度
討論實作面向與實務建議

本文由 Kabi 撰寫並發表於 Medium,說明如何在現代 Android 開發環境下以 Kotlin Compose 建置條碼讀取器。文章指出在行動應用中快速且可靠的掃描器仍是常見需求,並以 Compose 為 UI 基礎,討論實作時的關鍵考量,包括相機串接、解析流程、效能優化、生命週期與權限處理,以及測試策略等面向。內容針對希望在不犧牲反應速度與準確性的前提下整合掃描功能的開發者提供實務導向的說明與示範。欲取得完整程式碼、步驟與範例,讀者請參閱原文連結。

10

Your App Shouldn’t Freeze When the Internet Does: A Practical Guide to Offline-First Architecture…

Medium Kotlin 作者:Rupam Patil 發布:04-10 10:41

當網路斷線時,應用程式不該當機:離線優先架構實務指南

在交易途中網路中斷時,應用程式仍應保持回應;本文提供建置離線優先系統的實務建議。

重點摘要

保障網路中斷時的使用者體驗不被中斷
採用本地持久化讓操作可繼續進行
重連後同步、調解衝突並恢復狀態

本文主張應用程式在網路不穩或中斷時仍應可用,特別是在結帳等關鍵流程中不可因斷線而當機或遺失操作。文章倡導離線優先的設計思維:將本地儲存、操作佇列化、樂觀更新與背景同步納入系統設計,並在網路回復時進行資料同步與衝突處理。透過把間歇性網路視為常態來設計,能提升應用穩定性與使用者信任,避免介面凍結與資料遺失。

11

Jetpack Compose Navigation 3: Embracing Type-Safety with NavKey

Medium Kotlin 作者:chanzmao 發布:04-10 12:00

Jetpack Compose Navigation 3:以 NavKey 擁抱型別安全

Android 開發格局再次改變。

重點摘要

介紹 Jetpack Compose Navigation 3,強調型別安全
以 NavKey 將路由與參數以型別方式編碼
將此變動視為 Android 開發演進的一環

作者 chanzmao 在此文介紹 Jetpack Compose Navigation 3,並強調透過 NavKey 建立導覽的型別安全性。文章從「Android 開發格局再次改變」的觀點出發,說明將路由與參數以型別化的導覽鍵來處理,可降低執行時錯誤並提高 API 的可驗證性與表意性。文中探討型別化導覽對應用架構與開發者工作流程的可能影響。由於此處僅有標題與短摘錄,具體範例、遷移步驟與程式碼示範仍需參閱完整文章。

12

Stop Losing Your Prompts: Why I Built a Local Vault for AI Interactions

Dev.to Kotlin 作者:Getinfo Toyou 發布:04-10 03:44

別再丟失你的提示詞:我為何打造一個本地 AI 互動保管庫

我開發了 AI Prompt Vault,一款 Android 應用,用來儲存、分類並快速檢索提示詞,避免在聊天紀錄中遺失最有效的提示。

重點摘要

聊天紀錄不適合作為長期提示管理工具
AI Prompt Vault 可儲存、分類、搜尋並一鍵複製提示詞
使用 Kotlin、Jetpack Compose、Room 與 Coroutines,強調離線與簡潔

作者因為常常在聊天紀錄裡找不到經過精煉的提示詞,開發了 AI Prompt Vault:一款以行動為先的 Android 應用,作為本地提示庫,可儲存、分類、即時搜尋並一鍵複製提示。採用 Kotlin、Jetpack Compose、Room、Coroutines 與 Flow 等現代技術,強調離線優先與快速回應。技術挑戰包括為提示與標籤設計高效的多對多資料庫結構,以及在不同廠商 Android 裝置上處理剪貼簿行為並提供一致的回饋。作者學到專注簡潔與解決自身痛點比整合所有 API 更重要,核心價值是速度與組織性,已上架 Google Play。

13

Android Uygulamanızı StrictMode ile Nasıl Daha Akıcı Hale Getirirsiniz?

Medium Kotlin 作者:Bahadireray 發布:04-09 23:19

如何使用 StrictMode 讓你的 Android 應用更順暢?

在開發階段捕捉效能問題最有效的方法:用 StrictMode 將 ANR 與 UI 卡頓徹底找出並解決。

重點摘要

偵測主線程的磁碟、網路與長耗時操作
協助在開發階段避免 ANR 與 UI 卡頓
建議在 debug 構建中整合並優先修復

StrictMode 是 Android 提供的開發工具,用於在開發階段偵測與診斷影響效能的主線程違規行為。啟用後可揭露磁碟或網路 I/O、長時間運算等可能導致 ANR 或 UI 卡頓的操作,讓開發者將重資源工作移到背景執行、改善同步與資源存取策略。建議在 debug 構建中整合並檢視報告,搭配效能工具優先處理問題根本原因,於釋出前修復,能顯著減少凍結並提升使用者感受。

14

Kotlin Flow vs LiveData — Why Google Quietly Moved On

Medium Kotlin 作者:Ravindra Pawar 發布:04-09 23:38

Kotlin Flow vs LiveData — 為何 Google 默默轉向

LiveData 並未損壞,但當應用越大時其限制會顯現,而 Flow 是接下來的選擇。

重點摘要

LiveData 在小型情境仍然適用。
Kotlin Flow 被視為更可擴展的後續方案。
Google 在實務建議上悄悄偏向 Flow。

作者指出 LiveData 本身並非有缺陷,但隨著應用規模與複雜度增加,其侷限會開始顯現;因此 Kotlin Flow 成為自然的後續選擇。文章說明 Google 在實務建議上已悄悄偏向 Flow,但並非公開放棄 LiveData,仍承認其在較小場景下的價值。重點在於面對遷移或新開發時應評估 Flow 是否能提供更具可擴展性的資料流處理,而不是一味否定 LiveData;強調這是務實的演進,建議團隊依需求與維護考量謹慎採用。

15

Advanced Kotlin Part 20: Collections — List, Set, and Map Mastery

Medium Kotlin 作者:Kishor Ramani 發布:04-10 02:48

Advanced Kotlin 第20篇:集合 — 精通 List、Set 與 Map

Kotlin 的集合具備強大與彈性,將探討 List、Set 與 Map 的不可變與可變變體。

重點摘要

Kotlin 的集合強大且彈性高。
聚焦 List、Set 與 Map 三種集合。
涵蓋不可變與可變的變體比較。

本篇為「Advanced Kotlin」系列第20篇,指出 Kotlin 的集合(List、Set、Map)具備強大與彈性,並說明將探討這三種集合型別的不可變與可變變體。文章定位為對集合概念的導讀,強調理解各集合的行為與適用時機(何時偏好不可變、何時需要可變)對撰寫更清晰、安全的 Kotlin 程式碼相當重要。摘錄簡短,並引導讀者前往 Medium 完整閱讀以取得更深入的說明與範例。

16

From Doubt to Demo: A BLE File Transfer PoC for Android and macOS

Medium Kotlin 作者:James Cullimore 發布:04-10 03:21

從懷疑到示範:針對 Android 與 macOS 的 BLE 檔案傳輸 PoC

這個專案庫存在是因為我需要一個用於工作的概念驗證。

重點摘要

BLE 檔案傳輸的概念驗證實作
適用於 Android 與 macOS 平台
為工作需求而建立的示範型程式庫

James Cullimore 建立了一個簡短的示範型程式庫,用以展示在 Android 與 macOS 之間以 Bluetooth Low Energy (BLE) 進行檔案傳輸的可行性。該 repo 因工作需求而產生,提供實作範例與示範,適合需要實務參考而非生產級套件的開發者。文章在 Level Up 上簡介此專案並提供連結,讀者可在原文取得程式碼、設定步驟與示範素材,作為評估 BLE 能力或開發跨平台傳輸功能的起點。示範以可複製與說明性為主,而非完整優化或功能完備。

17

The Rise of Kotlin Beyond Mobile: Powering Car Stereos & Embedded Systems

Medium Kotlin 作者:Geeky Vartika 發布:04-10 03:59

Kotlin 崛起:超越行動裝置,驅動車用音響與嵌入式系統

Kotlin 正從 Android 擴展到車載音響與其他嵌入式系統,靠語法簡潔、null 安全與多平臺能力吸引開發者。

重點摘要

從行動開發延伸到車載與嵌入式領域
具語法簡潔與 null 安全等開發優勢
多平臺與與既有程式碼互通便於整合

Kotlin 長期與 Android 開發緊密連結,如今正逐步跨出手機領域,應用於車用音響與其他嵌入式裝置。由於 Google 支持、語法簡潔與 null 安全等特性,加上日益成熟的工具鏈與生態,Kotlin 在開發效率、可讀性與降低執行期錯誤方面具有吸引力。此外,其多平臺能力與與 Java、原生程式碼的互通性,讓整合既有系統更容易。在需高度維護性與安全性的嵌入式場景,Kotlin 提供了一個可行且具生產力的替代方案,雖然並非要全面取代針對極端效能或最小記憶體足跡的專用語言。

18

build_runner คือทางออก แต่ทำไมมันถึงเจ็บปวดขนาดนี้?

Medium Kotlin 作者:Paradorn Rak 發布:04-10 04:27

build_runner 是解方,但為什麼會這麼痛?

對 Flutter 與 Dart 開發者來說,build_runner 被視為產生程式碼的首選工具,但實際使用卻常令人感到痛苦。

重點摘要

build_runner 被視為 Flutter/Dart 的程式碼生成解法
採用或使用過程中常伴隨令人不適的經驗
作者從個人觀點探討導致挫折的原因

本文由 Paradorn Rak 在 Medium 發表,討論一個看似矛盾的現象:build_runner 雖然被推薦為 Flutter 與 Dart 的程式碼生成解決方案,卻在實際使用上讓許多開發者感到痛苦。作者提出疑問:為何一個旨在簡化開發流程的工具,反而成為負擔?文章從作者的實際經驗出發,說明這種痛苦的來源與其帶來的現實影響,並協助讀者理解在專案中採用 build_runner 時應有的心理預期與取捨,而非僅以理想化的宣傳來判斷其適用性。

19

Your Android App Is Untestable and Unmaintainable, Here’s the Modern Gold Standard to Fix It

Medium Kotlin 作者:Zentechpoint 發布:04-10 05:44

你的 Android 應用無法測試且難以維護:這是修復的現代化黃金標準

如果這個答案讓你感到尷尬或不安,這篇文章適合你。

重點摘要

指出 Android 應用難以測試與維護的問題
提出現代化的「黃金標準」修復方法
提供可執行的步驟以降低技術負債並恢復可測試性

本文點出許多 Android 應用變得難以測試與維護的問題,並針對那些看到結果會尷尬的開發者提出現代化的「黃金標準」修復方法。文章強調從架構與測試實務著手,提供可採行的步驟以降低技術負債、恢復自動化測試的可行性,並讓未來變更更安全、更快速。它以務實取向引導工程團隊調整設計與流程,重建可測試性與可維護性,避免短期解法導致長期惡化,協助團隊提升產品品質與開發效率。

20

Setting up your first Compose Project

Medium Kotlin 作者:Aayush Puranik 發布:04-10 06:40

設定你的第一個 Compose 專案

本文示範如何設定並印出「Hello World」,並透過建立一個小專案來理解其他範例與概念。

重點摘要

說明如何建立第一個 Compose 專案
示範印出「Hello World」範例
以小專案與其他範例加深理解

本文說明如何建立第一個 Compose 專案,示範印出「Hello World」,並透過其他範例與一個小專案來加深理解。作者描述專案的基本設定流程、展示簡單輸出,並以逐步範例說明核心概念。文章重點在於實作與實際操作,鼓勵讀者一邊跟著建立專案一邊理解 Compose 的構成與運作,使初學者能透過練習快速上手並看到元件在專案中如何協同工作。