Daily Digest

每日新聞摘要

2026年10月12日

今日總結

內容會跟隨語言切換。

📝 今日焦點 - Spring Boot 結合 TBEG 可一鍵產生 Excel 下載、串流與非同步報表,並支援 JPA Stream 與測試,但使用 Stream 時需維持交易直到輸出完成。 - Kotlin Multiplatform 可循序導入,無須重寫整個 App、共用 UI 或先改變 iOS 流程,讓團隊先從單一模組開始。 - KMP Flow bridge 與付款流程都提醒:跨界整合必須主動取消舊 Job、驗證真實狀態,否則容易留下幽靈訂閱或殘留 collector。 🔧 效能最佳化 - Android 裝置端 AI 需監看熱餘裕,及早降載、切換輕量模型或降低推論頻率,並在舊中階機上做長時間測試。 - Release 崩潰多半與 R8、keep rules 和反射相關;要在縮小體積時守住必要類別與方法,避免 debug 正常、正式版失效。 🏗 架構設計 - Room 3、ISP、MVP 轉 MVVM 與 Compose 狀態消失都在提醒:升級前先評估 DAO 影響、介面邊界與狀態驅動重組成本。 ✅ 測試與品質 - 付款、Webhook、ANR 追查與 AlphaKids 實測都顯示,測試環境不足以代表真實世界,必須做真機、真金流與量測驗證。 🚀 語言演進 - Kotlin data class、StackTraceRecoverable、Companion object extensions 與 blocks,持續強化不可變建模、例外追蹤與語法表達力。

01

Building an Excel download API with TBEG and Spring Boot (Kotlin/Java)

Dev.to Kotlin 作者:Yongho Hwang 發布:10-12 07:24

使用 TBEG 與 Spring Boot(Kotlin/Java)建立 Excel 下載 API

只要加入一個相依套件,就會自動註冊 ExcelGenerator,能直接從 controller 輸出 Excel 檔案。

重點摘要

加入 tbeg 後會自動啟用 Auto-Configuration 並註冊 ExcelGenerator。
示範 generate()、generateToFile()、generateToStream() 與 submitToFile() 等模式。
使用 JPA Stream 時必須搭配 @Transactional,避免串流在生成完成前關閉。
展開詳細摘要

本文說明如何在 Spring Boot 中結合 TBEG 建立 Excel 下載 API,只需加入單一依賴即可自動取得 ExcelGenerator,且 application.yml 的 tbeg.* 設定會自動綁定,無需額外宣告 @Bean 或 @EnableXxx。文章接著示範服務層以 generate()、generateToFile() 產生報表,控制器以 ResponseEntity<Resource> 下載檔案,並以 generateToStream() 搭配 StreamingResponseBody 進行串流輸出;另外也介紹 submitToFile() 的非同步生成與 ExcelGenerationListener 回呼。最後補充 JPA Stream 整合與測試方式,並提醒使用 Stream 時必須保留交易作用中直到生成完成。

02

From C# Backend to Android: Why My First Mobile App in Kotlin Clicked

Dev.to Kotlin 作者:Spyros Ponaris 發布:10-12 08:13

從 C# 後端到 Android:我第一個 Kotlin 行動應用為何一拍即合

對 C# 開發者而言,Kotlin 帶來熟悉的模式、俐落的工具與立刻可見的成果。

重點摘要

Kotlin 內建空值安全,概念上類似 C# 的 nullable reference types,可降低 NullPointerException 風險。
coroutines 對熟悉 async/await 與 channels 的開發者很直覺,也讓非阻塞工作更有結構。
data class、extension function 與 Jetpack Compose 分別提升簡潔度與原生 Android UI 開發效率。
展開詳細摘要

作者以 C# 後端與企業開發背景切入原生 Android,分享第一次用 Kotlin 開發行動應用的體驗。文中整理出五項對 C# 開發者特別有感的優點:內建空值安全、與 async/await 和 channels 思維相近的 coroutines、可大幅簡化程式碼的 data class、extension function,以及搭配 Jetpack Compose 的宣告式 UI。文章也列出 .NET 開發者值得收藏的官方文件。核心結論是,Kotlin 能把後端工程習慣順暢帶到行動開發,讓轉換過程自然且高效。

03

Why Stripe Test Mode Lies: A Solo Dev's 36-Hour Payment Infrastructure Trench Warfare

Dev.to Kotlin 作者:Epic Devs 發布:10-12 09:16

為什麼 Stripe 測試模式會騙人:一位獨立開發者 36 小時的金流基礎設施苦戰

