Daily Digest

每日新聞摘要

2026年03月16日

今日總結

內容會跟隨語言切換。

📝 今日焦點:升級 AGP、Kotlin 與 KSP 時以 issue 對齊版本、移除舊 Kotlin plugin,勿採 AI 降級建議並留意 Kotlin 2.3.20。 🔧 效能最佳化:針對物件 churn 與 GC 壓力優化,減少臨時分配並重用緩衝以維持 120Hz 裝置穩定幀率。 🏗 架構設計:以組合與 Kotlin 委派取代不當繼承,模組化 WorkManager 與 MediaStore 檔案處理並優化離屏 UI 行為。 ✅ 測試與品質:採用發佈檢查清單、單元與整合測試及靜態檢查以捕捉細微語法錯誤,並留意 Nedap 職缺與 Iterio 測試邀請。

01

Why AI Fails at Bleeding-Edge Updates: Fixing the AGP 9.1.0 + KSP Nightmare

Dev.to Kotlin 作者:freerave 發布:03-16 08:37

為何 AI 在尖端更新會失靈:修復 AGP 9.1.0 與 KSP 的惡夢

面對 AGP 9.1.0 的錯誤,AI 常建議關閉內建 Kotlin 的過時解法;正確做法是對齊版本並移除舊版插件。

重點摘要

AI 的訓練資料追不上快速演進的框架
不要在 gradle.properties 用關閉內建 Kotlin 的旗標當補丁
透過對齊 AGP/Kotlin/KSP 版本並移除舊的 Kotlin plugin 解決問題

作者指出,升級到 AGP 9.1.0、Kotlin 2.3.10 與 KSP 2.3.6 後,常見錯誤會讓生成式 AI 建議把 built-in Kotlin 關掉的過時解法,但那會放棄新版功能。真正做法是查閱 GitHub Issue 與 StackOverflow,確認 KSP 已支援 AGP 9.x,並在 libs.versions.toml 指定相容版本,移除專案與模組中的舊 Kotlin Android plugin,改用 android.sourceSets 而非 kotlin.sourceSets。作者的教訓是:在快速變動的生態系中,社群討論與原始紀錄比訓練滯後的 AI 更可靠。

02

Vacancy - java / kotlin developer (Groenlo, Netherlands)

Dev.to Kotlin 作者:Marlou Sadelaar 發布:03-16 09:15

職缺 — Java/Kotlin 開發工程師(荷蘭 Groenlo)

加入負責 Ons Suite API 平台的團隊,打造可讓醫療機構內各套軟體無縫整合且維持資料存取自主的平台。

重點摘要

設計並實作 Ons Suite 的 API 平台功能
混合辦公制,建議每週到 Groenlo 校園 1–2 天
月薪 €4,000–€5,500,含第十三個月、良好退休金與利潤分配

Nedap 招募 Java/Kotlin 開發工程師,負責 Ons Suite 的 API 平台開發,讓外部軟體與商業夥伴能在此建置擴充功能,提升醫療機構作業效率。你將與具技術背景的利害關係人協作,設計與實作平台功能,面對資料處理成長與 AI、自動化帶來的挑戰。團隊屬於一個包含兩個開發小組、十二位開發者、UX 專家與夥伴經理的部族,採混合工作模式並強調信任與自主。職務提供 €4,000–€5,500(全職)月薪、十三薪、優良退休金、利潤分配與成為股東的機會;並鼓勵個人與專業成長。需具備 Java 或 Kotlin 經驗,熟悉 Spring、RabbitMQ、DataDog、Vue、Playwright 等者為加分項,工作時數為每週 32–38 小時。

03

Vacancy - Kotlin Backend Developer (Groenlo, Netherlands)

Dev.to Kotlin 作者:Marlou Sadelaar 發布:03-16 09:19

職缺:Kotlin 後端開發工程師(Groenlo,荷蘭)

加入 MediKIT 團隊,開發以 HL7 FHIR 為基礎的全科醫師資訊系統,負責可擴展的後端功能與對外整合。

重點摘要

