Daily Digest

每日新聞摘要

2026年10月06日

今日總結

內容會跟隨語言切換。

📝 今日焦點:Joyframe 驗證可跨遊戲使用,BoatBrawl 也移植到 Fire TV Stick,並持續展現 Kotlin 資料驅動設計。 🔧 效能最佳化:Muffle 改用 GeofencingClient,Punish 與 Coinly 都提醒要在真實 release、背景切換與系統省電條件下測試。 🏗 架構設計:多篇文章比較 MVI/MVVM、gRPC/REST 與 KISS 原則,也分享個人 Kotlin 專案、JCOReflector、TBEG 與跨平台日期選擇器。 ✅ 測試與品質:Coinly、Punish 與啟動時 content container view 問題都顯示,debug 通過不代表 release、授權或時序就安全。 🚀 語言演進:Kotlin 2.4 後續焦點落在 stable context parameters、explicit backing fields,以及更清楚的函式能力與工程理解。

01

Two 3D games in two hours, and our boat game on Fire TV: life after Shipaton with Kotlin Multiplatform

Dev.to Kotlin 作者:Rehaan Cubes 發布:10-06 09:03

兩小時做出兩款 3D 遊戲,還把 BoatBrawl 帶上 Fire TV:Kotlin Multiplatform 在 Shipaton 之後

Shipaton 已經結束,但 Joyframe 並不是一個黑客松專案。

重點摘要

Joyframe 被用來在約一小時內完成 Island Panic 與 SkyFall 兩款新遊戲。
BoatBrawl 加入 Amazon Fire TV Stick 支援,並切換到專用的低功耗設定檔。
文章說明了 Joyframe 的純 Kotlin 場景資料、程式生成的美術與音效、離螢幕渲染與手機控制器設計。
展開詳細摘要

這篇文章回顧 RevenueCat Shipaton 結束後,BoatBrawl 與其底層函式庫 Joyframe 的後續進展。作者先用 Joyframe 驗證庫是否真的適合非船戰遊戲,結果是兩款全新 3D 遊戲 Island Panic 與 SkyFall 都各自在約一小時內完成,且都由 Claude Code 協助生成。接著,BoatBrawl 也移植到 Amazon Fire TV Stick,透過低功耗設定檔降低解析度、關閉部分效果、調整模擬與輸入處理。全文同時說明 Joyframe 以 Kotlin 為核心、以資料驅動場景與生成式資產運作的設計。

02

5 Android bugs my tests didn't catch while shipping an expense tracker

Dev.to Kotlin 作者:Rao Asad 發布:10-06 10:58

我在發布 Android 記帳 App 時,測試沒抓到的 5 個 bug

這五個 bug 都進到了正式版,其中幾個還真的影響到使用者。

重點摘要

Gson 在 release 版可能因 R8 重新命名欄位,導致反序列化默默回到預設值。
只讀 .value 不收集時,StateFlow 可能永遠停在初始值。
replay = 0 的 SharedFlow 在 App 不在前景時,可能丟失一次性導覽事件。
展開詳細摘要

作者在開發並上線 Android 記帳 App Coinly 的過程中,遇到 5 個測試沒抓到的問題:Gson 欄位在 release 版被 R8 重新命名後,反序列化默默失效;StateFlow 只讀 .value 而未被收集時,值一直停在初始狀態;一次性導覽事件使用 replay = 0 的 SharedFlow,當 App 不在前景時會被丟失。另有 App Bundle 語言拆分造成語言切換異常,以及 Google Play pre-launch 機器人回報的 Crashlytics 異常。文章強調,光測 debug 版與畫面顯示不夠,應實測 minified release、從 Play 安裝、測試背景/前景切換,並留意 crash report 的裝置名稱。

03

If you fail, you owe money to the cause you hate most. So every screen-time bug in my app is a billing bug

Dev.to Kotlin 作者:Itai Hoffman 發布:10-06 11:21

如果你失敗了,就得把錢賠給你最痛恨的對象

所以我 app 裡每一個螢幕使用時間 bug,都是帳務 bug。