如果你正準備替產品接上付款,以下是我學到的 3 個殘酷教訓,希望你不必重蹈覆轍。

重點摘要

測試模式可能掩蓋真實環境中的失敗與空白 API key。
Webhook 可能重試且順序錯亂,讓已取消訂閱被復活。
付款頁若 UI 狀態與非同步回呼處理不當,可能把使用者卡住。
展開詳細摘要

作者是一位同時身兼專案經理的獨立開發者,為 Kotlin Multiplatform 筆記 App EpicNotes 同時接入 Stripe 與 RevenueCat,卻花了 36 小時排查付款流程。測試環境掩蓋了 Android 端空白 API key 等問題,直到真實刷卡才曝光。文章提醒,Webhook 可能重試且先後順序顛倒,若直接相信 payload,可能把已取消訂閱錯誤恢復成 Pro 使用者。作者也分享 Mac 端付款頁的關閉按鈕 bug,說明金流與 UI 都需要真實測試與直接驗證。

04

Compose’ta Bir if Kapanınca Ekran Nereye Gidiyor? Kaybolan State’in Anatomisi

Medium Kotlin 作者:Bahadireray 發布:10-12 08:16

在 Compose 中,if 區塊關閉後畫面跑去哪裡了?遺失 State 的剖析

想像你有一個篩選畫面:使用者搜尋商品、挑選幾個篩選條件,然後往下捲動……

重點摘要

以篩選畫面情境引出問題。
使用者搜尋商品、選擇篩選條件並向下捲動。
文章聚焦於 if 區塊關閉後,畫面與 state 會發生什麼事。
展開詳細摘要

文章從 Compose 的篩選畫面切入:使用者先搜尋商品、套用幾個篩選條件,再向下捲動。作者藉此提出一個核心問題:當 if 區塊關閉時,畫面與狀態會發生什麼變化。內容聚焦於 Compose 中「消失的 state」如何形成,並鋪陳為何在組合分支被移除後,UI 狀態看起來會像是遺失。

05

The ANR Illusion: How to Stop Chasing Ghosts and Fix Thread Starvation

Medium Kotlin 作者:Porter 發布:10-12 10:42

ANR 的幻象:如何停止追逐虛影並解決執行緒飢餓

作者:Mohammed Nishar

重點摘要

目前提供的內容只有文章資訊,沒有正文。
標題指向 ANR 與執行緒飢餓問題。
截錄內容未提供可供摘要的實質技術細節。
展開詳細摘要

目前提供的內容只有文章標題與作者資訊,正文幾乎空白,因此無法根據原文整理出具體論點或做法。從標題可知,文章主題是 ANR 與執行緒飢餓,並試圖說明如何停止追逐錯誤線索,但截錄內容沒有提供任何例子、分析或結論。基於這段資料,只能確認文章主題,不能補充未出現的技術細節。

06

Daily Kotlin: Data Classes, Destructuring, and copy()

Medium Kotlin 作者:Jason Kwon 發布:10-12 12:18

Daily Kotlin:Data Classes、Destructuring 與 copy()

掌握不可變狀態建模、自動產生的輔助方法,以及在 Kotlin Multiplatform 中乾淨的元件擷取。

重點摘要

聚焦 Kotlin data classes 與不可變狀態建模
介紹 destructuring 以乾淨地擷取元件
說明 copy() 在 data class 流程中的用途
展開詳細摘要

本文聚焦 Kotlin data classes 在不可變狀態建模中的應用,並說明如何透過 destructuring 乾淨地擷取元件,以及利用 copy() 建立更新後的實例。內文也提到這些特性可跨 Kotlin Multiplatform 使用,作為撰寫更精簡 Kotlin 程式碼的實用工具。由於原文內容較短,重點在於 data classes 帶來的自動輔助能力與簡潔的元件存取方式。

07

Room 3.0 Just Broke Your DAOs

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

Room 3.0 直接弄壞了你的 DAO

Room 3 變了什麼、你得付出什麼代價,以及你的 Android 應用程式該現在遷移還是再等等。

重點摘要

說明 Room 3.0 的變更內容
討論升級 DAO 可能帶來的成本
協助判斷是否要立即遷移
展開詳細摘要

這篇文章聚焦 Room 3.0 的變更,以及這些調整對既有 DAO 會帶來什麼影響。內容主要圍繞三個實務問題:Room 3 改了哪些地方、升級可能付出哪些代價,以及 Android 應用程式現在是否該遷移或先觀望。文章屬於協助開發者評估升級時機的導讀,而非完整技術文件。