打造基於 HL7 FHIR 的後端服務,使用 Java/Kotlin 與 PostgreSQL
使用 Kubernetes、Azure、GitHub Actions,與跨領域小團隊合作
32–38 小時/週,混合辦公,定期於 Groenlo/Nijmegen/Utrecht 聚會

Nedap 招募 MediKIT 團隊的後端開發工程師,主要開發以 HL7 FHIR 為核心的全科醫師資訊系統,負責可擴展後端功能與與外部醫療機構的標準化整合。技術堆疊包含 Java/Kotlin、PostgreSQL、JSON 儲存、Kubernetes、Azure 與 GitHub Actions,若具備 React/TypeScript 經驗為加分項。團隊為小型跨領域組織,強調成員的責任與自主性,工作型態為混合辦公(32–38 小時/週),並每週至少到 Groenlo 或其中一個據點出席一次。福利包括第十三個月薪、完善退休金、利潤分享與員工持股機會,並重視員工成長與導入訓練。

04

Modern Android File Manager Implementation Using MediaStore and PackageManager

Dev.to Kotlin 作者:Devika Android 發布:03-16 10:27

使用 MediaStore 與 PackageManager 的現代 Android 檔案管理器實作

範例以 MediaStore 查詢媒體與檔案(含計數與總大小),以 PackageManager 取得已安裝與系統應用,並以協程在背景執行以維持 UI 流暢。

重點摘要

透過 MediaStore 取得圖片、影片、音訊、PDF 與 APK 的數量與大小。
用 PackageManager 依 ApplicationInfo 標記區分系統應用與使用者安裝應用。
示範 Android 13+ 與舊版的儲存權限請求;PACKAGE_USAGE_STATS 為手動開啟的使用統計權限,非存取檔案所必需。

文章說明一個清晰且現代的 Android 檔案管理器實作:使用 MediaStore 查詢各類媒體與檔案的條目與總容量,並用 PackageManager 列出已安裝與純系統應用(以 flags 判斷)。範例以 Kotlin 協程將查詢放在 Dispatchers.IO 執行以避免阻塞主線程,採 RecyclerView+GridLayoutManager 與多個 Adapter 顯示目錄、媒體與應用項目,並以資料類別封裝模型(如 CategoryModel、MediaModel、AllAppsModel)。範例也示範權限檢查與請求邏輯、格式化檔案大小與跳轉到相關 Activity 的行為,適合用作功能性檔案管理器的基礎。

05

Jetpack Compomse Insets & IME Padding

Medium Kotlin 作者:ibrahimcanerdogan 發布:03-16 07:36

Jetpack Compose 邊界內距與 IME(鍵盤)填充

螢幕鍵盤是否經常遮擋你的 TextField?學會在 Jetpack Compose 中使用 WindowInsets 與 Edge-to-Edge 處理。

重點摘要

螢幕鍵盤會遮住輸入欄位
透過 WindowInsets 管理 IME 填充
在 Compose 中支援 Edge-to-Edge 佈局

本文指出一個常見的 Android UI 問題:螢幕鍵盤(IME)遮擋 TextField,建議在 Jetpack Compose 中掌握 WindowInsets 與 IME padding 的處理方式,讓輸入欄位在鍵盤彈出時仍可見。文章強調採用 edge-to-edge 佈局與 inset-aware 的修飾子或 padding 解決方案,提升使用者輸入體驗。內容作為入門導引,促使讀者進一步探索 Compose 提供的 inset 與 IME 行為 API,以打造更健全、不易被鍵盤遮蔽的介面。

06

Why AI Fails at Bleeding-Edge Updates: Fixing the AGP 9.1.0 + KSP Nightmare

Medium Kotlin 作者:freerave 發布:03-16 08:44

為何 AI 在尖端更新上失靈:修復 AGP 9.1.0 與 KSP 的惡夢

別讓人工智慧把你的現代 Android 專案降級——這裡示範如何真正修復 KSP 的 DSL 錯誤。

重點摘要

AI 建議在面對新工具鏈時可能過時或有害
以 AGP 9.1.0 與 KSP 的不相容錯誤為例進行診斷
應以手動檢查與官方資訊為主,而非盲從 AI 降級建議

