Daily Digest

每日新聞摘要

2026年08月05日

今日總結

內容會跟隨語言切換。

📝 今日焦點:Linxr 以 Virtio-9P 與 SAF 解決 Android Scoped Storage 共享難題;Google Glass 範例展示相機、儲存與穿戴式實務。 🔧 效能最佳化:Compose 談可暫停組合與 SubcomposeLayout,延續框架探查隱性耗時;Muffle 以前景服務、精準鬧鐘與 Room 提升可靠度。 🏗 架構設計:Compose 複雜畫面可拆成 controllers 與共享 state store;Android 驗證需處理過期與並發,版本管理則靠 Version Catalog 搭配 Convention Plugin。 🚀 語言演進:G# 以更簡潔語法切入 .NET 生態,主打 nil 安全、結構化並行與既有工具互通。

01

Linxr | Part 6 — Building Virtio-9P Storage Sharing & SAF on Android

Dev.to Kotlin 作者:Ai2th 發布:08-05 07:23

Linxr|第 6 部分:在 Android 上打造 Virtio-9P 儲存共享與 SAF

我們使用 Virtio-9P 與 Android 的 Storage Access Framework(SAF)解決了現代 Android 的主機到客體檔案共享問題。

重點摘要

QEMU 的 Virtio-9P 可低負載地將主機目錄暴露給 Linux 虛擬機。
Android 10 以上的 Scoped Storage 需要分層處理儲存存取。
SAF 讓使用者選擇資料夾,再轉換成可供 QEMU 共享的路徑。

本文深入說明 Linxr v3.0.0 如何在 Android 10 以上的 Scoped Storage 限制下,實現主機與客體之間的檔案共享。方案分成兩層:第一層以 QEMU 的 Virtio-9P 提供高效率的 POSIX 檔案路徑透傳;第二層則透過 Android Storage Access Framework(SAF)讓使用者可自行選擇共享資料夾。Alpine Linux 會在開機時自動掛載 9P 共享標記,因此 Android 裝置上的檔案可立即在客體系統中看到。對於 Downloads、Documents 或外接 SD 卡等位置,作者以 Kotlin MethodChannel 啟動 SAF,取得持久化 URI 後再解析成 QEMU 可用的路徑。

02

Camera Integration with Google Glass: Capture Images Using Android and Kotlin

Dev.to Kotlin 作者:vmodal_ai 發布:08-05 09:00

Google Glass 的相機整合:使用 Android 與 Kotlin 擷取影像

本教學示範如何用 Kotlin 將相機功能整合進 Google Glass 應用程式。

重點摘要

建立新的 Android 專案並加入相機權限。
以標準 Android intent 啟動相機,並顯示拍攝預覽。
使用 MediaStore 儲存照片,並採用穿戴式裝置的效能最佳化做法。

本文說明如何以 Kotlin 在 Google Glass 應用中加入相機功能。內容依序介紹必要條件、建立新的 Android 專案、在 AndroidManifest.xml 宣告相機權限、使用 ActivityResultContracts.TakePicturePreview() 啟動相機、將拍攝結果顯示在 ImageView 中,以及透過 MediaStore 儲存照片。文章也整理穿戴式應用的最佳實務,包括簡化介面、優先使用語音控制、避免阻塞主執行緒、壓縮大圖與節省電力,並列出條碼掃描、醫療紀錄、設備檢查、物流管理、遠端維修與 AI 物件辨識等實際應用。

03

What eats your frame budget (when nothing is blocking it) Part 2

Medium Kotlin 作者:Souleymane Sidibe 發布:08-05 09:00

當沒有任何阻塞時,是什麼吃掉了你的畫面預算?第二部分

在前一篇文章中,我看了三種除了你自己的 UI 之外,會吃掉畫面預算的因素:GC 暫停、鎖等待與 binder 呼叫。

重點摘要

探討非 UI 本身造成的畫面預算損耗
回顧 GC 暫停、鎖等待與 binder 呼叫
為系列文章的延續篇章