08

Your Coroutine Crash Finally Tells You Who Rethrew It

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

你的 Coroutine 崩潰終於會告訴你是誰重新拋出了它

Kotlin 2.4.20 的 StackTraceRecoverable 修正了自訂例外在跨越 coroutine 時會遺失追蹤資訊的問題。

重點摘要

說明 Kotlin 2.4.20 的一項修正
處理自訂例外在跨 coroutine 時遺失堆疊追蹤的問題
透過 StackTraceRecoverable 保留例外追蹤脈絡
展開詳細摘要

Kotlin 2.4.20 的 StackTraceRecoverable 修正了自訂例外在跨越 coroutine 邊界時可能遺失追蹤脈絡的問題。文章重點在於,當 crash 被重新拋出後,現在能更清楚指出相關來源,讓除錯資訊不會在 coroutine 之間斷裂。內文只描述這項針對例外追蹤的修正,未宣稱其他範圍的變更。

09

The corpus your generator reads is production code

Medium Kotlin 作者:Rajan Maurya 發布:10-12 12:35

你的生成器所讀取的語料就是正式環境程式碼

請繼續在 MobileByteSensei 閱讀 »

重點摘要

提供的內容只有標題、作者與外部連結提示。
內文未附上實質文章內容,無法延伸摘要。
僅能確認文章聚焦於生成器輸入與正式環境程式碼的關係。
展開詳細摘要

目前提供的只有文章標題、作者、連結,以及一段引導讀者前往 MobileByteSensei 繼續閱讀的提示,沒有實際內文可供整理。因此無法在不臆測的前提下做出完整摘要。就可確認的資訊而言,標題指出主題是「生成器所讀取的語料就是正式環境程式碼」,暗示作者在談論生成器輸入或訓練資料在生產情境中的定位;其餘內容無法從原文片段推得。

10

Kotlin Multiplatform, Incrementally

Medium Kotlin 作者:Ramadan Sayed 發布:10-12 13:01

逐步導入 Kotlin Multiplatform

KMP 可以從單一模組開始,逐步採用……

重點摘要

不必重寫整個應用程式
不必共用 UI
KMP 可按模組逐步導入
展開詳細摘要

本文主張 Kotlin Multiplatform 不需要一次到位的全面改寫,而是可以循序漸進導入。作者指出,團隊不必重寫整個應用程式,也不必共享 UI,更不需要先說服 iOS 團隊改變做法。KMP 可以從單一模組開始,讓工程團隊依照既有程式碼與流程,逐步推進採用。

11

R8 and Keep Rules in Production: Shrinking a 600-Module App Without Breaking Reflection

Medium Kotlin 作者:Ramadan Sayed 發布:10-12 13:01

生產環境中的 R8 與 Keep Rules:在不破壞反射的情況下縮小一個 600 模組應用程式

「在 debug 可運作、但在 release 會當掉」是 Android 最令人困惑的錯誤之一,因為程式碼其實一模一樣。

重點摘要

即使原始碼相同,debug 與 release 的行為也可能不同。
R8 與 keep rules 是安全縮小 Android 應用程式的關鍵。
依賴反射的程式碼在正式版建置中特別容易出問題。
展開詳細摘要

這篇文章指出一個經典的 Android 問題:同樣的程式碼在 debug 能執行,到了 release 卻會崩潰。作者將原因指向生產環境的壓縮與混淆流程,特別是 R8 與 keep rules 如何決定哪些類別、方法或成員會被保留。標題提到一個 600 模組的大型應用程式,重點在於如何在縮小 App 體積的同時,不破壞依賴反射的程式碼。雖然節錄內容沒有提供具體做法,但已明確傳達:正確理解並控制 keep rules,對釋出最佳化版非常重要。

12

Interface Segregation Principle (ISP) in Android — Small, Focused Interfaces

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

Android 中的介面隔離原則(ISP)——小而聚焦的介面

不要強迫一個類別實作它不需要的函式。

重點摘要

說明介面隔離原則。
強調介面應該小而聚焦。
避免強迫類別實作不需要的函式。
展開詳細摘要

本文介紹 Android 開發中的介面隔離原則(ISP),核心觀念很直接:不要強迫一個類別去實作它不需要的函式。標題點出「小而聚焦的介面」這個方向,但目前提供的內容只有這一句原則性說明,沒有延伸到實作細節或進一步案例。

13

We’re building with Kotlin Multiplatform: what we measured comparing AlphaKids in KMP and in…

