Daily Digest

每日新聞摘要

2026年03月28日

今日總結

內容會跟隨語言切換。

📝 今日焦點:Lihenium 以離線與隱私為優先,將掃描、文字辨識、影像角點偵測與本地資料庫整合成單一應用,APK 約十八MB,作者邀請回饋。 🏗 架構設計:以 MVI 與 Clean 架構達成模組化與可測試性,採 Hilt 精簡 DI、建議內建除錯面板並驗證 Retrofit→Ktor 遷移,並重申 Activity 必於 onPause 保存關鍵狀態,實務上。 ✅ 測試與品質:使用 Kover 量化覆蓋率與報表找出盲點,將度量納入 CI 並以資料驅動設定測試優先與門檻以降低回歸風險。 🚀 語言演進:CodeSpeak 與 Kooma 展示以對話與協程風格回應 LLM 能力,可能重塑語言設計、工具鏈與開發者互動流程。

01

I built an all-in-one PDF Scanner & Vault app solo in Kotlin — Lihenium is now live on Play Store!

Dev.to Kotlin 作者:Abhishek Kumar 發布:03-28 13:26

我以 Kotlin 獨立開發全方位 PDF 掃描與保險庫 App — Lihenium 已上架 Play 商店!

因為要用五款不同應用處理文件,他打造了離線優先、預設私密的一體化文件應用。

重點摘要

一體化 PDF 工具:掃描、編輯、壓縮、OCR、簽名、水印與保險庫
技術棧:Kotlin、Jetpack Compose、CameraX、OpenCV、ML Kit、Room
獨立開發挑戰:整合 OpenCV、處理 1 萬張影像、保持 APK 18MB

Abhishek 是來自印度比哈爾的獨立 Android 開發者,他將自己開發的 Lihenium 推上 Google Play。受到使用多款工具處理文件的挫折啟發,Lihenium 將掃描、編輯、合併/分割、壓縮、OCR、簽名、水印、QR 掃描與產生、保險庫(生物辨識鎖)、文件資料庫(含資料夾與標籤)、護照照製作與去背等功能整合於一,並提供可選的 Google Drive 備份。應用以 Kotlin + Jetpack Compose 開發,採用 CameraX、OpenCV(智慧角點偵測)、ML Kit(OCR)與 Room 本地儲存,主打離線優先與隱私預設。獨立開發的主要難題包括在不膨脹 APK 的前提下整合 OpenCV、避免處理超過一萬張圖片導致 OOM,以及將所有功能壓縮到僅約 18MB 的 APK。歡迎到 Play 商店試用並提供回饋。

02

What is MVI architecture, and how to use it?

Medium Kotlin 作者:Satnam Singh 發布:03-28 09:18

什麼是 MVI 架構,以及如何使用?

以簡明的步驟說明如何在 Android(以 Jetpack Compose 為例)中結合 MVI 與 Clean Architecture。

重點摘要

說明 MVI 與 Clean Architecture 的結合
以 Jetpack Compose 的 Android 情境為例
提供步驟化、實作導向的說明

本文以簡潔且實務導向的方式,逐步說明 MVI(Model-View-Intent)架構如何與 Clean Architecture 在 Android 中搭配使用,範例以 Jetpack Compose 為背景。文章說明 MVI 的核心概念與設計理由,並說明如何將 Clean Architecture 原則套用到專案結構,強調如何在可組合的 UI 中安排狀態管理與商業邏輯,以維持模組化與可測試性。整體目標是提供 Android 開發者具體的概念與實作方向,協助在實際專案中採用 MVI 與 Clean Architecture 的模式。

03

Stop Guessing, Start Measuring: A Real-World Guide to Code Coverage in Android with Kover

Medium Kotlin 作者:Abhinay 發布:03-28 09:26

別再猜測,開始量測:使用 Kover 的 Android 程式碼覆蓋率實務指南

一次遺漏的生產邊界情況讓我重視程式碼覆蓋率,而 Kover 改變了我對測試的看法。

重點摘要

生產中遺漏的邊界情況促使作者重視覆蓋率。
文章以 Kover 為工具,討論 Android 專案的覆蓋量測。
以數據為依據的覆蓋率能幫助優先測試並降低回歸風險。

