Daily Digest

每日新聞摘要

2026年06月18日

今日總結

內容會跟隨語言切換。

📝 今日焦點:Compose Multiplatform 以 commonMain 覆蓋 17 個畫面,Android 已可正式上線,但 iOS 仍受崩潰與工具鏈成本牽制。 🔧 效能最佳化:Postgres 調校有極限,圖遍歷等負載若不契合,應改變存取模式或換更適合的系統。 🏗 架構設計:Navigation 3 促使重新檢視 ViewModel 與 SavedStateHandle;Server-driven UI 與 DIP 也再次強調可擴充、易測試的分層設計。 ✅ 測試與品質:Android 供應鏈安全聚焦第三方 SDK、依賴稽核與 Gradle 強化,降低建置與外部依賴風險。 🚀 語言演進:Kotlin 協程的 suspend、CAS、以及 val 與 const val 的差異,持續幫助開發者建立正確的非同步與常數心智模型。

01

97% of My App's Code Is in commonMain — A Field Report on Shipping 100% Compose Multiplatform

Dev.to Kotlin 作者:wang jack 發布:06-18 09:42

我應用程式 97% 的程式碼都在 commonMain:100% Compose Multiplatform 上線實錄

對於內容/列表/詳情型應用,CMP 在 Android 上已相當適合投入正式環境。

重點摘要

共用模組 96.9% 位於 commonMain,17 個畫面只寫一次。
原生差異集中在約 10 個 expect/actual 接點。
iOS 可編譯並顯示畫面,但仍有打磨與工具鏈問題。

作者以一個小型開發新聞閱讀器為例,說明如何用單一 Compose Multiplatform 程式碼庫上架 Google Play。共享程式碼幾乎都放在 commonMain,17 個畫面皆共用,原生差異則集中在約 10 個 expect/actual 接點,涵蓋平台資訊、分享、網址開啟、分析與 WebView。作者認為這種做法對內容/列表/詳情型應用而言,在 Android 上已足夠進入正式環境;但 iOS 仍在進行中,雖可於模擬器編譯與渲染,仍有崩潰、缺少分析以及 Xcode 與建置速度等工具鏈成本。

02

SavedStateHandle in the Navigation 3 Era: It’s Time to Rethink Your ViewModel

Medium Kotlin 作者:chanzmao 發布:06-18 09:30

Navigation 3 時代的 SavedStateHandle:是時候重新思考你的 ViewModel 了

如果你已經使用 Jetpack Compose 開發 Android 應用一段時間,很可能寫過類似的程式碼。

重點摘要

Jetpack Compose 開發者常沿用熟悉的 ViewModel 寫法。
文章聚焦 Navigation 3 時代下的 SavedStateHandle。
作者認為應重新檢視 ViewModel 的設計方式。

文章一開始指出,熟悉 Jetpack Compose 的 Android 開發者多半寫過類似的 ViewModel 程式碼。從標題可看出,內容聚焦於 Navigation 3 帶來的變化,以及 SavedStateHandle 在新的狀態與導覽架構下是否仍適用。雖然目前提供的內文很短,但核心訊息相當明確:開發者應重新思考現有的 ViewModel 設計是否還符合新的導覽時代。

03

When Postgres is the wrong place to traverse the graph

Medium Kotlin 作者:Andrey Minogin 發布:06-18 10:18

當 Postgres 不是遍歷圖的最佳場域

有些效能問題不是單靠查詢最佳化就能解決的。

重點摘要

圖遍歷可能不是 Postgres 擅長的工作負載。
索引、改寫查詢與調參未必能解決所有延遲。
有時真正的解法是改變方法或改用更合適的系統。

本文指出,有些資料庫效能問題並不只是查詢最佳化不足。即使已經加上索引、改寫 SQL、調整參數,甚至升級硬體,若工作負載本身不適合 Postgres,效能仍可能無法改善。作者以圖遍歷為例,說明某些情境下 Postgres 可能不是最佳選擇。重點在於,調校有其極限,必要時應重新思考資料存取方式,或選用更契合需求的系統。

04

Your App Will Be Resizable on Tablets Whether You Like It or Not

Medium Kotlin 作者:Christophy Barth 發布:06-18 11:01