重點摘要

Punish 會在使用者超出自訂螢幕時間目標時,將賭注透過 every.org 支付給指定組織。
Android 端寧可低估也不要高估,無法判定時就直接標示為未知,不當成 0。
作者結合 UsageStatsManager、事件流遍歷、AccessibilityService 與覆蓋區間紀錄來處理平台誤差。
展開詳細摘要

本文介紹作者自製的 Android 應用 Punish:使用者先設定螢幕使用時間目標並押上金額,若超標就把錢付給自己最不想資助的組織。因為數字一旦算錯,可能會把錢錯誤送出,或讓威嚇失效,所以作者在原生層的原則是「不確定就低估,完全無法量測就明說」。文章細數 Android 的各種坑,包括 UsageStatsManager 會高估前景時間、STOPPED 事件延後到達、跨午夜與關機情境要特別處理、以及無權限時查詢會悄悄回傳空結果。網站追蹤則靠 AccessibilityService 讀取瀏覽器網址列,並用覆蓋區間避免服務死亡時被誤判為正常使用。

04

Yet another personal project. I over-engineered it on purpose

Dev.to Kotlin 作者:Théo Verdiere 發布:10-06 14:00

又一個個人專案:我刻意把它做得過度複雜

沒有截止日期、也沒有老闆的個人專案,是最容易把系統做過頭的地方。

重點摘要

作者刻意打造一個超出需求的 Kotlin 個人專案,不是新創也不是變現副業
專案從後端、Android App、CI、基礎設施一路做到部署,面向很小的使用者群
透過過度設計學習 hexagonal architecture、DDD 與實際的基礎設施操作
展開詳細摘要

本文回顧作者歷時約 22 個月的 Kotlin 個人專案,起點是想在不受工作限制的情況下,親手做出一套真正可運作的後端、Android App、CI 與基礎設施。專案以階段方式成長:先有後端,再加入 Android 與 Jetpack Compose,接著是 Dagger.io CI、Pulumi 與 KinD 測試環境,最後落地到 Hetzner VPS 上的 k3s 叢集。作者承認其中有不少刻意的過度設計,也有實作後才修正的決策,例如移除 Karate E2E、從多個 repo 轉向 monorepo,以及把 Elasticsearch 換成 Meilisearch。如今應用已上線,並累積了少數真實使用者。

05

A correct Android answer can still fail the interview

Medium Kotlin 作者:Mike Salari 發布:10-06 12:01

正確的 Android 答案,仍可能在面試中失利

兩個回答同一個 Android 問題的答案都正確,卻得到截然不同的評分。

重點摘要

同一個 Android 問題的兩個正確答案,評分差異很大。
文章指出,資深面試流程評估的重點不只是真正確。
全文內容可在 Medium 繼續閱讀。
展開詳細摘要

文章指出,在 Android 面試中,技術上正確的答案不一定能拿到好評分,關鍵在於它是否回應了面試流程真正想測試的能力。作者以同一題的兩個正確回答卻得到截然不同的結果為例,說明資深面試往往不只看事實是否正確,也會看應試者如何思考與表達。本文只是導讀,完整內容可在 Medium 上繼續閱讀。

06

JCOReflector: bringing .NET APIs to the JVM — and now with experimental generics

Medium Kotlin 作者:Mario Mastrodicasa 發布:10-06 12:15

JCOReflector:將 .NET API 帶到 JVM,現在還加入實驗性泛型

在 JVM 行程中執行真正的 CLR,並將 .NET API 介面以 Java 形式暴露出來,進而可供 Scala、Kotlin 與 Clojure 使用。

重點摘要

在 JVM 行程中執行真正的 CLR
將 .NET API 介面暴露為 Java API
新增實驗性泛型支援
展開詳細摘要

JCOReflector 讓真正的 CLR 進入 JVM 行程,並把 .NET API 介面以 Java API 的形式暴露出來,因此也能供 Scala、Kotlin 與 Clojure 使用。本文同時提到,這個專案現在加入了實驗性泛型支援。原文僅提供上述資訊,未說明更多實作細節、限制或效能數據。

