Daily Digest

每日新聞摘要

2026年05月12日

今日總結

內容會跟隨語言切換。

📝 今日焦點:Android 端生成式 AI 需同時控管延遲、散熱與記憶體,Kotlin 實作應追蹤 TTFT、TPS、RSS 並避免主執行緒阻塞。 ✅ 測試與品質:測試覆蓋率不等於品質,應優先設計能抓出缺陷的驗證,讓指標反映真實風險。 🏗 架構設計:Compose State、MVVM 與 state hoisting 可提升元件可重用性;DI、CMP 遷移、JNI/Rust、Typed ID 與清理時的 NonCancellable 也都在強化架構可控性。 🚀 語言演進:KMP 2026 的價值仍在被討論,Compose Flexbox 持續補齊 UI 能力,Java 25 KDF 與虛擬執行緒 pinning 改善則推進 JVM 生態。

01

Beyond the Prompt: Mastering On-Device GenAI Performance and Thermal Management on Android

Dev.to Kotlin 作者:Programming Central 發布:05-12 10:00

超越提示詞:掌握 Android 裝置端 GenAI 效能與散熱管理

裝置端生成式 AI 終於成真,但要讓它又快又不過熱,仍需要縝密的工程設計。

重點摘要

裝置端 GenAI 可降低雲端延遲、成本與隱私風險。
Android 面臨效能悖論:高吞吐與散熱限制同時存在。
TTFT、TPS 與峰值記憶體是核心指標,並可用散熱感知調度來調整推理。

本文說明在 Android 裝置上直接執行生成式 AI 的工程挑戰。作者以 Gemini Nano 與 AICore 為例,指出裝置端推理雖能避免雲端延遲、伺服器成本與資料外傳的隱私疑慮,卻也會帶來發熱、降頻與記憶體壓力。文中將此概括為效能悖論:行動裝置必須在被動散熱與電池限制下,維持足夠流暢的 AI 體驗。為此,建議追蹤 TTFT、TPS 與峰值 RSS,並以 Kotlin 建立散熱感知調度機制,同時避免暖機效應、主執行緒阻塞與 callback 記憶體洩漏等常見錯誤。

02

Understanding State in Jetpack Compose (Simple Guide for Beginners)

Dev.to Kotlin 作者:MD IBRAHIM KHALIL 發布:05-12 13:11

理解 Jetpack Compose 的 State:給初學者的簡明指南

State 改變,UI 就會更新

重點摘要

State 就像電燈開關,狀態一變,介面就會自動重繪。
remember 與 mutableStateOf 分別用來保留與觀察狀態。
避免在 Composable 裡做耗時工作,建議搭配 ViewModel 與 Coroutines。

這篇文章用簡單方式說明 Jetpack Compose 中最重要的概念之一:State。作者把 State 比喻成電燈開關,當狀態改變時,UI 也會自動更新,並以計數器範例示範 remember 與 mutableStateOf 的作用。文中也提醒初學者常見錯誤,例如未使用 remember,或直接在 Composable 內執行網路等耗時操作,容易造成重組與卡頓。最後建議採用簡單的 MVVM 架構,讓 UI 顯示狀態、ViewModel 持有狀態、Repository 負責資料來源,並透過 state hoisting 讓元件更乾淨、可重用。

03

Dependency Injection in Android — Manual DI vs Dagger 2 vs Hilt vs Koin

Medium Kotlin 作者:Yodgorbek Komilov 發布:05-12 07:19

Android 的依賴注入:手動 DI、Dagger 2、Hilt 與 Koin 比較

請繼續在 Medium 閱讀 »

重點摘要

比較手動依賴注入與 Dagger 2、Hilt、Koin。
聚焦 Android 開發中的依賴注入作法。
完整內容需前往 Medium 繼續閱讀。

本文以 Android 的依賴注入為主題,標題點出將比較手動 DI、Dagger 2、Hilt 與 Koin 等常見方案。根據目前提供的內容,文章本身沒有展開完整技術細節,但可看出其目的在於整理這些做法在 Android 架構中的差異與取捨。若要了解完整論述與比較,需前往 Medium 繼續閱讀原文。

04

Is Kotlin Multiplatform(KMP) Still Worth learning in 2026?

Medium Kotlin 作者:Shahrukh Ahmed 發布:05-12 08:13

Kotlin Multiplatform(KMP)到 2026 年還值得學嗎?

過去幾年,每一場行動開發的討論,似乎最後都會回到同一個問題。