作者提醒,當 Android 工具鏈處於快速演進的前沿時,通用 AI 常會提出錯誤或有害的修復建議,反而可能把專案降級或造成更多問題。以 AGP 9.1.0 與 KSP 出現的 DSL 錯誤為例,文章指出 AI 常建議簡單降級或草率修改,但真正的解法需要檢視錯誤來源、確認插件與工具版本相容性、查閱變更日誌與 issue,以及採取針對性的修補手段。結論是把 AI 視為輔助的起點而非最終答案,遇到前沿更新時以實證與手動排查為主。

07

Under the Hood: How Compose and SwiftUI Handle What Happens Off-Screen

Medium Kotlin 作者:KMP Bits 發布:03-16 10:01

內幕解析:Compose 與 SwiftUI 如何處理畫面外的事物

有一個每位賽車迷都熟悉的瞬間:鏡頭從領先者切開,拉近到維修區,然後你會⋯

重點摘要

以賽車鏡頭比喻引入畫面外 UI 的處理方式
比較 Jetpack Compose 與 SwiftUI 在畫面外元件的策略差異
探討生命週期、重繪與資源管理的效能影響

本文以賽車場景做比喻,引入 Jetpack Compose 與 SwiftUI 如何處理畫面外(off-screen)元件的主題。作者檢視兩者在生命週期、渲染與資源管理上的設計取捨與行為差異,說明何時會保留或釋放視圖、何時觸發重繪以及對效能與記憶體使用的影響。文章強調理解框架內部運作有助於在實作滾動清單、延遲載入或大量 UI 元件時作出最佳化選擇,並用具體比喻讓技術細節更易理解。

08

Kotlin Fundamentals Part 12 — Loops in Kotlin — For, While & Beyond!

Medium Kotlin 作者:Kishor Ramani 發布:03-16 10:42

Kotlin 基礎(第12篇)— Kotlin 的迴圈:for、while 與進階用法!

迴圈是程式設計的基礎:這裡涵蓋你需要知道的所有 Kotlin 迴圈要點 🎯

重點摘要

迴圈是程式設計的基礎
涵蓋 for、while 與進階迭代模式
提供實作建議與良好實務

本文說明 Kotlin 中的迴圈,強調迴圈是程式設計的核心,並宣稱涵蓋所有你需要知道的 Kotlin 迴圈要點。內容包含主要的迴圈型別(如 for 與 while)、進階迭代模式與更具 Kotlin 慣用法的做法,說明如何在範圍與集合上進行迭代,以及 break、continue 等流程控制。文章以實用為導向,提供範例與建議,幫助開發者撰寫更清晰、高效且慣用的迴圈程式碼,同時避免常見錯誤與考量更合適的替代方案。

09

Kotlin Fundamentals Part 13 — Functions in Kotlin — The Building Blocks

Medium Kotlin 作者:Kishor Ramani 發布:03-16 10:43

Kotlin 基礎 第13篇 — Kotlin 的函式:構建基石

函式是打造乾淨、可重用程式碼的核心。

重點摘要

函式是乾淨且可重用程式碼的核心
函式作為程式的模組化構建塊
本篇重點在掌握 Kotlin 的函式

本篇為 Kotlin 基礎系列第 13 節,主題為函式(Functions)——程式的基本構件。文章強調函式是打造乾淨、可重用程式碼的核心,並鼓勵讀者掌握 Kotlin 的函式設計。藉由把行為封裝於函式,可減少重複、提升可讀性與可測試性,讓程式更易維護與組合。作者以函式為切入點,說明其對模組化與程式結構的重要性,並引導讀者前往 Medium 閱讀完整說明與範例,進一步學習相關實務與寫法。

10

Composition vs Inheritance in Android: Kotlin Delegation for Better Architecture

Medium Kotlin 作者:Abdulkadir Ali 發布:03-16 11:02

Android 的組合與繼承:以 Kotlin 委派提升架構品質

以組合與 Kotlin 的委派取代深層繼承,可獲得更乾淨且易於維護的 Android 架構。