Medium Kotlin 作者:Benjamin Pareja 發布:10-12 14:59

以 Kotlin Multiplatform 開發:我們比較 AlphaKids 在 KMP 與原生實作時測量了什麼

一款兒童閱讀 app、兩種實作、同一支手機、一天的測量。

重點摘要

比較 AlphaKids 的 KMP 與原生實作
測量記憶體、建置時間、應用程式大小與啟動速度
以一支手機、一天的測試為基礎
展開詳細摘要

這篇文章說明如何將兒童閱讀 app AlphaKids 以 Kotlin Multiplatform 與原生程式碼兩種方式實作,並在同一支手機上進行為期一天的量測比較。作者聚焦於實務指標,包括記憶體使用、建置時間、應用程式大小與啟動表現,強調這是一篇以量測為基礎的觀察,而非純理論討論。由於摘要未提供實際數據與結論,文章重點應理解為「測了哪些項目」,而不是哪一種方案較優。

14

Your AI agent works great. Then the phone gets warm. Then it doesn’t.

Dev.to Kotlin 作者:StareBrain 發布:10-12 03:48

你的 AI 代理表現很好,直到手機變熱,然後就不行了

裝置端 AI 的熱節流往往要到真實使用幾分鐘後才會浮現。

重點摘要

持續推論會讓裝置發熱,進而觸發 CPU/GPU 降頻。
可用 PowerManager.getThermalHeadroom() 預先監看熱餘裕。
應主動降載:切換較輕模型、降低推論頻率或略過非關鍵呼叫。
展開詳細摘要

裝置端 AI 代理在測試時可能一切正常,但實際連續使用幾分鐘後,裝置升溫、CPU 降頻,延遲便會明顯上升,問題看起來像是模型失效,其實多半是熱節流。文章建議在 Android 上使用 PowerManager.getThermalHeadroom() 預先判斷熱餘裕,不要等系統先限制效能才反應。當餘裕下降時,可切換較輕量模型、降低推論頻率,或暫緩非必要呼叫。作者也指出,模擬器與新款旗艦機未必能重現此問題,必須在較舊的中階裝置上進行長時間測試,並可借助 Firebase Test Lab 找出受影響機型。

15

iOS Keeps Observing a Dead Kotlin Flow — the CommonFlow Leak Hiding in Your KMP Bridge

Dev.to Kotlin 作者:YADNYESH RANA 發布:10-12 03:52

iOS 持續觀察一個已失效的 Kotlin Flow:藏在 KMP Bridge 裡的 CommonFlow 洩漏

真正的 bug 是離開時從未呼叫 cancel()。

重點摘要

重複呼叫 observe() 會疊出多個仍在運作的 collector
[weak self] 只能避免 view model 被 closure 保留,無法取消孤兒 Job
在重新訂閱前先取消,Kotlin 端也可主動防守
展開詳細摘要

本文指出 KMP 的 Flow bridge 容易出現生命週期問題:Swift 端每次重新呼叫 observe(),若只覆蓋掉原本的 cancellation,而沒有先 cancel 舊的 Job,就會留下仍在運作的 collector。這些舊 collector 可能繼續送值到過時的 closure,造成畫面更新異常或資源持續佔用。[weak self] 只能避免 view model 被 closure 強持有,卻無法終止那個被遺棄的 coroutine。作者建議在 Swift 端於重新訂閱前先取消,並在 Kotlin 包裝層主動取消同一個 wrapper 上既有的 Job,讓雙重 watch() 不會默默疊出多個活躍 collector。

16

Dhvani Music — Modern Open Source Android Music Player (YouTube Music + Lossless Audio)

Dev.to Kotlin 作者:Kanaiya Soni 發布:10-12 04:49

Dhvani Music——結合 YouTube Music 與無損音訊的現代開源 Android 音樂播放器

Dhvani 的核心概念,是把無廣告的 YouTube Music 串流、較高音質的來源,以及內建音訊工具整合在一起。

重點摘要

無廣告的 YouTube Music 播放
雙來源串流並支援即時切換音質
內建等化器、鈴聲剪輯、歌詞與 Android Auto 功能
展開詳細摘要

Dhvani Music 是一款以 Kotlin、Jetpack Compose 和 AndroidX Media3 開發的開源 Android 音樂播放器。它的設計重點是把無廣告的 YouTube Music 播放與較高音質來源(例如 JioSaavn)結合,同時提供多種內建音訊工具。功能包含雙來源串流與即時音質切換、10 段圖形等化器、重低音增強、Dolby Atmos 整合、鈴聲剪輯器、替代版本搜尋、同步歌詞、離線播放與下載並嵌入完整中繼資料,以及 Android Auto、Listen Together 房間與 Discord Rich Presence。專案完全免費、沒有追蹤器,並採用 GNU GPL v3 授權。

