Daily Digest

每日新聞摘要

2026年10月09日

今日總結

內容會跟隨語言切換。

📝 今日焦點 - Compose Multiplatform 主題設定改用 System/Light/Dark 三態,以 JSON Blob、StateFlow 與 mutex 保持單一來源與一致性,並補上損毀與未知值回退測試。 - Kotlin 協程與 Java 虛擬執行緒各有定位:前者適合 Kotlin 高併發工作負載,後者利於 Java 與傳統伺服器模式,兩者可並存。 - Android 開發者需面對自適應螢幕、Nav3 穩定版遷移,以及 AI 輔助開發、OCP、geofencing、AI agent 驗證等實務議題。 🔧 效能最佳化 - Pixel 4 離線推論遠低於預期,主因是 Android cross-compiling 缺少 ARM 最佳化參數,ggml 退回基礎指令集而非 dotprod 與 fp16。 🏗 架構設計 - 2026 新 Android 專案可務實採用 Kotlin 2.4、Compose、Flow 與 Room;Compose 的 receiver scopes、builder DSL、back stack 所有權與 expect 主題則凸顯 API 設計要清楚可驗證。 ✅ 測試與品質 - 依賴變動不可只看 commit 訊息;AI agent 也不能自報成功,必須以狀態、時間戳與產物驗證結果,失敗不可被默認為成功。 🚀 語言演進 - Kotlin Android 基礎、null safety、safe calls、Elvis Operator 與 fun interface/SAM conversion 這些主題顯示,語言與生態仍持續強化可讀性與表達力。

01

My dark mode toggle was lying to users

Dev.to Kotlin 作者:Ben 發布:10-09 08:46

我的深色模式切換開關一直在誤導使用者

在 Compose Multiplatform 中,使用 multiplatform-settings、Koin 與 StateFlow 持久化淺色、深色或系統主題

重點摘要

用 System、Light、Dark 三種主題狀態取代單一布林值。
以單一 JSON Blob 搭配 StateFlow 與 Mutex 保存與同步設定。
標籤放在 UI 層,並測試損毀或未知的已存資料。
展開詳細摘要

本文示範如何在 Compose Multiplatform 中正確表達主題選擇,避免把使用者的設定誤寫成單一布林值。作者改用 System、Light、Dark 三種狀態,區分系統主題與使用者明確選擇。資料層以 multiplatform-settings 搭配 kotlinx.serialization 將設定存成單一 JSON Blob,並透過 StateFlow 對外提供唯一資料來源,更新時則用 mutex 保護讀寫一致性。顯示文字留在 UI 層處理,方便本地化,也避免 enum 名稱直接暴露給使用者;同時加入測試,驗證缺值、損毀 JSON 與未知存值都能安全回退。

02

Why Your Phone Runs LLMs 80x Slower Than It Should (And What I Found)

Dev.to Kotlin 作者:Pingredsai 發布:10-09 11:45

為什麼你的手機跑 LLM 會比應有速度慢 80 倍

這篇除錯紀錄指出,Android 建置問題而不只是硬體限制,讓裝置端推論遠低於預期。

重點摘要

Android cross-compiling 遺漏 ARM 調校參數,導致 dotprod 與 fp16 路徑未啟用。
即使以反組譯確認最佳化指令已產生,實測仍只有 0.5 tok/s。
記憶體鎖定等疑因已被排除,專案最後仍如實標示慢速限制並完成釋出。
展開詳細摘要

作者在 Google Pixel 4 上離線執行 Qwen2.5-1.5B-Instruct 時,發現生成速度遠低於理論值。依記憶體頻寬與算力估算,裝置理應可達 30–60 tok/s,但實測只有 0.5 tok/s。經排除執行緒數量與 mmap 頁面被回收後,真正問題出在 Android cross-compiling 時缺少 ARM 最佳化參數,讓 ggml 退回基礎 ARMv8-A,未啟用 dotprod 與 fp16。即使確認指令已正確生成,效能仍然不佳,因此專案最終以誠實標示限制的方式釋出。

03

Kotlin Coroutines vs Java Virtual Threads: A Comprehensive Comparison for Modern Backend Development

Dev.to Kotlin 作者:Said Olano 發布:10-09 12:24

Kotlin 協程與 Java 虛擬執行緒:現代後端開發的完整比較

這兩種技術都代表 JVM 並行程式設計的重要進展。

重點摘要

協程透過 suspend/resume 與結構化並行運作;虛擬執行緒則由 JVM 負責 M:N 排程。
虛擬執行緒讓阻塞式 I/O 更容易使用;協程則在 Kotlin 生態中提供更細緻的控制。
選型取決於團隊技能、既有程式碼、工作負載型態,以及專案是 Kotlin 優先還是 Java 優先。
展開詳細摘要