07

I blamed a launch crash on the phone in August. My next app crashed the same way 9 times in 15

Medium Kotlin 作者:Muhammad Azhar 發布:10-06 12:42

「Window couldn’t find content container view」:為什麼 Google 的同意表單要等到你的視窗就緒

我在 8 月把一次啟動當機怪到手機上;我的下一個 app 也用同樣方式當機了 15 次中的 9 次

重點摘要

啟動當機與「Window couldn’t find content container view」錯誤有關。
文章探討 Google 的同意表單為何必須等待視窗建立。
後續另一個 app 也以相同方式多次當機。
展開詳細摘要

這篇文章聚焦於啟動時出現的「Window couldn’t find content container view」錯誤,並說明它與 Google 同意表單的顯示時機有關:必須等到視窗可用後才能繼續。作者先回顧自己在 8 月曾將一次啟動當機歸因於手機,接著指出下一個 app 也以相同方式在 15 次嘗試中當機 9 次。文章重點在於釐清這種與視窗建立時序相關的問題,而非宣稱已找到通用修正或額外原因。

08

MVI vs MVVM in Jetpack Compose: what is less likely to harm in the future?

Medium Kotlin 作者:AndroidLab by Andre 發布:10-06 13:33

Jetpack Compose 中的 MVI 與 MVVM:哪一種較不容易在未來造成問題?

我兩種都上線過,以下是我在實際 Android App 開發中如何看待這些取捨。

重點摘要

作者表示自己已經在實際產品中採用過 MVI 與 MVVM。
文章聚焦於真實 Android 開發中的取捨。
核心問題是選擇哪種架構較不容易在未來造成傷害。
展開詳細摘要

這篇文章在 Jetpack Compose 的情境下比較 MVI 與 MVVM,重點放在長期取捨,而不是抽象的架構之爭。作者表示自己兩種做法都已經實際交付過產品,並說明在真實 Android App 開發中如何思考這個選擇。從目前可見內容來看,文章主要關心哪一種模式較不容易在未來引發問題,而不是主張某一種模式絕對優於另一種。

09

Kotlin Functions Every Android Developer Should Understand

Medium Kotlin 作者:Anil Kumar 發布:10-06 13:42

每位 Android 開發者都應了解的 Kotlin 函式

Kotlin 提供了多項強大特性,讓函式更具表達力、更精簡,也更有彈性。

重點摘要

介紹 Android 開發者應掌握的 Kotlin 函式特性
強調函式可更具表達力與精簡性
說明 Kotlin 在函式設計上的彈性
展開詳細摘要

這篇文章介紹 Android 開發者應該理解的 Kotlin 函式特性,指出 Kotlin 提供多項強大功能,能讓函式寫得更具表達力、更精簡,也更有彈性。文章定位為一篇入門導讀,協助讀者更有效地在 Android 開發中運用 Kotlin 函式。

10

Kotlin 2.4 Is Out. The Interesting Part Is What Comes Next

Medium Kotlin 作者:AndroidLab by Andre 發布:10-06 13:42

Kotlin 2.4 已推出,重點在於下一步會發生什麼事

穩定的 context parameters、明確的 backing fields,以及我看好的 Kotlin 2.4.20 變化。

重點摘要

stable context parameters 已成為討論重點。
explicit backing fields 被視為值得關注的方向。
作者押注 Kotlin 2.4.20 會帶來下一波變化。
展開詳細摘要

Kotlin 2.4 已推出,但文章重點不在這次版本本身,而是接下來可能出現的變化。內文提到 stable context parameters、explicit backing fields,以及作者看好的 Kotlin 2.4.20 轉向。整體來說,這是一則偏前瞻的觀察,重點在於語言未來的演進方向,而不是完整列舉功能細節。

11

I Can Get Code in Seconds Now. So Why Do I Understand Less?

Medium Kotlin 作者:Mugumya Ali 發布:10-06 13:48