重點摘要

文章把 KMP 放在行動開發爭論的核心位置。
它提出 2026 年是否仍值得學習 KMP 的疑問。
目前提供的內容只有開場,未包含完整論證。

文章一開始指出,近年來行動開發的討論總會回到同一個問題:Kotlin Multiplatform 到 2026 年是否還值得學習。不過,所提供的內文只有這一句引言,沒有出現作者後續的分析、結論或例證。就現有內容來看,這篇文章是在提出一個關於 KMP 相關性的討論框架,而非完整評估。

05

How I switched from CocoaPods to Swift Package Manager in my CMP project

Medium Kotlin 作者:Paolo Montalto 發布:05-12 10:45

我如何在 CMP 專案中從 CocoaPods 轉換到 Swift Package Manager

由於 CocoaPods 預計很快會被淘汰,且在年底前將成為唯讀,我開始嘗試把部分 Compose Multiplatform 工作遷移過去。

重點摘要

CocoaPods 預計即將退場,並在年底前轉為唯讀。
作者嘗試將部分 CMP 專案改用 Swift Package Manager。
本文僅為 Medium 上的簡短遷移前言。

這篇文章說明作者嘗試把 Compose Multiplatform(CMP)專案中的部分內容,從 CocoaPods 轉移到 Swift Package Manager。主要動機是 CocoaPods 已宣布走向淘汰,且預計在年底前變成唯讀。由於原文只提供簡短開場並引導讀者到 Medium 繼續閱讀,因此內容重點在於表達這次遷移嘗試,而非完整的技術步驟或最終成果。

06

AnimatedColumn: Predictable List Animations in Jetpack Compose Without LazyColumn

Medium Kotlin 作者:Max Grishin 發布:05-12 13:01

AnimatedColumn:在不使用 LazyColumn 的情況下,於 Jetpack Compose 中實現可預測的列表動畫

想像一個 Jetpack Compose 的動態清單:元素數量不多,但更新非常密集,例如來自後端的 SSE。

重點摘要

動態清單在頻繁更新時,動畫效果往往不易預測。
文章提出 AnimatedColumn,作為這類情境下的 LazyColumn 替代方案。
重點在於元素數量較少時,仍能維持平滑且穩定的列表動畫。

本文介紹 AnimatedColumn,說明它如何在不依賴 LazyColumn 的情況下,為 Jetpack Compose 中的小型動態清單提供可預測的動畫效果。作者指出,當清單更新非常密集,例如透過後端 SSE 持續推送資料時,列表動畫容易變得難以控制。AnimatedColumn 以較簡潔的欄位式做法,協助在元素數量不多的場景中維持平滑且穩定的動畫表現。

07

Testing Architecture: Writing Tests That Actually Catch Bugs (Not Just Lines)

Medium Kotlin 作者:Prosper Kalu 發布:05-12 13:20

測試架構:撰寫真正能抓出 Bug 的測試,而不只是覆蓋行數

大多數 Android 團隊都在優化覆蓋率報表;你真正該優化的,其實不是這個。

重點摘要

重點應放在抓出真實 bug,而非堆高覆蓋率。
單看覆蓋率報表,容易產生品質良好的錯覺。
測試架構應以有效偵測缺陷為核心。

這篇文章指出,許多 Android 團隊過度追求測試覆蓋率報表,卻忽略了測試是否真的能找出缺陷。作者強調,覆蓋了多少程式碼,並不等於系統品質有多高;真正該優化的,是能夠抓到 bug 的測試,而不是只讓數字看起來更漂亮。文章核心在於:測試架構應以實際缺陷偵測與有意義的驗證為優先,而非表面指標。

08

Anthropic Agent Skills Support in Spring AI

Baeldung 作者:Manfred Ng 發布:05-11 23:14

Spring AI 中的 Anthropic Agent Skills 支援

Spring AI 讓 Anthropic 預建的 agent skills 能輕鬆整合進 Java 應用程式。

重點摘要

Anthropic skills 可直接產生 DOCX、PDF、PPTX、XLSX 文件。
Spring AI 透過 Anthropic chat options 與 API 支援整合這些能力。
範例應用以銷售資料產生報表,並依 MIME type 回傳檔案。