本文比較 Kotlin 協程與 Java 虛擬執行緒這兩種現代 JVM 並行方案,先說明傳統以 OS 執行緒為基礎的模型在擴充性上面臨的限制,再介紹協程如何透過掛起、dispatcher 與結構化並行運作,以及虛擬執行緒如何利用 JVM 管理排程,讓阻塞式 I/O 也能維持良好擴充性。文章同時對照兩者在語法、除錯、例外處理與生態系整合上的差異,指出協程更適合 Kotlin 與高併發反應式工作負載,而虛擬執行緒則很適合 Java 專案與傳統伺服器模式。結論是兩者都很重要,也可以在現代後端系統中並存。

04

Stop Writing Huge Prompts: How Android Skills Can Change the Way We Use AI

Medium Kotlin 作者:Satish Nada 發布:10-09 07:05

停止撰寫超長提示詞:Android 技能如何改變我們使用 AI 的方式

這是一份給 Android 開發者的實用指南,涵蓋 AI Skills、Copilot、Navigation 3、更好的上下文,以及更高效的 AI 輔助開發。

重點摘要

聚焦 Android 開發者如何更實用地運用 AI。
提到 AI Skills、Copilot 與 Navigation 3 的應用脈絡。
強調透過更好的上下文提升 AI 輔助開發效率。
展開詳細摘要

本文以 Android 開發者的實務角度切入,說明如何更有效地運用 AI。內容點出 AI Skills、Copilot、Navigation 3 與更好的上下文,作為提升 AI 輔助開發效率的關鍵。文章主旨在於:與其依賴冗長提示詞,不如善用 Android 技能與脈絡,改變與 AI 協作的方式。

05

Every expect declaration is a promise you made twice

Medium Kotlin 作者:Rajan Maurya 發布:10-09 08:15

每一個 expect 宣告,都是你做了兩次的承諾

Continue reading on MobileByteSensei »

重點摘要

輸入內容未提供文章正文。
目前僅有標題、作者與連結。
無法從現有文字推斷更多技術細節。
展開詳細摘要

這份輸入沒有提供文章正文,只有標題、作者、連結,以及一行引導讀者前往 MobileByteSensei 繼續閱讀的文字。由於缺少實質內容,無法在不臆測的情況下產生忠實的技術摘要或條列重點。唯一可確認的是標題所指向的主題,似乎與 Kotlin 的 `expect` 宣告有關,但輸入本身並未說明文章的論點、範例或結論,因此不宜延伸推論。

06

Modern Android Architecture in 2026: The Boring Stack That Actually Works

Medium Kotlin 作者:AndroidLab by Andre 發布:10-09 09:05

2026 年的現代 Android 架構:真正可行的樸實技術棧

Kotlin 2.4、Compose、Flow 和 Room:如果我明天要開發新 App,會選這樣的配置。

重點摘要

作者認為新 Android 專案可採用 Kotlin 2.4、Compose、Flow 與 Room。
這套技術棧主打務實,而不是追逐花俏的新潮選項。
文章把它描述為 2026 年啟動新專案時可採用的預設做法。
展開詳細摘要

文章主張 2026 年的新 Android 專案可採用一套刻意樸實、但實際可行的技術棧:Kotlin 2.4、Compose、Flow 與 Room。作者強調,若明天要從零開始做新 App,自己會選擇這組配置。全文重點不在追逐新奇,而在於把它視為一個務實、熟悉且可落地的現代架構選擇,並未宣稱其他額外優勢或效能數據。

07

Navigation 3 versus Navigation Compose: who should own your back stack?

Medium Kotlin 作者:AndroidLab by Andre 發布:10-09 09:12

Navigation 3 與 Navigation Compose:誰該掌管你的 back stack?

Nav3 已經穩定,Google 也建議遷移;作者分享何時選擇各自方案才合理的看法。

重點摘要

Nav3 已進入穩定版。
Google 建議遷移到 Nav3。
作者說明何種情況下各方案較適合。
展開詳細摘要

Nav3 已經進入穩定版,Google 也建議開發者遷移。本篇內容圍繞 back stack 的所有權展開,作者表示將分享自己對 Navigation 3 與 Navigation Compose 在哪些情境下更合理的看法。截文未提供更細的實作細節,但可以看出文章明確把 Nav3 視為推薦方向,同時也暗示實際選擇仍需依使用情境判斷。

08

Your App Looks Fine on a Pixel Fold. Until You Unfold It.

Medium Kotlin 作者:Sixtin - Mobile App Developer 發布:10-09 10:09

你的 App 在 Pixel Fold 上看起來沒問題,直到你把它展開