無論你喜不喜歡,你的 App 都將可在平板上調整大小

在我幾年前推出的一個 Android side project 大多數時間裡,我從未想過平板電腦。

重點摘要

文章回顧一個原本未考慮平板的 Android side project。
這個 App 以直向為主,沒有把平板情境納入設計。
標題強調 Android App 最終仍必須面對平板可調整大小的要求。

本文回顧作者幾年前推出的一個 Android side project,當時幾乎沒有想到平板裝置,因為應用程式主要以直向模式設計。文章標題點出一個現實:即使開發者原本未將平板納入規劃,Android App 仍可能被要求支援平板上的可調整視窗與不同尺寸情境。從目前可見內容來看,核心訊息是平板相容性已成為 Android 開發中難以迴避的一環。

05

What No One Tells You About Android Development in 2026

Medium Kotlin 作者:AndroidLab by Andre 發布:06-18 13:14

關於 2026 年 Android 開發,沒有人會告訴你的事

生態系統已經成熟,但隱藏的複雜度卻變得更深了。

重點摘要

Android 生態系統比以往更成熟。
隱藏的複雜度並未減少,反而更深。
文章聚焦資深 Android 開發者正在討論的問題。

這篇文章指出,到了 2026 年,Android 開發不再只是面對一個尚未成熟、快速變動的生態系統;相反地,成熟也帶來了更深層的隱藏複雜度。文章本身沒有展開具體技術細節,而是以資深 Android 開發者正在談論的議題作為切入,暗示在實際開發中,Android 的挑戰並沒有因生態成熟而消失,反而可能變得更難察覺、更難處理。

06

Server-Driven UI Is Back And This Time, It’s Smarter Than Ever

Medium Kotlin 作者:AndroidLab by Andre 發布:06-18 13:22

Server-Driven UI 回來了,而且這次更聰明了

Android 應用的未來,甚至可能根本不在你的裝置上。

重點摘要

Android 應用可能更依賴伺服器控制的 UI。
Server-driven UI 被視為可擴展的解決方案。
文章認為這種模式比以往更成熟。

文章主張,Server-driven UI 正在 Android 開發中重新受到關注,而且這次的價值主張比以往更強。它指出,未來的 App 可能不會把所有介面邏輯都放在裝置端,而是讓伺服器主導部分體驗。作者將這視為一種更具擴展性的做法,特別適合需要快速調整、規模化成長的團隊。

07

“Grokking” Kotlin Coroutines: Why suspend exists

Medium Kotlin 作者:Yevhenii Krykun 發布:06-18 14:46

「領會」Kotlin 協程:為什麼會有 suspend

用一個實用的心智模型來理解非同步工作、執行緒、回呼、Rx,以及 Kotlin 為何需要 suspend。

重點摘要

以實用心智模型說明非同步工作
串連執行緒、回呼與 Rx 和協程
釐清 Kotlin suspend 關鍵字的用途

本文以實用的心智模型切入,幫助讀者理解 Kotlin 協程與非同步程式設計。作者不把 async、執行緒、回呼與 Rx 視為彼此孤立的概念,而是試著建立一個連貫的理解框架,說明它們與協程之間的關係,並進一步解釋 Kotlin 的 suspend 為何存在,以及它如何協助開發者更自然地思考非同步工作。

08

Mastering Design Principles: Dependency Inversion in Kotlin

Dev.to Kotlin 作者:Renzo Fernando LOYOLA VILCA CHOQUE 發布:06-17 23:35

掌握設計原則:Kotlin 中的依賴反轉原則

這種轉變大幅提升程式碼品質、方便單元測試,也讓應用程式更能迎接未來成長。

重點摘要

緊耦合會讓系統脆弱且難以變更。
DIP 要求高階與低階模組都依賴抽象。
透過介面與依賴注入,可提升可測試性與彈性。

本文以 Kotlin 的電商付款流程示範依賴反轉原則(DIP),這也是 SOLID 的最後一項原則。文章先展示 OrderProcessor 直接依賴 PayPalService 的緊耦合設計,指出這會造成難以測試、修改成本高,以及更換付款服務時牽一髮動全身。接著引入 PaymentGateway 介面,讓 PayPalProvider 與 StripeProvider 實作同一抽象,並透過建構子注入到 OrderProcessor。如此一來,架構更模組化、更易於使用 mock 進行單元測試,也更方便未來擴充新的付款方式。

