Daily Digest

每日新聞摘要

2026年02月26日

今日總結

內容會跟隨語言切換。

📝 今日焦點 針對 Windows 使用者的 VS Code/Codium Kotlin 開發快速上手指南,說明 JDK、Gradle、kotlin-lsp 與專案初始化流程,降低本地開發門檻並確保 LSP 正常運作,利於快速啟動與編輯體驗。 🔧 效能最佳化 深入討論 OpenJDK 26 的新 API 與 GC 在 CPU/記憶體上的交互,並以 flamegraph 與 Project Leyden 類快取揭露啟動瓶頸;Spring MVC 基準顯示只需小幅調整(唯讀交易標註、HTTP header 優化、虛擬執行緒)即可在小資料集下提升約 20% 吞吐,提供生產調校與短期效益路徑。 🏗 架構設計 提供一套務實的 Android + KMP Clean Architecture 範本,示範分層與職責劃分以降低套用障礙;並警示工具綁定與過度抽象的隱性成本,建議以模組化、可替換的設計與小而穩定的介面來保護未來維護性與遷移彈性。 ✅ 測試與品質 指出 ExoPlayer 單元測試的實務痛點並導向詳細教學以取得可重現的解法;提醒 Jetpack Compose 常見反模式多在後期才被修正,主張透過早期學習、良好程式碼審查與慣用寫法以減少技術債並提升產線穩定性。 🚀 語言演進 KSP 正取代 KAPT 成為 Kotlin 原生的註解處理器,能顯著改善建置效能並降低相容性負擔,值得在 Android 專案中規劃遷移;同時提醒掌握 Kotlin 智能轉型的「穩定性」規則與 rememberSerializable/rememberSaveable 在 Compose 中的差異,能讓程式更安全且在狀態恢復時行為可預期。

01

Programming with Kotlin on Visual Studio Code or Codium

Dev.to Kotlin 作者:Raphaël T 發布:02-26 14:48

在 Visual Studio Code 或 Codium 上使用 Kotlin 開發

在 Windows 上安裝 JDK 與 Gradle,確保 JAVA_HOME 一致,將 kotlin-lsp 加到 VS Code/Codium,然後初始化並以 Gradle 建置執行 Kotlin 專案。

重點摘要

安裝 Temurin JDK(Adoptium)或以 winget 安裝
安裝 Gradle 並加入系統 PATH,或以 Scoop 安裝
將 kotlin-lsp 加入編輯器,設定 JAVA_HOME,使用 gradle 初始化與執行

此指南針對 Windows 使用者,說明在 Visual Studio Code 或 Codium 上設定 Kotlin 開發環境。步驟包括安裝 Temurin JDK(手動或以 winget)、安裝 Gradle 並將其加入系統 PATH(或使用 Scoop 並依指令安裝);以 java --version 與 gradle -version 檢查並確保兩者使用相同的 JAVA_HOME。接著從 GitHub 下載 kotlin-lsp,將其拖入編輯器的擴充套件面板,於 Kotlin by JetBrains 擴充套件設定中指定 JDK 的 JAVA_HOME。最後以 gradle init --type kotlin-application 初始化專案,待 LSP 載入後以 gradle、gradle build 與 gradle run 建置並執行應用程式。

02

ExoPlayer Isn’t Easy to Unit Test — Here’s How I Did It ✅

Medium Kotlin 作者:RAFA 發布:02-26 09:20

ExoPlayer 不容易做單元測試 — 我是這樣做的

如果你曾嘗試為 ExoPlayer 撰寫單元測試,可能會遇到類似問題 — 這篇文章說明作者是如何處理的。

重點摘要

ExoPlayer 單元測試不易
作者 RAFA 分享個人測試做法
完整教學請見 Stackademic 原文

RAFA 在此簡短篇章指出一個常見問題:要為 ExoPlayer 撰寫單元測試並不容易。文章節錄承認許多開發者在測試 ExoPlayer 時會碰到障礙,並表示作者有一套實作經驗可供參考。節錄本身未詳述技術細節,而是引導讀者前往 Stackademic 的完整文章查看完整說明。完整內容會呈現作者親身遇到的問題、如何處理或繞過這些問題的說法,適合曾為 ExoPlayer 測試苦惱的開發者閱讀,並可從中取得步驟與經驗分享的完整教學。