重點摘要

繼承易導致緊耦合與僵化類別階層
Kotlin 的委派可讓類別將行為交由其他物件處理,降低重複與耦合
在多數情境偏好組合與委派,以提升模組化、測試性與關注分離

Abdulkadir Ali 比較了 Android 開發中組合(composition)與繼承(inheritance)的取捨,並主張利用 Kotlin 的委派(delegation)機制來改善系統架構。文章說明繼承常會造成類別緊密耦合與僵化的階層,降低可重用性與測試便利;相對地,組合讓行為拆成小而專注的元件,易於組合、替換與測試。Kotlin 的語言級委派允許類別把行為委派給其他物件,而不是透過繼承取得功能,從而減少重複與耦合。作者建議將繼承限制於真正的「is-a」關係,其他情況優先採用組合與委派,以取得更佳的靈活性、關注分離與維護性,最終能打造更乾淨且更易維護的 Android 程式碼與架構。

11

Inside WorkManager: How Android Really Runs Your Background Tasks

Medium Kotlin 作者:Mahesh Ambekar 發布:03-16 13:31

深入 WorkManager:Android 背後如何執行你的背景工作

WorkManager 看起來很簡單——安排工作後即可忘記,但實際上系統會把抽象工作對應到不同排程器、持久化狀態並處理約束與重試,確保能可靠執行。

重點摘要

提供簡單的排程介面以隱藏平台細節
依裝置與 API 等級對應不同系統排程器
持久化工作狀態並管理約束、重試與退避

Mahesh Ambekar 的文章說明 WorkManager 如何在 Android 中可靠地執行背景工作。表面上 WorkManager 以簡潔的 API 提供「排程後即可忘記」的體驗,但內部會依照裝置與 API 水準選擇合適的排程器,將工作狀態寫入持久化儲存以度過程序或裝置重啟,並處理約束條件、重試與退避,還能串接多個任務與管理相依性。文章解析核心元件與設計考量,說明為何 WorkManager 在不同情境會有不同行為,並協助開發者設計更穩健的背景任務。

12

10 Things Senior Android Engineers Always Check Before Shipping a Release

Medium Kotlin 作者:YADNYESH RANA 發布:03-16 13:47

資深 Android 工程師在發佈版本前一定會檢查的 10 件事

大多數 Android 開發者認為發佈版本只有一件事。

重點摘要

列出資深工程師在發佈前會執行的十項檢查清單
挑戰把發佈視為單一步驟的普遍觀念
強調涵蓋程式碼、測試、效能與發佈流程的實務檢查

本文以「資深 Android 工程師在發佈版本前一定會檢查的 10 件事」為題,指出許多開發者誤以為發佈只是按下發布鍵,但資深工程師會遵循有系統的檢查清單。文章列出十項發佈前檢查,目的是在上線前發現回歸與問題,降低事後事故與緊急修復需求。檢查範圍包括程式碼品質與審查、自動化與手動測試、效能與穩定性驗證、相依性與版本管理,以及發佈程序驗證。文章主張以清單化流程取代隨意上線,以提升產品穩定度與團隊信心。

13

Beyond the Leak: Engineering for Memory Efficiency and GC Stability

Medium Kotlin 作者:Sivavishnu 發布:03-16 14:16

超越記憶體洩漏:為記憶體效率與 GC 穩定性而工程設計

即使沒有記憶體洩漏,應用仍會卡頓:掌握分配模式、物件 churn 與 120Hz 幀時間預算。

重點摘要

沒有洩漏也可能出現卡頓
分配模式與短命物件增加 GC 壓力
120Hz 使每幀預算更緊,放大暫停影響

即使沒有明顯記憶體洩漏,應用仍會發生卡頓。原因包括分配模式與物件大量短命(object churn)造成的 GC 壓力,以及 120Hz 顯示器所縮短的每幀可用時間,讓短暫的 GC 工作也會導致漏幀。作者強調工程師應超越找洩漏,關注記憶體效率:分析分配熱點、減少臨時分配、重用物件與緩衝、並設計避免同步 GC 在渲染線程上造成阻塞。透過量測分配率與物件生命週期來定位 churn,並搭配 GC 調校或漸進式策略,可在高更新率裝置上維持穩定幀率。