本文介紹 Anthropic 預建的 agent skills 如何與 Spring AI 搭配,讓模型不只是輸出文字,還能直接產生文件。作者先示範加入 Anthropic starter 依賴並設定 API key,再建立一個銷售報表範例,使用硬編碼的每月銷售資料作為輸入。服務端會把使用者 prompt 與 DOCX、PDF、PPTX、XLSX 等 skills 一起送給 Anthropic chat model,之後從回應中取出 file ID、下載生成檔案,並連同 MIME type 與檔名回傳給客戶端。文章也說明可用 prompt 控制輸出格式,例如產生 PDF 報表或 Excel 試算表。

09

Key Derivation Function API in Java 25

Baeldung 作者:Bhaskar Ghosh 發布:05-11 23:20

Java 25 的金鑰衍生函式 API

Java 25 以一個乾淨且可擴充的模型,透過成熟演算法從初始金鑰材料衍生加密金鑰。

重點摘要

Java 25 在 javax.crypto 中新增標準 KDF API
支援 HKDF-SHA256、HKDF-SHA384、HKDF-SHA512
比手動以 Mac 實作 HKDF 更簡潔且不易出錯

Java 25 新增金鑰衍生函式(KDF)API,並在 JDK 24 首次預覽後正式推出。文章說明 KDF 為何重要:可用於 TLS 握手後衍生會談金鑰、密碼式加密,以及將單一主金鑰分化為多個用途專用子金鑰。新 API 位於 javax.crypto,延續 JCA 的工廠方法風格,提供 deriveKey() 與 deriveData() 兩種主要用法,並以 HKDFParameterSpec 描述 Extract、Expand 與組合流程。相較於過去手動撰寫 Mac 程式碼,新 API 更簡潔、可驗證、可替換供應商實作,也更利於維護與稽核。

10

Synchronize Virtual Thread Without Pinning

Baeldung 作者:Saikat Chakraborty 發布:05-11 23:46

在不發生 Pinning 的情況下同步虛擬執行緒

雖然 JVM 會嘗試透過暫時提高虛擬執行緒排程器的平行度來補償 pinning,但預設上限為 256。

重點摘要

synchronized、native 呼叫、類別初始化與類別載入都可能讓虛擬執行緒 pinning。
可用 JFR 的 jdk.VirtualThreadPinned 事件或 -Djdk.tracePinnedThreads=full 偵測。
改用 ReentrantLock 可避免 pinning,而 JDK 24 也修正了 synchronized 相關問題。

本文說明虛擬執行緒雖能提升 I/O 密集工作負載的擴充性,但在某些情況下仍會發生 pinning,導致 carrier thread 被阻塞。作者以購物車更新範例示範 synchronized 區塊如何造成問題,並介紹透過 JFR 的 jdk.VirtualThreadPinned 事件與 -Djdk.tracePinnedThreads=full 來確認 pinning。文章也列出 native method、static initializer 與 custom class loader 等其他來源,建議使用 ReentrantLock 或 ReadWriteLock 等 Loom 相容鎖來避免不必要的 pinning;同時指出 JDK 24/JEP 491 已解決 synchronized 方法與區塊的 pinning。最後的 JMH 基準測試顯示新版 JDK 的吞吐量與延遲皆明顯改善。

11

How to Create Shortcut Snippets in Visual Studio Code?

Baeldung 作者:Daniel Fintinariu 發布:05-12 00:13

如何在 Visual Studio Code 中建立快捷片段

自訂片段能將簡短觸發字串展開成完整程式碼範本,減少重複輸入並提升一致性。

重點摘要

片段以 prefix、body、description 三個欄位定義。
可使用標記、選項、變數與正規表示式轉換增強功能。
片段也能透過自訂鍵盤快捷鍵快速插入。

本文說明如何在 Visual Studio Code 中建立並使用使用者自訂片段,以減少重複撰寫程式碼的時間。內容先介紹片段的基本結構:prefix、body 與 description,並示範如何開啟片段設定介面、選擇適用範圍。接著以插入區塊標題、建立 sysout 簡寫、限定 Java/Kotlin 範圍等例子,展示實作方式。文章也進一步介紹選項、變數、以正規表示式進行的占位符轉換,以及如何指定鍵盤快捷鍵來觸發片段。整體來說,片段能幫助開發者減少重複輸入、維持程式碼一致並提升工作效率。

12

Convert Between ByteBuffer and Byte Array in Java

Baeldung 作者:Abderrahim Azhrioun 發布:05-12 03:09

在 Java 中互轉 ByteBuffer 與位元組陣列

理解這兩種格式之間的轉換,對於檔案 I/O 與網路通訊等工作都很重要。