03

Java Weekly, Issue 635

Baeldung 作者:baeldung 發布:02-26 07:58

Java Weekly, 第 635 期

深入探討 GC 的 CPU 與記憶體關係,並介紹針對 OpenJDK 26 的新 Java API,協助生產環境調整堆大小與收集器選擇。

重點摘要

剖析 GC 的 CPU–記憶體關聯與 OpenJDK 26 新 API
Project Leyden 的類快取與 flamegraph 揭露啟動瓶頸
Spring MVC 基準:只讀交易、HTTP 標頭與虛擬執行緒可提升小資料集約 20% 吞吐

本期涵蓋垃圾回收(GC)CPU 與記憶體關係的深度分析,介紹針對 OpenJDK 26 的新 Java API,以協助團隊在生產環境調整堆大小與選擇收集器;檢視 Project Leyden 的類快取如何透過 flamegraph 揭露先前未見的啟動效能瓶頸;並以 Spring MVC 基準展示,透過只讀交易註解、Spring Framework 7.0.x 的 HTTP 標頭優化與虛擬執行緒,對小型資料集可達到約 20% 的吞吐提升。期中亦彙整多篇延伸閱讀、線上演講與近期釋出(如 Spring Boot 4.1.0‑M2、IntelliJ 2025.3.3、Quarkus、Micronaut、Hibernate Search 等),技術與思考題材包含對 AI 編碼助理的「Knowledge Priming」建議,本週精選為新上線的 SOLID 課程。

04

rememberSerializable vs rememberSaveable

Medium Kotlin 作者:Ahmed Ally 發布:02-26 09:49

rememberSerializable 與 rememberSaveable

理解 Jetpack Compose 中的真正差異

重點摘要

比較 rememberSerializable 與 rememberSaveable 在 Jetpack Compose 的差別
著重釐清兩者之間的實際差異
作者為 Ahmed Ally,原文刊載於 Medium

本文為 Ahmed Ally 在 Medium 上的短文,目的是釐清在 Jetpack Compose 中 rememberSerializable 與 rememberSaveable 兩者的真正差異。文章並非僅停留在名稱比較,而是說明為何需要分辨這兩種記憶與保存狀態的方式,協助已熟悉 Compose 的開發者在處理需要保留或還原的可組件狀態時做出適切選擇。內容強調理解兩者在行為與持久性上的細微不同,並提供實務導向的說明,幫助讀者在面對配置變更或程序重建時決定採用哪種機制。

05

Clean Architecture on Android and KMP: A pragmatic template

Medium Kotlin 作者:Marco Salis 發布:02-26 11:56

在 Android 與 KMP 上的 Clean Architecture:實用範本

我的範本專案目的是用一個具體且最新的範例,展示實用的 Clean Architecture 實作方式。

重點摘要

提供針對 Android 與 Kotlin Multiplatform 的實用範本
以具體且最新的專案範例說明實作方式
作為可直接參考與調整的實務起點

本文介紹一個範本專案,示範如何以務實方式在 Android 與 Kotlin Multiplatform (KMP) 上實作 Clean Architecture。範本不僅停留於理論,提供一個具體且更新的專案範例,說明如何在真實應用中劃分層級、界面與職責,讓開發者可以檢視並直接應用於自家專案。目標是降低將 Clean Architecture 套用到行動開發的門檻,提供一個清晰且可維護的基礎結構,便於後續測試與擴充。

06

How One Wrong Tooling Decision Haunted an Android Team for Four Years

Medium Kotlin 作者:Sixtin - Android Developer 發布:02-26 12:38

一個錯誤的工具決定如何糾纏一個 Android 團隊四年

工具綁定的隱性成本,以及如何做出未來不會後悔的架構決策。

重點摘要

工具綁定會帶來長期維護與遷移成本。
早期的架構與工具選擇決定未來的彈性。
在投入前評估長期取捨並設計可替換性。

文章以一個實例說明:對開發工具的一次錯誤選擇,讓一個 Android 團隊在接下來的四年承受限制與負擔。作者指出工具綁定的隱性成本,例如彈性下降、技術負債累積與昂貴的遷移代價,並強調架構決策應替未來維護者著想。建議不要只為了短期交付優化,而應評估長期影響、採取模組化設計以便替換、完整記錄假設並規劃遷移策略,以降低未來後悔與避免不必要的額外工作。