14

Kotlin 2.3.20 Released

Kotlin Blog 作者:Sarah Haggarty 發布:03-16 10:01

Kotlin 2.3.20 發佈

此版本支援 Gradle 9.3.0、引入依名稱的解構宣告,並為 Kotlin/Native 提供新的 C/Objective‑C 互通模式。

重點摘要

支援 Gradle 9.3.0,Kotlin/JVM 編譯預設採用 Build tools API
語言層新增依名稱的解構宣告
Kotlin/Native 提供針對 C 與 Objective‑C 函式庫的新互通模式

Kotlin 2.3.20 發佈,涵蓋建置工具、語言、標準函式庫與 Native 互通等改進。重點包括對 Gradle 9.3.0 的相容性,Kotlin/JVM 編譯預設採用 Build tools API,Maven 設定更簡化;編譯器外掛更新(Lombok 為 Alpha,kotlin.plugin.jpa 改善 JPA 支援);語言層新增依名稱的解構宣告;標準函式庫提供建立 Map.Entry 不可變複本的新 API;Kotlin/Native 增加針對 C 與 Objective‑C 函式庫的互通模式。最新版本已內建於最新版 IntelliJ IDEA 與 Android Studio,或於 GitHub 釋出頁下載指令列編譯器。完整變更請參閱官方 What's new 與 GitHub 發行說明;遇到問題可在 Slack 尋求協助或於 YouTrack 回報。

15

🔒🧠 I built an Android study timer with spaced repetition – looking for alpha testers

Dev.to Kotlin 作者:K's apps 發布:03-16 03:57

Iterio:結合專注鎖定與間隔重複的 Android 學習計時器,徵求 Alpha 測試者

Iterio 將強制專注鎖定與自動間隔重複結合,依據艾賓浩斯遺忘曲線自動生成最佳複習時程。

重點摘要

三種鎖定等級(應用限制、無法解鎖的普通鎖定、含 PiP 阻擋的完全鎖定)
自動間隔重複排程:第1、3、7、14、30天
招募 Android 8.0+ 的積極學習者參與 Alpha,提供免費 Premium 與直接回饋通道

Iterio 是一款由單人開發的 Android 學習應用,目標同時解決手機分心與複習遺忘的問題。它提供三種專注鎖定層級以嚴格限制使用者在學習期間的手機功能,並在完成學習主題後依艾賓浩斯遺忘曲線自動排程複習(第1、3、7、14、30天),免除手動排程的負擔。其他功能還有可自訂的番茄鐘、主題化任務管理、類 GitHub 的學習熱力圖、加密 Google Drive 備份、程序生成的專注背景音與桌面小工具,支援英日雙語。技術棧包括 Kotlin、Jetpack Compose、Room 等。現正招募使用 Android 8.0+ 的測試者,加入請將 Gmail 寄至 support-iterio@ks-apps.org。

16

⚠️ A Small Unnoticed Mistake Changed My Entire Result (Android Dev Story)

Medium Kotlin 作者:Thamaraikannan 發布:03-16 03:59

一個被忽略的小錯誤改變了我的整個結果(Android 開發經驗)

有時候錯誤不大,只是一個被忽略的關鍵字。

重點摘要

一個小小的關鍵字也可能改變程式行為。
微小的錯誤常是最難發現的 Bug。
代碼檢查、測試與工具能防止此類問題。

作者分享一則 Android 開發經驗:因為一個容易被忽略的關鍵字,導致應用行為與結果出現重大且意外的改變。問題並非明顯的錯誤,而是細微的語法或語意差異改變了程式邏輯,追查過程耗時且不易發現。文章強調預防勝於治療,建議採用系統性的代碼審查、單元與整合測試、靜態檢查工具與詳盡日誌,並建立可重現的除錯流程與團隊協作習慣,以便及早捕捉這類小錯誤。結論是重視細節與良好工具鏈能避免微小失誤演變為大的開發回歸。