作者回憶一次因遺漏邊界情況導致的生產問題,因而從「猜測測試是否足夠」轉為「以覆蓋率量測測試效果」。文章以 Android 為背景,介紹如何利用 Kover 取得實際的覆蓋率數據,並說明如何解讀這些指標以辨識盲點、優先化測試項目與將覆蓋檢查納入 CI 流程。重點在於採取務實、以資料為導向的方法來降低回歸風險並提升發布信心,而非把覆蓋率視為萬靈丹。

04

The Debug Screen Your Android Team Deserves

Medium Kotlin 作者:Ayman Alkurdi 發布:03-28 09:31

你的 Android 團隊應得的除錯面板

打造功能完整的內建開發者面板:API host 切換、功能旗標與環境控制,並能在正式版本中完全被編譯移除。

重點摘要

內建面板支援 API host 切換
提供功能旗標與環境參數的即時控制
設計為能在生產版中完全編譯移除

本文說明如何為 Android 應用打造一個功能完整的內建開發者面板,包含 API host 切換、功能旗標(feature flags)與環境控制等功能,方便開發與 QA 在不重編譯的情況下切換後端、測試功能或調整環境參數。作者強調設計要點是讓該除錯介面在正式釋出時完全被編譯移除,避免將除錯程式碼打包到生產版本,維持發行檔的潔淨與效能。文章討論此類面板對加速開發迭代、簡化故障排查與降低風險的實務價值,並建議將運行時控制與構建流程整合,確保開發便利性與正式發行的安全性。

05

I Ditched Retrofit for Ktor — Here’s What Happened After 3 Months

Medium Kotlin 作者:Abhinay 發布:03-28 10:25

我放棄 Retrofit 改用 Ktor——三個月後的結果

一則在生產環境 Android 新聞應用上從 Retrofit 轉到 Ktor 的真實經驗,並附上可直接使用的程式碼。

重點摘要

將生產中的 Android 新聞應用從 Retrofit 換成 Ktor
三個月的實務評估並提供可執行的範例程式碼
分享遷移過程中的實際觀察與經驗教訓

本文由 Abhinay 分享在生產環境中,將一款 Android 新聞應用從 Retrofit 遷移到 Ktor 的三個月實務經驗。文章記錄了遷移步驟並提供讀者能夠直接使用的程式碼範例,重點放在可操作的實作細節與在實際專案中觀察到的結果。作者描述了在真實應用中進行替換時遇到的整合與開發考量,並以經驗導向的方式整理出對其他想採用 Ktor 的 Android 工程師有參考價值的教訓與建議,協助讀者理解遷移會遇到的實際情況。

06

Day 3/100: Activity Lifecycle — The Diagram You've Seen 100 Times

Dev.to Kotlin 作者:Hoang Son 發布:03-28 00:46

第3天/100:Activity 生命週期 — 那張你看過百次的圖

onPause() 是系統在可能終止程序前唯一保證會被呼叫的回調,因此要在此處儲存關鍵狀態並釋放專屬資源。

重點摘要

onPause() 是最後的保證點,關鍵資料與專屬資源應在此存/釋放
旋轉或組態變更會破壞並重建 Activity,使用 ViewModel 或 SavedStateHandle 保留資料
Activity A 啟動 B 時 A.onStop() 在 B.onResume() 之後才執行,釋放資源別等到 onStop()

作者說明為何那張標準生命週期圖只能代表「順利路徑」,但在真實生產環境與面試中必須處理三種差異情境:回到背景、在返回堆疊中被其他 Activity 覆蓋,以及系統因記憶體不足直接殺掉程序(可能不會呼叫 onDestroy())。因此所有關鍵狀態應在 onPause() 儲存;onStop() 與 onDestroy() 不可靠或常被跳過。組態變更會導致 Activity 被摧毀並重新建立,實例變數與在 Activity 範圍的網路請求會被清掉,正確做法是把資料放在 ViewModel,並以 SavedStateHandle 處理可在程序被終止後還原的需求。文章亦說明兩個 Activity 轉換的順序與面試常問題與解法。

07

Build Your Own Landscapist Image Plugin in Jetpack Compose

Medium Kotlin 作者:Jaewoong Eum 發布:03-28 01:23

在 Jetpack Compose 中打造自己的 Landscapist 圖像外掛

Landscapist 為 Jetpack Compose 與 Kotlin Multiplatform 提供可組合的圖像載入庫。