07

Anti Patterns In Compose That Everybody Understands Too Late

Medium Kotlin 作者:Sixtin - Android Developer 發布:02-26 12:39

Compose 常見反模式:大家通常發現得太晚

寫錯 Jetpack Compose,這些是資深 Android 開發者在上線前會悄悄修正的問題。

重點摘要

開發中常會導入重複出現的 Compose 反模式
資深工程師常在發佈前或檢視時悄悄修正這些問題
及早識別反模式可避免延後重構與累積錯誤

本文指出許多開發者在使用 Jetpack Compose 時會產生常見的反模式,而這些問題往往是在出問題之後才被發現。資深 Android 工程師通常會在程式碼審查或上線前隱性地修正這些缺陷,以維持產線的穩定與可維護性。作者藉此提醒開發團隊與較資淺的工程師,提早學習正確做法能減少技術債、降低臨時修補的次數,並透過主動改進、良好審查流程與採用慣用的 Compose 寫法來提升長期程式碼品質與團隊協作效率。

08

When Kotlin Abstractions Stop Being Helpful

Medium Kotlin 作者:AndroidLab by Andre 發布:02-26 12:42

當 Kotlin 抽象不再有幫助

過度工程化的 Kotlin 抽象會為 Android 程式碼庫帶來隱性成本。

重點摘要

過多抽象提高複雜度與認知負擔
過早或不必要的抽象影響可讀性與除錯測試
以簡單明確為優先,當真有重複或痛點再抽象

文章指出在 Android 專案中濫用或過度提前建立 Kotlin 抽象所產生的隱性成本。雖然抽象能減少重複並表達意圖,但過度抽象會讓程式行為模糊、除錯與測試更困難、維護負擔增加,團隊可能花更多時間理解間接層而非解決產品問題。建議採取務實策略:優先使用簡單、明確的實作;觀察與衡量是否真有重複或痛點後再進行抽取;若要抽象則設計小而穩定的介面,並保持最小必要性與清晰文件。總之,把抽象當成工具而非預設,當利大於弊時再刻意重構。

09

Kotlin, KSP, KAPT, and the Annotation Processing Mess: What Every Android Developer Needs to Know

Medium Kotlin 作者:AndroidLab by Andre 發布:02-26 12:43

Kotlin、KSP、KAPT 與註解處理混亂:每位 Android 開發者該知道的事

KAPT 正逐漸被取代,KSP 是未來;本文說明如何遷移以及為何這對建置時間很重要。

重點摘要

KAPT 正被 KSP 取代
KSP 為 Kotlin 原生的註解處理 API,可降低效能與相容性開銷
遷移到 KSP 可改善建置時間,需要更新相依與處理器

文章指出 KAPT 正逐漸被取代,KSP 是為 Kotlin 設計的原生註解處理器 API,可避免 KAPT 帶來的效能與相容性開銷,進而影響 Android 專案的建置時間。作者說明為何開發者應考慮遷移:KSP 可減少註解處理負擔並改善增量建置效能;並概述實務面向,包括更新相依項目、調整或重寫處理器,以及需注意的相容性議題。整體目的是提供必要的遷移資訊與動機,協助團隊規劃並從 KAPT 轉向 KSP,以換取更快且更乾淨的處理流程。

10

The Invisible Performance Auditor: Why These 15 Lines Belong in Every Android App ️‍♂️

Medium Kotlin 作者:Sivavishnu 發布:02-26 13:13

隱形效能稽核器:為何這 15 行程式碼該出現在每個 Android 應用

將 StrictMode 當作即時守護,維護 120Hz 流暢度與記憶體健康。

重點摘要

在每個應用加入精簡的 15 行 StrictMode 設定
把 StrictMode 當作即時守護以維持 120Hz 流暢
及早揭露記憶體與主線程問題以便快速修正

本文建議在每個 Android 應用內加入一段精簡的 StrictMode 設定(約 15 行),把它當作「隱形效能稽核器」。作者說明如何把 StrictMode 作為即時守護,監測會影響 120Hz 高更新率流暢度的問題與記憶體健康,例如長時間主線程工作、阻塞 I/O 或記憶體震盪,讓開發者能即刻發現並修正導致掉幀或卡頓的程式碼。文章強調這種小巧的監控配置能在開發周期中持續防護效能回歸,方便團隊維持高更新率裝置上的流暢體驗。