重點摘要

ByteBuffer.array() 只適用於可存取 backing array 的緩衝區。
ByteBuffer.get() 可將資料複製到新的 byte[],更具獨立性。
從 byte[] 建立 ByteBuffer 可用 wrap(),或 allocate() 搭配 put()。

本文說明如何在 Java 中於 ByteBuffer 與位元組陣列之間互轉,這在檔案 I/O 與網路通訊中很常見。先介紹 ByteBuffer.array(),它能直接取得背後的陣列,但前提是緩衝區必須有可存取的 backing array,且不能是唯讀。若需要更安全、彼此獨立的複本,可用 ByteBuffer.get() 將資料複製到新的陣列,也能指定 offset 與長度部分讀取。反向轉換則可用 ByteBuffer.wrap() 直接包裝原陣列,或以 allocate() 配合 put() 建立新緩衝區,並在讀取前呼叫 flip()。

13

Never pass the wrong ID again, typed IDs in Kotlin

Medium Kotlin 作者:Giulio Pimenoff Verdolin 發布:05-12 00:30

別再傳錯 ID:Kotlin 中的型別化 ID

你是否曾在除錯時,查詢資料庫或快取,卻發現自己傳進去的是錯的 ID?

重點摘要

型別化 ID 可降低 ID 混用的風險。
能讓資料庫與快取查詢更安全。
以 Kotlin 實作更強的型別安全。

本文指出,開發者在除錯功能、查詢資料庫或快取時,常會不小心傳錯 ID。作者以 Kotlin 的型別化 ID 作法,讓識別碼具備更明確的型別,減少不同 ID 彼此混淆的機會,進而提升型別安全。這種方式的目標,是讓相關錯誤更早在開發階段被發現,而不是到執行或除錯時才暴露。

14

Kotlin Coroutines: NonCancellable vs. GlobalScope Explained

Medium Kotlin 作者:Android Expert 發布:05-12 04:01

Kotlin 協程:NonCancellable 與 GlobalScope 解析

掌握結構化並行:了解何時使用清理保護機制,以及為何要避免脫離管理的根協程。

重點摘要

NonCancellable 可用於必須完成的清理工作。
避免使用 GlobalScope 建立脫離管理的根協程。
結構化並行有助於可預測地管理協程生命週期。

本文以結構化並行為核心,說明 Kotlin 協程中 NonCancellable 與 GlobalScope 的差異。NonCancellable 適合作為清理時的保護機制,讓必要的收尾工作在取消後仍能安全完成;相對地,GlobalScope 會建立脫離管理的根協程,通常不建議使用。文章強調,開發上應優先依循結構化並行,讓協程生命週期更可控,並只在明確需要的清理情境下使用特殊工具。

15

Android Jetpack Compose Flexbox

Medium Kotlin 作者:Riyas Pullur 發布:05-12 04:31

Android Jetpack Compose Flexbox

隨著 Jetpack Compose 的推出,Android UI 開發已經有了顯著演進。

重點摘要

Jetpack Compose 改變了 Android UI 開發方式。
文章對比了 Compose 與傳統 XML 版面配置。
目前提供的內容只是 Medium 的簡短摘要,並非全文。

這篇文章是 Riyas Pullur 所寫〈Android Jetpack Compose Flexbox〉的 Medium 簡短摘要。內文指出,隨著 Jetpack Compose 的推出,Android UI 開發已經有了顯著演進,並提到傳統 XML 版面配置過去很依賴較舊的布局方式。不過目前提供的文字只有導讀片段,沒有完整文章內容,因此只能根據現有摘錄整理主題與脈絡。

16

Rust in Android Development: Complete Guide

Medium Kotlin 作者:Chayan Mistry 發布:05-12 06:51

Rust 在 Android 開發中的完整指南

透過 JNI(Java Native Interface)將 Rust 整合進 Android 開發的逐步指南。

重點摘要

說明如何將 Rust 整合到 Android 開發中
以 JNI(Java Native Interface)作為連接方式
內容採逐步教學形式

本文介紹如何透過 JNI(Java Native Interface)將 Rust 整合進 Android 開發,並以逐步方式帶領讀者完成整合流程。根據目前提供的內容,文章重點在於協助開發者以實作導向的方法,將 Rust 與 Android 連結起來。該文被定位為完整指南,但摘錄內容未提供更多技術細節,僅可確認其為 Medium 上的延伸文章。