本文延續 Android 畫面預算的討論,聚焦在即使主執行緒沒有明顯阻塞,仍會影響效能的因素。作者指出,前一篇已分析三個來自 UI 之外的主要消耗來源:GC 暫停、鎖等待與 binder 呼叫。從這段內容可知,本文是系列的第二部分,進一步追查那些看不見卻會壓縮渲染餘裕的時間成本。

04

SubcomposeLayout, and the One Problem It Solves

Medium Kotlin 作者:Christophy Barth 發布:08-05 11:11

SubcomposeLayout 與它解決的唯一問題

Compose 的大多數流程會將組合與版面配置分成不同階段。

重點摘要

Compose 通常先組合,再進行量測與放置。
文章聚焦於 SubcomposeLayout 的用途。
它用來處理 Compose 預設流程中的特定限制。

這篇文章以 Jetpack Compose 的一般流程為對照,說明 composition 與 layout 通常是分開進行的:先完成組合,再由整棵樹進行量測與放置。SubcomposeLayout 被提出來解決一個特定問題,也就是在量測後才需要決定部分內容、或必須依版面條件再進行組合的情境。雖然摘要內容很短,但可看出文章重點在於解釋這個特殊 layout 原語存在的原因,以及它補足了 Compose 標準流程的哪一塊缺口。

05

Pausable Composition in Jetpack Compose — What It Actually Means for Your App’s Performance

Medium Kotlin 作者:Kamaldeep Kakkar 發布:08-05 13:36

Jetpack Compose 中的可暫停組合:對應用程式效能到底意味著什麼

每位 Compose 開發者都遇過這一刻:你在滑動 LazyColumn,一切都很順,然後突然——卡頓了。

重點摘要

Compose 開發者常在滑動 LazyColumn 時遇到突然卡頓。
文章聚焦於可暫停組合及其效能影響。
主題在於釐清這項功能對應用程式行為的實際意義。

本文以 Jetpack Compose 常見的效能問題切入:使用者在滑動 LazyColumn 時原本順暢,卻可能突然出現卡頓。文章聚焦於「可暫停組合」以及這個概念對實際應用程式效能的影響。根據目前可見的內容,作者意在說明 Compose 開發者為何會碰到這類短暫延遲,以及該功能與渲染行為之間的關係,但不超出提供的原文範圍。

06

Immutability vs concurrency: making a fast graph writable

Medium Kotlin 作者:Andrey Minogin 發布:08-05 13:45

不可變性與並發:讓高速圖可寫入

如何在不降低高遍歷吞吐量的情況下,即時修改記憶體中的圖。

重點摘要

說明可寫入的記憶體圖所面臨的問題
重點在於維持高遍歷吞吐量
承接作者前一篇文章的延伸說明

本文是作者前一篇關於記憶體圖的延伸說明,開頭即表示接下來將解釋:如何在不犧牲高遍歷吞吐量的前提下,讓 in-memory graph 能夠即時修改。雖然節錄內容未提供具體技術細節,但已點出核心議題,即在不可變性、並發控制與寫入能力之間取得平衡,讓圖結構既快速又可更新。

07

Maintaining Foreground Services in the Era of Android Doze Mode

Dev.to Kotlin 作者:Haseeb 發布:08-05 00:19

在 Android Doze 模式時代維持前景服務運作

我需要一套能穩定處理這些狀態變化的機制,不論手機是在口袋裡、桌上,還是包包深處。

重點摘要

Doze 模式會延遲鬧鐘與限制背景工作,影響需要準時執行的 Android 應用。
解法結合 ForegroundService、AlarmManager 的 setExactAndAllowWhileIdle,以及 WakefulBroadcastReceiver。
不同廠牌的省電機制可能終止服務,因此需要 JobScheduler 與本地資料庫做備援。