17

Android Development Challenges in 2026: Android 17, Adaptive UI, AI, Security & Play Policy

Dev.to Kotlin 作者:Padmakar Garg 發布:10-12 06:39

2026 年 Android 開發挑戰:Android 17、適應式 UI、AI、安全性與 Play 政策

2026 年最大的 Android 開發挑戰,不是單一 API,而是跨平台變動的整體管理。

重點摘要

Android 17 會帶來行為變更與大螢幕適配需求,升版前必須先確認最新 SDK 與更新說明。
適應式 UI 已成基本要求,需同時面對手機、平板、摺疊機與可調整大小的桌面視窗。
隱私與安全、背景工作、AI 整合、效能、裝置碎片化與 Play API 規範都需要持續處理。
展開詳細摘要

2026 年的 Android 開發不再只是完成畫面與 API 串接。應用程式必須因應 Android 17 的行為變更、大螢幕與可調整視窗、Google Play 的目標 API 規範、更加嚴格的隱私與安全要求、背景執行限制,以及具備實際失敗模式的 AI 功能。文章建議先在現行 SDK 上測試、將平台相依程式碼集中管理、使用響應式 Compose 版面、盡量減少權限、選對背景工作 API、驗證 AI 輸出,並以真實工作負載做效能分析。裝置碎片化、發布流程與分階段釋出也同樣重要。

18

Codex and Opus Took the Same Android Take-Home Test. I Reviewed Both.

Medium Kotlin 作者:Yudistiro Septian Dwi Saputro 發布:10-12 02:01

Codex 和 Opus 參加了同一份 Android 居家測驗。我評測了兩者。

大約在 2018 年,我最後一次提交給 Dicoding 的 Android 作業是一個 Movie DB app。

重點摘要

作者回顧了 2018 年左右的 Dicoding Android 提交。
文章標題顯示內容是比較 Codex 與 Opus 在同一份 take-home test 的表現。
目前提供的內文只提到那個作品是 Movie DB app。
展開詳細摘要

這段摘錄只是 Stackademic 長文的開頭。內文提到,作者在 2018 年左右最後一次提交 Dicoding Android 作業時,做的是一個 Movie DB app,而這個作品也在之後幾年持續被提起。標題則顯示全文會比較 Codex 和 Opus 在同一份 Android take-home test 上的表現,但目前提供的內容沒有包含實際評測細節或結果。就這段文字而言,重點只是作者早期的 Android 作品,以及它如何成為後續比較的起點。

19

Kotlin Companion Extensions and Blocks

Medium Kotlin 作者:Ralf Stuckert 發布:10-12 04:59

Kotlin Companion Extensions and Blocks

在 Kotlin 2.5.0 中,KEEP-0449 引入了兩項新的實驗性功能。

重點摘要

Companion object 自 Kotlin 1.0 起就作為靜態成員的替代方案。
Kotlin 2.5.0 帶來 KEEP-0449。
本文只提到兩項新的實驗性功能,未在摘錄中展開細節。
展開詳細摘要

Companion object 自 Kotlin 1.0 起一直是靜態成員的替代方案。這篇文章指出,Kotlin 2.5.0 透過 KEEP-0449 引入了與 companion extensions 和 blocks 相關的兩項新的實驗性功能。摘錄未進一步說明功能細節,但已清楚表明它們仍屬實驗性新增,而非穩定、正式支援的 API。

20

Why Changing One Boolean Re-renders Your Entire Screen

Medium Kotlin 作者:Reinaldo Riant 發布:10-12 05:21

為什麼改動一個布林值會讓整個畫面重新繪製

過去幾個月,我的團隊一直在把專案從 MVP 遷移到 MVVM。

重點摘要

團隊正在從 MVP 遷移到 MVVM。
他們依循 Google 的官方應用程式架構指南。
文章延伸探討單一狀態變更對畫面重新繪製的影響。
展開詳細摘要

過去幾個月,作者的團隊一直依照 Google 官方應用程式架構指南,將 Android 專案從 MVP 遷移到 MVVM。文章以此為背景,帶出一個常見的渲染問題:當某個布林狀態改變時,為何整個畫面可能重新繪製。依現有摘要可知,重點在於遷移過程與狀態驅動 UI 更新所帶來的架構影響。