09

I reverse-engineered my motorcycle's Bluetooth protocol to put Google Maps on the dashboard

Dev.to Kotlin 作者:Arjun 發布:06-18 03:41

我逆向分析了機車的 Bluetooth 協定,把 Google Maps 放上儀表板

一個週末的實驗,最後做出能把 Google Maps 導航送到機車儀表板的 App。

重點摘要

這台機車的 Bluetooth 協定是專有且沒有文件可參考。
作者透過封包觀察、反編譯原廠 App 與執行期攔截完成逆向。
他做出 REDLINE,將 Google Maps 導航寫入儀表板,並加入行車遙測功能。

作者分享自己如何逆向分析機車專有的 Bluetooth 儀表板協定,並開發 Android 應用 REDLINE,把 Google Maps 的逐步導航顯示到儀表板上。由於沒有文件,他先觀察實際 Bluetooth 流量,再反編譯原廠 App,並透過 Frida 追蹤函式呼叫,逐步釐清訊息格式與校驗碼。文中也誠實記錄多次判斷失誤,例如誤把特徵值當成數位鑰匙規格,以及誤以為車輛內建 SIM 卡。最終成品完全在手機上運作,不需帳號或雲端,還提供遙測、騎乘紀錄、匯出與待機時鐘等功能。

10

Demystifying Compare-And-Swap (CAS): The Secret Engine Behind Lock-Free Concurrency

Medium Kotlin 作者:Avik Sharma Chowdhury 發布:06-17 23:17

破解 Compare-And-Swap(CAS):無鎖並行背後的秘密引擎

StateFlow.update {}、AtomicInteger,以及你用過的每一個無鎖資料結構,背後的硬體原語。

重點摘要

說明 CAS 是核心硬體原語。
連結 CAS 與 StateFlow.update {}、AtomicInteger。
指出 CAS 是無鎖並行的基礎。

本文將 compare-and-swap(CAS)介紹為支撐現代並行程式設計的底層硬體原語,說明它如何成為 Kotlin 的 StateFlow.update {}、AtomicInteger 以及各種無鎖資料結構的基礎。文章強調,CAS 是實現不依賴傳統鎖機制的關鍵,並將其視為這些抽象背後的隱藏引擎,幫助讀者理解無鎖設計的核心概念。

11

Android Interview Questions & Answers Part:2 (Kotlin & Jetpack Compose)

Medium Kotlin 作者:Arindam Ghosh 發布:06-18 06:42

Kotlin:理解 val 與 const val 的差異

Explain the difference between val and const val in Kotlin with examples.

重點摘要

兩者都可用來宣告唯讀值
const val 只能用於編譯期常數
是否在編譯期已知,是選擇依據

本文以面試題的方式說明 Kotlin 中 val 與 const val 的差異。兩者都代表不可重新指定的值,但 const val 只能用於編譯期就已確定的常數,且通常限於原始型別與字串,並需宣告在頂層或 object 內;val 則可在執行期才完成初始化。文章也提醒讀者,應依值是否在編譯時已知來選擇合適的關鍵字。

12

Android Security in 2025 (Part 2): Fixing Inadequate Supply Chain Security in Android

Medium Kotlin 作者:Mohit Damke 發布:06-18 06:46

2025 年 Android 安全性(第 2 部分):修補 Android 供應鏈安全不足問題

第三方 SDK、依賴項稽核、Gradle 安全性

重點摘要

聚焦 Android 供應鏈安全風險
提到第三方 SDK 與依賴項稽核
將 Gradle 安全性列為重點

本文為 2025 年 Android 安全性系列的第二部分,主題聚焦在供應鏈安全不足的問題。從目前可取得的內容可知,文章主要談到第三方 SDK、依賴項稽核與 Gradle 安全性等議題。整體看來,作者延續前文脈絡,說明 Android 開發者如何透過更嚴謹地管理外部依賴與強化建置流程,降低供應鏈帶來的風險。