本文分享作者打造 Muffle 的經驗:這是一款能在會議、祈禱或約診前可靠切換手機靜音狀態的 Android 應用。由於 Doze 模式與各家廠牌激進的背景程序管理,單靠一般 Service 無法保證準時執行,因此作者採用 ForegroundService、AlarmManager 的 setExactAndAllowWhileIdle、WakefulBroadcastReceiver,以及 Room 本地資料庫來保存狀態並在程序被殺後快速恢復。文中也指出,部分裝置會保留通知卻殺掉背景執行緒,因而需要 JobScheduler 作為自我修復機制。核心觀念是接受平台限制,先將狀態持久化,再利用系統提供的電源管理工具。

08

G#: a modern .NET language with Go, Kotlin, and Swift ergonomics

Dev.to Kotlin 作者:withNext.NET 發布:08-05 04:49

G#:一門具備 Go、Kotlin 與 Swift 語感的現代 .NET 語言

G# 直接編譯為受管理的 .NET 組件,同時維持精簡且可預測的語言表面。

重點摘要

結合 Go/Kotlin/Swift 風格語法與完整 .NET 互通
支援資料類別、null 安全、結構化並行與明確數值型別
提供編譯器、REPL、轉換器、VS Code 擴充與 LSP 工具鏈

G# 是 David Obando 推出的新 .NET 語言,於 0.3 版亮相,目標是在不放棄 .NET 執行階段與生態系的前提下,提供現代、簡潔的語法。它可直接編譯成受管理的組件,並與 CLR、BCL、NuGet、MSBuild、Portable PDB 及 C# 無縫互通。語言設計包含 package/import/func 語法、資料類別、以 nil 為核心的 null 安全、scope 區塊的結構化並行,以及具體標示寬度的數值型別。文章也提醒,G# 仍屬 pre-1.0,建議先從小型實驗與學習開始。

09

From God ViewModel to Composed Screen Logic

ProAndroidDev 作者:Yves Kalume 發布:08-04 23:53

從上帝 ViewModel 到可組合的畫面邏輯

如果我們不只組合 composable,也能組合它們背後的邏輯,會怎麼樣?

重點摘要

把 ViewModel 深層傳入 UI 會降低重用性、可測試性與預覽穩定性。
把多個 callbacks 收斂成 onAction 可簡化介面,但 ViewModel 仍可能變得龐大。
作者建議以 controllers、共享 state store 與 logic class 拆分畫面行為。

本文指出,將狀態上提並把 ViewModel 放在 route 層雖是 Compose 的推薦做法,但當畫面規模變大後,長長的 callback 清單仍可能演變成龐大的 onAction 與肥大的 ViewModel。作者因此提出一種「組合邏輯」的思路:像拆分 UI 一樣,把畫面行為拆成各自負責的 controllers,透過共享的 screen state store 協調資料,再把可重用的驗證、轉換等規則抽成 logic class。ViewModel 只保留協調與初始載入責任。這不是取代所有 MVVM 的萬用解,而是適合複雜畫面的一種分工方式。

10

Android System Design: Building a Production-Ready Authentication Flow

Medium Kotlin 作者:Nemat 發布:08-05 00:38

Android 系統設計:打造可正式上線的驗證流程

安全的驗證系統,不只是登入後把 token 存起來而已。

重點摘要

妥善處理 token 過期
管理並發的 API 請求
聚焦可上線的驗證設計

本文指出,安全的 Android 驗證系統不能只在登入後儲存 token。除了保存登入資訊之外,還必須妥善處理 token 過期,並能可靠地應對並發 API 請求。文章重點在於如何設計一套適合正式環境使用的驗證流程,而不是停留在簡單的登入實作。

11

LinkedIn made a career plan for me. Does it work?

Medium Kotlin 作者:Saidel López 發布:08-05 04:11

LinkedIn 為我制定了職涯規劃。真的有效嗎?

在開始使用 LinkedIn Premium 的免費一個月後,平台依據幾個快速問題替我產生了一份學習計畫。

重點摘要

作者試用了 LinkedIn Premium 的免費一個月。
回答幾個問題後,系統生成了學習計畫。
文章進一步探討這份職涯規劃是否真的有用。