隨著退出大螢幕支援的選項逐漸消失,現在該如何打造自適應 Android App。

重點摘要

大螢幕的退出選項將消失,自適應設計變得更重要。
文章聚焦於折疊裝置與其他大螢幕版面的應對方式。
這是 Android 開發者現在就需要準備的轉變。
展開詳細摘要

本文指出 Android 開發正面臨一項轉變:隨著「退出大螢幕支援」的選項逐漸消失,App 不能再只假設使用者會在手機大小的畫面上操作,而必須具備自適應能力。作者以 Pixel Fold 為例,說明 App 在折疊狀態下看似正常,展開後卻可能出現版面或體驗問題。核心重點是,Android 開發者應及早為各種螢幕尺寸與裝置型態做好準備。

09

How a Kotlin Android app works: Part 1

Medium Kotlin 作者:Aaliya Hussain 發布:10-09 10:46

Kotlin Android 應用程式如何運作:第 1 部分

Kotlin 基礎、Android 生命週期、MVVM 與 coroutines。

重點摘要

介紹 Android 開發所需的 Kotlin 基礎。
說明 Android 生命週期。
提到 MVVM 與 coroutines 是重點主題。
展開詳細摘要

這篇文章是系列的第一部分,主題是 Kotlin Android 應用程式如何運作。依據提供的內文摘錄,文章聚焦於 Kotlin 基礎、Android 生命週期、MVVM 與 coroutines 等核心概念,作為 Android 開發者理解這些主題的入門導覽。

10

The Compose BoM never dropped material-icons-extended. My build file says it did

Medium Kotlin 作者:Muhammad Azhar 發布:10-09 12:43

Compose BoM 從未移除 material-icons-extended,但我的建置檔卻寫得像是移除了

因為提交訊息中的一句話,我有三個應用程式都被鎖定在 1.7.8。

重點摘要

三個應用程式因提交訊息而被鎖定在 1.7.8。
作者在八週後才實際測試這句話。
建置檔讓人以為 Compose BoM 已移除 material-icons-extended。
展開詳細摘要

本文指出,作者在提交訊息中看到一句話後,便將三個應用程式鎖定在 1.7.8,因為那句話似乎表示 Compose BoM 已經移除 material-icons-extended。直到八週後作者才實際測試這個說法,發現情況與建置檔所暗示的不一致。文章重點在於說明這類依賴變動不能只憑訊息或表面解讀下結論,否則容易誤判套件是否真的被移除。

11

Designing Compose Components Part 3: Receiver Scopes

Medium Kotlin 作者:Ramadan Sayed 發布:10-09 12:53

設計 Compose 元件 第 3 部分:接收者作用域

它們實際如何運作,以及為什麼 @DslMarker 不是可有可無。

重點摘要

說明 Compose 元件中的接收者作用域如何運作
強調 @DslMarker 不是可省略的設定
聚焦於更清楚、較不易出錯的元件 API 設計
展開詳細摘要

本文延續 Compose 元件設計系列,聚焦在接收者作用域在實際上的運作方式,並說明為什麼在建立類 DSL 的 Compose API 時,@DslMarker 不能被視為可有可無。文章以元件 API 設計為核心,協助開發者理解不同 receiver 之間的互動,進而打造更清楚、較不易誤用的介面。這是一篇針對 Compose 元件設計的技術探討,而非概觀介紹。

12

Designing Compose Components Part 4: Builder DSLs

Medium Kotlin 作者:Ramadan Sayed 發布:10-09 12:55

設計 Compose 元件 第 4 部分:Builder DSL

深入了解 LazyColumn 的 item {} 實際如何運作,以及何時註冊比組合更合適。

重點摘要

說明 LazyColumn 的 item {} 內部運作方式。
比較註冊項目與直接組合內容的差異。
聚焦於 Compose 元件的 builder DSL 設計。
展開詳細摘要

本文探討 Compose 元件中的 builder DSL 設計,並以 LazyColumn 的 item {} 作為核心範例,說明這個 builder 在底層如何運作,以及註冊內容與直接組合內容之間的取捨。文章主要幫助 Kotlin 與 Compose 開發者理解宣告式 API 背後的機制,並看見 builder 風格的結構如何影響元件設計。這篇內容延續「Designing Compose Components」系列,重點放在 API 設計與實作行為之間的關係。

13

Open/Closed Principle (OCP) in Android — Open for Extension, Closed for Modification

Medium Kotlin 作者:Mahesh Jadhav 發布:10-09 14:36

Android 中的開放/封閉原則(OCP)

對擴充開放,對修改封閉。

重點摘要

新增功能時,避免反覆修改既有且可運作的程式碼。
在擴充行為的同時,維持既有程式碼穩定。
這是有助於維護 Android 架構的重要設計原則。
展開詳細摘要