我現在幾秒就能產出程式碼,那為什麼我反而更不理解了?

寫程式碼從來就不是軟體工程最困難的部分。

重點摘要

文章質疑:程式碼產出更快,是否讓理解變得更困難。
作者重新思考軟體工程真正困難的地方是什麼。
這篇內容只是 Medium 的開頭,正文需到原文繼續閱讀。
展開詳細摘要

作者反思軟體工程中的一個矛盾:現在幾秒內就能生成程式碼,但對系統的理解卻可能變得更薄弱。文章主張,寫程式碼從來不是最困難的部分,並進一步追問軟體工程真正的難點到底是什麼。就目前提供的內容來看,這只是 Medium 上的短篇開頭,主要功能是引導讀者前往原文繼續閱讀。

12

gRPC — How it works

Medium Kotlin 作者:Roman Kryvolapov 發布:10-06 14:26

gRPC — 運作原理

說明 gRPC 如何建立在 HTTP/2 與 Protocol Buffers 之上、在內部服務情境下何時優於 REST,以及如何建立 Kotlin 伺服器。

重點摘要

gRPC 建立在 HTTP/2 與 Protocol Buffers 之上。
在內部服務場景中,它可能比 REST 更合適。
文章也提到如何建立 Kotlin 伺服器。
展開詳細摘要

本文說明 gRPC 如何運作於 HTTP/2 與 Protocol Buffers 之上,並指出它在內部服務的情境下,可能比 REST 更合適。內容也延伸到實作面,提到如何建立 Kotlin 伺服器。整體重點放在 gRPC 的架構與實務使用,而非一般性的 API 設計比較。

13

gRPC — Как это работает

Medium Kotlin 作者:Roman Kryvolapov 發布:10-06 14:28

gRPC — 運作原理

gRPC 如何建立在 HTTP/2 與 Protocol Buffers 之上、與 REST 有何不同,以及如何用 Kotlin 和 Gradle 組裝伺服器與客戶端。

重點摘要

說明 gRPC 在 HTTP/2 與 Protocol Buffers 之上的架構
比較 gRPC 與 REST 的差異
示範如何用 Kotlin 與 Gradle 建立伺服器與客戶端
展開詳細摘要

本文說明 gRPC 如何建立在 HTTP/2 與 Protocol Buffers 之上,以及這代表的實際運作方式。文章也對比 gRPC 與 REST,著重於架構差異,而非宣稱任何普遍優勢。最後,作者介紹如何使用 Kotlin 與 Gradle 組裝伺服器與客戶端,適合作為想了解通訊模型與基本專案設定的工程師入門閱讀。

14

KISS Principle in Android — Keep It Simple

Medium Kotlin 作者:Mahesh Jadhav 發布:10-06 14:35

Android 中的 KISS 原則:保持簡單

簡單的程式碼更容易理解、測試、除錯與維護。

重點摘要

保持程式碼簡單。
提升可讀性與測試性。
更容易除錯與維護。
展開詳細摘要

本文介紹 Android 開發中的 KISS 原則,也就是讓程式碼保持簡單。作者指出,簡單的程式碼更容易被理解、測試、除錯與維護。核心觀點是避免不必要的複雜度,能讓 Android 程式更實用,也更容易管理。

15

Geofencing without the Battery Drain: Lessons from Muffle

Dev.to Kotlin 作者:Haseeb 發布:10-06 00:52

不耗電的地理圍欄:來自 Muffle 的實作心得

為背景情境設計很難,但對使用者來說,真正有價值的是能解決問題、而不是增加負擔的 app。

重點摘要

改用 Google Play Services 的 GeofencingClient,避免持續輪詢造成耗電。
搭配 JobIntentService、AudioManager 與僅在觸發時使用的 WakeLock 來提高可靠度。
不同 OEM 的省電策略會干擾背景執行,需額外加入 keep-alive 檢查與測試。
展開詳細摘要