重點摘要

Landscapist 是為 Jetpack Compose 與 Kotlin Multiplatform 設計的圖像載入可組件庫。
本文說明如何為 Landscapist 建立自訂圖像外掛以擴充功能。
自訂外掛可讓開發者調整載入策略、整合影像後端及客製化快取與解碼行為。

Landscapist 是一個為 Jetpack Compose 與 Kotlin Multiplatform 提供的可組合圖像載入庫。作者 Jaewoong Eum 的文章說明如何為 Compose 打造自訂的 Landscapist 圖像外掛,說明擴充此庫的理由與效益。文章介紹核心概念:以圖像 composable 為基礎並支援外掛機制,透過自訂外掛可調整載入策略、整合不同影像後端、並客製化快取或解碼行為。內容針對需要更細緻圖像控制與跨平台相容性的 Compose 開發者,強調擴充點與實務考量,協助在各類專案與平台上靈活運用 Landscapist。

08

Kooma : 코루틴 스타일로 VirtualThread 사용하기

Medium Kotlin 作者:Gyumin Bae 發布:03-28 03:45

Kooma:以協程風格使用 VirtualThread

在 virtual threads 上實作結構化並發,以 Kotlin 的方式。

重點摘要

介紹 Kooma,採用協程風格的並發處理
將 Java 的 virtual threads 與 Kotlin 工作流程結合
以 Kotlin 為中心,強調結構化並發的思維

這篇由 Gyumin Bae 發表在 Medium 的短文介紹了 Kooma:一種在 Kotlin 中以協程風格使用 Java virtual threads 的做法。文章以概念性敘述為主,說明如何將協程常見的結構化並發(structured concurrency)觀念,應用到輕量級的 virtual threads 執行模型上,強調以 Kotlin 為中心的設計思路。文章把 Kooma 描述為協程式 API 與 virtual threads 執行之間的橋樑,幫助開發者在使用 virtual threads 時更清楚地處理生命週期與作用域。讀者可至 Medium 查看作者提供的完整說明與細節。

09

From Zero to Hilt: Clean Dependency Injection in Android Explained

Medium Kotlin 作者:Shibin 發布:03-28 06:17

從零到 Hilt:解析 Android 中的乾淨依賴注入

如果你曾在 Android 中管理依賴或跨多層傳遞物件,就知道情況會很快變得混亂。

重點摘要

跨層傳遞物件會迅速造成依賴管理混亂。
Hilt 提供集中且更乾淨的依賴注入方式。
採用 DI 能提升維護性、測試性與擴充性。

本文由 Shibin 探討 Android 專案中依賴管理與物件在多層傳遞時常見的混亂問題,並介紹 Hilt 作為簡潔的依賴注入方案。文章說明為何需引入 DI、缺乏 DI 時會出現的維護性與測試性問題,以及採用 Hilt 能減少樣板程式、集中元件組裝並改善測試與擴充性。作者並提供搬遷既有專案與常見範式(如作用域、模組與注入點)的實務建議,目標讀者為希望提升程式結構與生命週期管理的 Android 開發者,讀後能理解用 Hilt 取代零散物件傳遞的好處與基本導入方向。

10

Breslav: dopo Kotlin, arriva CodeSpeak, un linguaggio per parlare con le AI

Medium Kotlin 作者:Pejone 發布:03-28 07:01

Breslav:繼 Kotlin 之後,推出 CodeSpeak — 一種用來與 AI 對話的語言

大型語言模型的成長正在改變軟體開發,Breslav 推出了以與 AI 對話為目標的 CodeSpeak。

重點摘要

大型語言模型改變開發認知與流程
Breslav 在 Kotlin 之後推出 CodeSpeak
CodeSpeak 致力於讓開發者以更自然方式與 AI 互動

隨著大型語言模型(LLM)快速成長,軟體開發的認知與流程正在轉變。文章指出,Breslav 在 Kotlin 之後推出了 CodeSpeak,一種以與 AI 對話為主的程式語言,旨在讓開發者能以更自然的語言與模型互動、將指令與設計意圖內建於語言層級。CodeSpeak 的出現象徵語言設計正在回應 AI 能力的提升,可能改變工具鏈與開發流程,但細節與實作仍需觀察。整體而言,LLM 的普及驅動語言創新,促使產業重新思考人機協作與程式表達方式。