作者開始使用 LinkedIn Premium 的免費一個月方案,並在回答幾個簡短問題後,獲得了一份個人化學習計畫。這篇文章主要介紹這段體驗,並提出核心疑問:LinkedIn 自動產生的職涯規劃究竟是否實用。現有摘錄只呈現文章開頭,尚未包含完整評測內容。

12

Deep Linking in Android: The One Feature Every App Needs in 2026

Medium Kotlin 作者:Supsabhi 發布:08-05 04:20

Android 的深度連結:每個 App 在 2026 年都需要的唯一功能

繼續在 Medium 閱讀

重點摘要

目前提供的內容只有一段簡短的 Medium 提示文字。
除通知訊息外,沒有可供摘要的文章內文。
標題顯示主題是 Android 深度連結。

目前提供的內容未包含完整文章,只能看到一段簡短的 Medium 提示文字與標題。從現有資訊可知,文章主題是 Android 的深度連結,並將其描述為 2026 年每個 App 都需要的重要功能。不過,截取內容中沒有技術細節、範例或論述,因此無法據此整理出更完整的摘要。

13

Your MVI is probably MVVM with extra steps

Medium Kotlin 作者:Nguyenkhacphuc 發布:08-05 04:47

你的 MVI 可能只是多了些步驟的 MVVM

如果你的 ViewModel 長這樣,你寫的其實是 MVVM。

重點摘要

文章指出,許多自稱 MVI 的做法其實是 MVVM。
若 ViewModel 的結構與行為相似,通常代表仍是 MVVM。
這篇短文提醒開發者不要把常見架構模式名稱混淆。

本文主張,許多 Android 專案口中的 MVI,其實只是包裝得更複雜的 MVVM。作者用一句話點出核心:如果你的 ViewModel 長得很熟悉、運作方式也符合一般 MVVM 的做法,那它多半仍是 MVVM,而不是完整且獨立的 MVI 實作。文章篇幅極短,重點在於釐清架構命名上的混淆,提醒開發者正確認識自己真正採用的模式。

14

60 Android Interview Questions for Mid-Level Developers (2–5 Years)

Medium Kotlin 作者:Sohaib Ahmed 發布:08-05 05:01

給中階開發者的 60 題 Android 面試問題(2–5 年)

是什麼讓一位開發者成為 Android 工程師

重點摘要

整理 60 題 Android 面試問題。
適用於具 2–5 年經驗的中階開發者。
以開發者與 Android 工程師的差異作為切入點。

本文標題為〈給中階開發者的 60 題 Android 面試問題(2–5 年)〉,作者是 Sohaib Ahmed。依目前可見內容,文章主軸是在整理一組面向具數年經驗的 Android 開發者的面試題,並延伸討論一般開發者與 Android 工程師之間的差異。不過,提供的內文僅有簡短導語,未包含完整題目或進一步說明,因此可確認的重點是其面試準備與職能區分的方向。

15

Dependency Hell Isn’t a Gradle Problem — It’s a Modeling Problem

Medium Kotlin 作者:Android Expert 發布:08-05 05:51

依賴地獄不是 Gradle 的問題,而是建模問題

為什麼多模組 Android 建置會失敗,以及 Version Catalog 與 Convention Plugin 如何在 20 個以上模組中保持可擴展性。

重點摘要

多模組 Android 專案的失敗,常源自依賴建模不佳。
Version Catalog 可集中管理並統一版本定義。
Convention Plugin 能為 20 個以上模組提供可擴展的解法。

文章指出,Android 專案中的 dependency hell 通常不是 Gradle 本身造成,而是依賴建模方式不佳所致。當多模組建置缺乏一致的版本管理與集中化的建置邏輯時,專案就容易變得脆弱且難以維護。作者提出以 Version Catalog 搭配 Convention Plugin 作為解法,透過集中定義依賴與標準化各模組的建置行為,讓大型 Android 程式碼庫更容易管理,特別適合模組數超過 20 個的團隊。