11

⚡ Kotlin Smart Casts: The Ultimate Guide to Type Safety & The Stability Principle

Medium Kotlin 作者:Sivavishnu 發布:02-26 13:56

Kotlin 智能轉型指南:型別安全與「穩定性」原則

了解為何型別檢查會失敗,以及編譯器隱藏的「穩定性」規則,讓你的 Kotlin 程式更簡潔且更安全。

重點摘要

智能轉型依賴編譯器對表達式是否穩定的判斷。
當值可變或有自訂 getter 等不穩定情況時,型別檢查可能失敗。
掌握穩定性規則可避免意外的轉型失敗,提升程式可讀性與安全性。

本文說明為何 Kotlin 的智能轉型有時會失敗,以及編譯器所採用的隱藏「穩定性」規則如何決定某個值是否能安全地視為更具體的型別。失敗的轉型通常不是語言錯誤,而是編譯器阻止對可能變動的值做出不安全的假設,例如可變變數或具有複雜 getter 的屬性。理解哪些表達式被視為穩定,能幫助你調整檢查與宣告方式——偏好不可變參考與可預期的取值方式——使智能轉型順利通過並維持型別安全。掌握這些規則可以讓 Kotlin 程式更乾淨可靠,不必依賴臨時解法。

12

Understanding CPU-Heavy vs IO-Heavy Operations: A Practical Guide to Kotlin Coroutines

Medium Kotlin 作者:Achmad Yusuf 發布:02-26 14:50

理解 CPU 密集型與 IO 密集型作業:Kotlin 協程實務指南

為何你的 API 很慢(以及協程如何修復)

重點摘要

說明 CPU-bound(CPU 密集)與 I/O-bound(IO 密集)的差異
建議為不同工作負載選擇適當的 Coroutine Dispatcher
強調協程與結構化並發可提升 API 吞吐與回應性

Achmad Yusuf 的文章以實務角度說明 CPU 密集(CPU-bound)與 IO 密集(I/O-bound)作業的差異,並示範如何用 Kotlin 協程改善 API 效能。文章指出 CPU 密集型工作耗費處理器週期,適合透過平行與正確的 Dispatcher(如 Dispatchers.Default)處理;IO 密集型工作則常等待外部資源,應該用適合的 IO Dispatcher(如 Dispatchers.IO)以免阻塞執行緒。協程提供輕量級的並發模型,搭配適當的 Dispatcher 和結構化並發,可提高吞吐量與回應性。文中也強調避免在主要或共享執行緒上執行阻塞呼叫,並以範例示範如何切換 Dispatcher 與診斷瓶頸,幫助開發者具體改善延遲與擴充性。

13

15 Things To Do Before, During, and After KotlinConf’26

Kotlin Blog 作者:Kodee 發布:02-26 12:40

參加 KotlinConf’26 前、中、後要做的 15 件事

KotlinConf 不只是看演講—提早規劃才能充分享受學習、人脈與活動體驗。

重點摘要

會前提前報到可免排長隊,節省體力投入議程
從 5 月 20 日的實作工作坊與主題演講獲得實用技能與大方向
在展區、派對與遊戲中建立人脈,會後在 app 評分與回饋

本文整理參加 KotlinConf’26 前、中、後應做的15件事,涵蓋會前逛慕尼黑、提前報到避免排隊、5月20日的實作工作坊(Compose Multiplatform、Kotlin Multiplatform 架構、Coroutines、Spring Boot、AI agents 等)、開幕與第二日主題演講、Coding Challenge、展區交流、5月21日社交派對與遊戲互動、首屆 Golden Kodee Awards、時間膠囊活動,以及與作者合影和在應用程式評分留言。重點在學習新技術、人脈建立與享受會議體驗,並提醒標記明年日期。

14

How to take screenshots and generate PDFs in Kotlin

Dev.to Kotlin 作者:Custodia-Admin 發布:02-26 07:12

在 Kotlin 中擷取螢幕截圖與產生 PDF 的做法