本文介紹 Android 中的開放/封閉原則(OCP):軟體應該對擴充開放、對修改封閉。實務上,意思是在不反覆改動既有且已能正常運作的程式碼下新增功能,藉此維持既有行為穩定。文章將 OCP 定位為 Android 可維護性設計準則,強調以新增程式碼來擴充功能,而不是去修改已驗證可用的實作。

14

Architecting a Low-Power Geofencing Engine: Lessons from Battery Optimization in Muffle

Dev.to Kotlin 作者:Haseeb 發布:10-09 02:17

打造低耗電地理圍欄引擎:Muffle 電池最佳化的經驗教訓

目標是徹底消除手動切換音效模式的摩擦,讓手機成為能與周遭環境協調運作的工具,而不是與之對抗。

重點摘要

改用 GeofencingClient,避免頻繁高精度定位造成耗電。
地理圍欄觸發會有延遲,必須在精準度與省電之間取捨。
以 confidence radius、ForegroundService 與 hysteresis 應對誤觸與 Doze mode 限制。
展開詳細摘要

Muffle 想解決的,是使用者在不同情境間手動切換音量模式的麻煩。文章說明在 Android 上,若改用 GeofencingClient,能把定位與事件判斷交給 Google Play Services 與系統處理,只有在進入或離開特定範圍時才喚醒應用,遠比持續拉高精度更新更省電。不過這種作法也有代價:觸發常會延遲 30 到 120 秒,城市環境中可能受基地台訊號干擾而誤判,還要面對 Doze mode、ForegroundService、confidence radius 與 hysteresis 等設計問題。核心結論是要尊重系統省電機制,並把可靠性放在毫秒級精準度之前。

15

Why Your AI Agent Thinks It Succeeded (And How to Catch When It Didn’t)

Dev.to Kotlin 作者:StareBrain 發布:10-09 04:12

為什麼你的 AI Agent 以為自己成功了——以及如何抓到它其實沒有

Agent 的自我回報不是真相;系統狀態才是。

重點摘要

動作完成不等於結果已被驗證為成功。
應在派送後檢查狀態,而不是只看 agent 的回報。
無法驗證時應保留 DENIED_UNRESOLVED,不可默認成功。
展開詳細摘要

讓 AI agent 執行動作並不難,真正困難的是判定它是否真的做對了。文章指出,agent 的自我回報不能當作事實依據,因為步驟跑完不代表目標已達成。正確做法是在派送前定義成功條件,派送後再根據系統狀態、時間戳與預期產物進行驗證,並以 CONFIRMED、FAILED、DENIED_UNRESOLVED 區分結果。以訊息傳送為例,應檢查寄件記錄與時間是否符合要求;若無法驗證,就必須明確標示為 DENIED_UNRESOLVED。對裝置端 agent 而言,透明地失敗比自信地搞錯更重要。

16

Daily Kotlin: Null Safety, Safe Calls, and the Elvis Operator

Medium Kotlin 作者:Jason Kwon 發布:10-08 23:28

Daily Kotlin:Null Safety、Safe Call 與 Elvis 運算子

請繼續在 Medium 閱讀 »

重點摘要

本文僅提供 Medium 完整文章的連結。
主題是 Kotlin 的 null safety 與相關語法。
所給內文未包含進一步技術細節。
展開詳細摘要

目前提供的內容只是一段導向 Medium 完整文章的提示,標題為「Daily Kotlin: Null Safety, Safe Calls, and the Elvis Operator」。內文僅揭示主題與閱讀入口,沒有附上實際的技術說明、範例或分析。因此,依據這段文字只能確認文章聚焦於 Kotlin 的空值安全與相關語法,完整內容仍需前往 Medium 閱讀。

17

fun interface and SAM Conversion: When a Lambda Becomes an Interface

Medium Kotlin 作者:Ahmed Elkrrai 發布:10-08 23:36

fun interface 與 SAM 轉換:當 Lambda 變成介面

你可能已經寫過這一行很多次了。

重點摘要

本文僅有開頭摘要,完整內容需前往 Medium 繼續閱讀。
標題指出主題是 Kotlin 的 fun interface 與 SAM 轉換。
提供的文字沒有其他技術細節可供摘要。
展開詳細摘要

目前提供的內容只是 Medium 文章〈fun interface and SAM Conversion: When a Lambda Becomes an Interface〉的開頭引言,作者為 Ahmed Elkrrai。內文沒有實際展開技術說明、範例或結論,因此無法根據這段文字整理更多具體重點。可見的唯一句子只是在提示讀者,這個情境可能是大家都很常寫到的程式碼片段,其餘內容則需透過 Medium 連結繼續閱讀。