本文分享作者打造 Android 應用 Muffle 的經驗:讓手機依位置與時間自動切換音效設定,同時盡量不耗電。作者一開始使用持續定位輪詢,後來改採 GeofencingClient,交由系統在底層處理位置監控;為了提高穩定性,也結合 JobIntentService、AudioManager 與僅在觸發時啟用的 WakeLock。文章指出,不同 OEM 的背景限制與省電機制常導致觸發失敗,因此應優先使用系統原生 API、簡化架構,並在激進省電的裝置上充分測試。

16

Stop writing Excel reports cell by cell - bind data to templates instead (Kotlin/Java)

Dev.to Kotlin 作者:황용호 發布:10-06 06:43

別再逐格撰寫 Excel 報表,改用模板綁定資料(Kotlin/Java)

TBEG 從根本解決問題:先在 Excel 中設計報表,再把資料綁上去。

重點摘要

適用於 JVM 的 Excel 報表模板式產生工具
支援變數綁定、重複資料展開、圖片、公式、圖表與格式
僅用於產生,不支援 Excel 讀取/解析,並提供 Spring Boot 整合
展開詳細摘要

本文介紹 TBEG(Template Based Excel Generator),這是一個 JVM 函式庫,透過將資料綁定到預先設計好的 Excel 模板來產生報表。相較於用 Apache POI 逐格建立報表,開發者只要在模板中放入 ${variableName} 之類的標記,程式端提供資料即可。TBEG 會自動處理變數替換、清單資料展開、圖片插入、自動合併儲存格、公式範圍調整、條件式格式複製與圖表資料反映。文章也說明其效能、Spring Boot 匯出 API 的常見用法,以及 Kotlin 與 Java 的快速上手範例;此工具僅用於產生 Excel,不支援讀取或解析檔案。

17

Publishing one Kotlin Multiplatform library to six places: Maven Central, SPM, pub.dev,

Medium Kotlin 作者:Shiva Thapa 發布:10-06 04:06

將一個 Kotlin Multiplatform 函式庫發佈到六個平台:Maven Central、SPM、pub.dev

我開始做 Nepali Date Picker,只為了解決一個問題:為 Android 與 iOS 提供一個看起來與 Material 3 完全一致的 Bikram Sambat 日期選擇器……

重點摘要

一個 Kotlin Multiplatform 函式庫正被發佈到多個套件倉庫。
這個專案從 Nepali Date Picker 這個需求開始。
目標是為 Android 與 iOS 提供符合 Material 3 風格的 Bikram Sambat 日期選擇器。
展開詳細摘要

這篇文章介紹 Nepali Date Picker 這個 Kotlin Multiplatform 函式庫,作者的出發點是解決一個明確需求:為 Android 與 iOS 提供一個體驗上貼近 Material 3 的 Bikram Sambat 日期選擇器。從可見內容來看,重點在於這個函式庫將被發佈到多個位置,包括 Maven Central、SPM 與 pub.dev。原文摘錄沒有提供實作細節或更多技術比較,因此可確認的核心是跨平台發佈目標,以及這個日期選擇器的應用情境。

18

Staging Never Gave My Kotlin Project 500. My AI Agent Does.

Medium Kotlin 作者:Yudistiro Septian Dwi Saputro 發布:10-06 04:55

Staging 從未讓我的 Kotlin 專案出現 500;我的 AI Agent 會。

每個 sprint,在我碰到 ticket 之前,Chucker 就已經開在我的裝置上。

重點摘要

作者在每個 ticket 開始前就先開啟 Chucker。
它會顯示 App 發出的每一個 request 與收到的每一個 response。
這段內容只是引言,後文需到 Stackademic 繼續閱讀。
展開詳細摘要

這篇文章目前只提供一段簡短引言:作者在每個 sprint 處理 ticket 前,都會先在裝置上開啟 Chucker,藉此檢視 App 發出的所有 request 與收到的 response。標題對比了 staging 從未讓 Kotlin 專案出現 500 錯誤,卻是 AI agent 會造成問題;不過摘要內文沒有進一步說明原因、案例或解法,只標示需前往 Stackademic 繼續閱讀。