透過對 PageBolt 的單次 HTTP 請求取得二進位回應,可在任何 JVM 與 Android 上無需 headless 瀏覽器就得到截圖或 PDF。

重點摘要

免除 Selenium/ChromeDriver 與整套 Chromium 的需求
使用 OkHttp 向 PageBolt API 取得截圖或 PDF 二進位檔
含 coroutine 包裝、Ktor 回傳範例與 Android 存檔示範

由於 JVM 與 Android 在無顯示器的 serverless 或容器環境中難以運行 Selenium/ChromeDriver 或完整 Chromium,文章示範更簡單的做法:透過對 PageBolt 的單次 HTTP POST 取得二進位回應,直接獲得網站截圖或 PDF,可在任何 JVM 與 Android 上使用。文中提供 OkHttp 範例(截圖、由 URL 或 HTML 產生 PDF,並以 JSONObject 處理 HTML 轉義),還有 coroutine-friendly 的 PageBoltClient 包裝、Ktor 回傳發票 PDF 的範例,以及在 Android 中將 PDF 存入 Downloads 的示範。此法不需 WebView、ChromeDriver 或額外執行環境,並有每月 100 次免費額度可試用。

15

Kotlin Lambdas Made Simple With Real Android Examples

Medium Kotlin 作者:The Dialectic 發布:02-25 16:18

用真實 Android 範例把 Kotlin Lambda 變簡單

許多 Android 初學者聽過 lambda,但很少了解如何在實際應用程式碼中運用它們。

重點摘要

說明 Kotlin lambda 的基本概念與語法
以實際 Android 範例示範常見應用情境
強調提升可讀性與減少樣板程式的實務技巧

本文為 Android 初學者將 Kotlin 的 lambda 概念化繁為簡,說明 lambda 是什麼、在 Android 開發中有何用途,並以實際範例示範如何在應用程式碼中使用。文章逐步展示常見語法、參數與回傳值處理,以及在事件監聽、集合操作與回呼等情境中的實務應用,強調增進可讀性與縮減樣板程式的做法。作者採取實用且易懂的教學方式,指出常見誤區與可行的重構手法,幫助曾聽過 lambda 但不知如何下手的開發者,能在 Android 專案中閱讀、撰寫並判斷何時使用 lambda 最合適。

16

Why Your Android App Is Slowly Dying (Even If You Don’t Touch It)

Medium Kotlin 作者:Bahadireray 發布:02-25 21:16

為何你的 Android 應用會逐漸衰退(即便你沒碰它)

你還記得那些曾經讓你愛不釋手的應用嗎?一切都很完美——順暢的滾動、快速的載入、極佳的使用體驗。

重點摘要

應用在初期常有順暢效能與快速載入。
數月之後,即使未被修改,使用體驗也可能變差。
文章提出為何曾受喜愛的應用會隨時間退化的疑問。

作者用一段貼近使用者經驗的描述開場:曾經順暢、載入快速、使用良好的應用,過了幾個月後卻開始變差。從這段摘錄可見,文章關注的是「即便不去動它,應用為何會逐步衰退」這個問題;指出感知上的效能和體驗會隨時間下降,並引導讀者進一步了解造成這種退化的可能因素與後果。摘錄暗示完整文章將探討原因並提供洞見,鼓勵開發者與使用者繼續閱讀以尋找解法。

17

MCP server written in Kotlin

Medium Kotlin 作者:Peter Nagy 發布:02-25 22:17

以 Kotlin 撰寫的 MCP server

我是 Android 軟體工程師,我喜歡 Kotlin,認為它是現代且型別安全的語言。

重點摘要

作者為 Android 軟體工程師並偏好 Kotlin
Kotlin 被描述為現代且型別安全的語言
作者看到有相關函式庫時感到非常高興

作者自我介紹為一名 Android 軟體工程師,表達對 Kotlin 的喜愛,並稱其為現代且型別安全的語言。文章開頭提到作者在發現有可用的函式庫時感到非常高興,並以「MCP server written in Kotlin」為題延伸討論。從片段可以看出,作者藉此說明其背景與對 Kotlin 的看法,並引導讀者前往 Medium 閱讀完整內容以了解如何在 Kotlin 生態中使用或實作與 MCP server 相關的資源與示例。