Daily Digest

每日新聞摘要

2026年03月15日

今日總結

內容會跟隨語言切換。

📝今日焦點:Tracy 可觀察性函式庫、jadx 反編譯實務、HiveMQ 範例、Compose 內建語言切換、追蹤與除錯指引皆受注目,並含 Kotlin Weekly 重點與生態更新。 🏗架構設計:採用單一資料抽象層以整合快取與遠端、減少深繼承並以組合取代,勿把所有業務邏輯塞入 ViewModel,Paging3 可採離線優先取代 RemoteMediator。 ✅測試與品質:強調例外區分與結構處理以提升穩定;本地 LLM 基準顯示小型模型在特定程式碼評估上可勝過更大模型。 🚀語言演進:androidx.room3 指向 Room 多平台化,基本概念如陣列仍為基礎學習,並暗示遷移與跨平台共用資料邏輯,Android LLM 排行影響工具選擇。

01

Decompiling class, DEX, JAR, and APK Files With jadx

Baeldung 作者:Marcin Buczkowski 發布:03-15 11:45

使用 jadx 反編譯 class、DEX、JAR 與 APK 檔案

本教學示範如何檢視 JAR 與 APK,並使用 jadx 對 class 與 DEX 檔案進行反編譯。

重點摘要

從原始碼建置 jadx,使用命令列或 GUI
將 .class 與 .jar 還原為套件結構與 Java 原始碼
檢視 APK,辨識開發者類別、R 類、合成/橋接方法與 classes.dex

本文教學說明如何使用 jadx 對 Java 與 Android 位元組碼進行反編譯,從 GitHub 取得原始碼、以 Gradle 建置並啟用 CLI 與 GUI。以簡單的 ExampleForJadx 範例示範將 .class 與 .jar 還原為套件結構與 Java 原始碼,並說明 try-with-resources 在還原後可能變成多重 try-catch 的差異。介紹 decompilation 模式(auto、restructure、simple、fallback),並以 HelloWorldSelfAware APK 示範辨識開發者類別、R 類、合成/橋接方法及 classes.dex。最後指出 jadx 還能產生 Gradle 專案、控制流程圖與協助除錯等附加功能。

02

Introduction to HiveMQ MQTT Client

Baeldung 作者:Martin Blažević 發布:03-15 11:50

HiveMQ MQTT Client 入門

HiveMQ MQTT Client 是支援 MQTT 3.1.1 與 MQTT 5 的現代 Java 函式庫,提供阻塞、非同步與反應式等多種 API 及 fluent builder 設定方式。

重點摘要

同時支援 MQTT 3.1.1 與 MQTT 5 並提供多種 API 風格
以非同步訂閱者與阻塞發布者示範實作流程
使用 CountDownLatch 與斷言在整合測試中驗證訊息傳遞

本文說明如何在 Java 專案中使用 HiveMQ MQTT Client:先加入 Maven 依賴,接著建立一個非同步客戶端處理訂閱與訊息回呼,與一個阻塞客戶端同步發布訊息。範例連接到公共 broker (broker.hivemq.com:1883),在非同步端註冊 publish 處理程序並訂閱主題,使用阻塞端發送負載,並透過 CountDownLatch 與斷言確認訂閱方已收到相同內容的訊息。最後示範斷開連線以釋放資源,並說明可依需求選擇阻塞、非同步或反應式 API,完整程式碼可在 GitHub 找到。

03

Kotlin Weekly #502

Kotlin Weekly 作者: 發布:03-15 08:01

Kotlin Weekly 第502期

JetBrains 推出 Tracy:一個以 OpenTelemetry 為基礎的 Kotlin AI 可觀察性函式庫,可在最少插裝下追蹤 LLM 資料、應用流程與工具呼叫。

重點摘要

JetBrains 發表 Tracy,為 Kotlin 提供 OpenTelemetry 的 AI 可觀察性方案
Google 推出 Android Bench LLM 排行(目前 Gemini 3.1 Pro 領先)
精選文章、影片與函式庫涵蓋 Compose、ViewModel 範圍化、monorepo 遷移與測試工具

Kotlin Weekly 第502期(2026年3月15日)報導 JetBrains 發表 Tracy:一個以 OpenTelemetry 為基礎的 Kotlin AI 可觀察性函式庫,可在最少量插裝下追蹤 LLM 資料、應用流程與工具呼叫。期刊也介紹 Google 的 Android Bench LLM 排行(Gemini 3.1 Pro 領先),並彙整多篇技術文章,包括 TestBalloon 樣式、強制 varargs 的技巧、開源 Jetpack Compose 健康儀表板、Rebound 編譯器外掛的重組預算檢測、Compose 中的 ViewModel 範圍化,以及 Cash App 將多個 JVM 倉庫整合為 monorepo 的實務經驗。另有影片、函式庫清單、贊助活動與投稿說明,並感謝 JetBrains 支持。

04

Kotlin Fundamentals Part 10 — Exception Handling — Try-Catch in Kotlin

Medium Kotlin 作者:Kishor Ramani 發布:03-15 09:13

Kotlin 基礎 第十篇 — 例外處理:Kotlin 的 Try-Catch

錯誤會發生——這裡說明如何在 Kotlin 中以 try-catch 優雅處理它們。

重點摘要

說明 Kotlin 的 try-catch 例外處理機制
著重捕捉與處理例外以維持程式穩定
強調優雅處理錯誤以提升應用健壯性

本文介紹 Kotlin 中的例外處理重點,核心為 try-catch 構造與其在處理執行期錯誤時的用途。文章說明捕捉例外的目的在於讓程式能夠面對意外情況時不致崩潰,並能以適當方式回應,從而維持應用穩定與良好使用者體驗。內容強調在設計程式時預期可能失敗的情況、區分可回復與不可回復的錯誤,並以結構化的處理策略提升程式的容錯能力與可靠性。整體提供了對 Kotlin 例外處理的扼要說明與實務考量。

05

Kotlin Fundamentals Part 11 — Kotlin Arrays — Your First Collection

Medium Kotlin 作者:Kishor Ramani 發布:03-15 09:13

Kotlin 基礎 第11篇 — Kotlin 陣列:你的第一個集合

陣列是所有程式語言的基礎 — 我們來掌握 Kotlin 中的陣列。

重點摘要

將陣列視為第一個且重要的集合型別。
本篇為 Kotlin 基礎系列的第11篇文章。
鼓勵讀者在 Medium 上繼續學習並熟悉 Kotlin 陣列。

本系列第11篇介紹陣列(Arrays)在 Kotlin 中的地位,強調陣列作為程式設計中最基礎的集合型別值得掌握。文章以教學引導為主,說明陣列在存放值序列時的核心角色,並提醒讀者這是學習集合與資料結構的起點。內容為導讀與動機說明,鼓勵讀者到 Medium 閱讀完整文章以深入學習 Kotlin 中陣列的使用與概念。

06

Repository Pattern in Android: Why It Still Matters

Medium Kotlin 作者:Rituraj Sambherao 發布:03-15 10:11

Android 的 Repository Pattern:為何仍然重要

現代 Android 應用很少只從單一來源取得資料。

重點摘要

提供集中且抽象化的資料存取介面
整合本地儲存、快取與遠端 API 等多重來源
提升可測試性、可維護性並降低層與層間耦合

在 Android 開發中,Repository Pattern 仍具重要性,因為現代應用通常從多個來源取得資料。Repository 提供單一抽象層,負責整合本地資料庫、快取與遠端 API 的存取、同步與快取策略,將資料存取邏輯與 UI、商業邏輯分離。這樣可提升可維護性、測試性與可替換性,建立單一真相來源並集中處理網路失敗或快取回退。即便框架與函式庫持續演進,採用 repository 層能減少重複、降低耦合,讓應用面對多變的資料來源時更有彈性。

07

The Inheritance Trap: How to Avoid Fragile Base Classes

Medium Kotlin 作者:Christian Hansen 發布:03-15 10:55

繼承陷阱:如何避免脆弱的基類

為何你深層的類別繼承階層會破壞應用程式,以及組合(Composition)如何挽救它。

重點摘要

深層繼承階層會使基類變得脆弱。
基類的變動常會連帶破壞子類。
以組合與委派取代實作繼承可降低耦合。

本文說明深層類別繼承如何造成脆弱的基類:當基類的實作改變時,可能會意外影響多個子類,導致程式變得難以維護與不穩定。作者主張應減少以繼承重用實作的做法,改以組合(Composition)與委派來構建功能,透過小而專一的元件與明確介面來組合行為。組合能降低隱藏依賴、局部化變更並改善可測試性。文章建議將繼承用於多型需求,而不是當作重用具體實作的主要手段,並透過重構朝向更小、更內聚的元件以提升系統穩定性與可維護性。

08

Android: Why Putting All Your Logic in the ViewModel Is Still Wrong

Medium Kotlin 作者:Mobile App Developer 發布:03-15 14:26

Android:為何把所有邏輯放在 ViewModel 仍然是錯誤的

將所有邏輯放入 ViewModel 仍是錯誤的做法。

重點摘要

輸入僅含標題、作者與 Medium 連結,未包含原文內容
標題顯示對把應用邏輯集中於 ViewModel 的批評立場
欲閱讀作者具體論述與範例,請點連結查看完整文章

本次輸入僅包含文章標題、作者與 Medium 連結,未提供原文內文,因此摘要僅根據可得的 Metadata 與標題意涵進行說明。標題「Android: Why Putting All Your Logic in the ViewModel Is Still Wrong」暗示作者批評將所有業務或應用邏輯塞入 ViewModel 的做法,推測討論面向可能包括責任分離、可測試性、使用 use-case/domain 層或 repository 等替代設計,但原文具體論點、範例與建議須以原文為準,建議點擊連結閱讀完整內容。

09

Kotlin (Sun)Day 3

Medium Kotlin 作者:Shalinibhatt 發布:03-15 14:28

Kotlin (Sun)Day 3

我很想陪母親去拜訪姑姑,但最後還是以優先事項為重。

重點摘要

作者的 Kotlin 系列第 3 天記錄
情感上想陪母親去姑姑家
選擇以既定優先事項為重並引導讀者到 Medium 閱讀全文

這篇短文是作者 Kotlin 學習系列的第 3 天記錄,內容以個人心情更新為主,並非技術詳述。作者提到當天情感上很想陪母親去姑姑家,但因為其他優先事項必須處理,產生了家庭情感與既定計畫之間的拉扯。文章以生活片段呈現學習過程,強調在追求學習的同時也會面臨現實責任與選擇,並引導讀者至 Medium 閱讀完整內容與後續細節。

10

How to Dynamically Change App Language in Jetpack Compose (Modern Android Guide)

Medium Kotlin 作者:Anurag Kanojiya 發布:03-14 23:20

在 Jetpack Compose 中動態變更應用語言(現代 Android 指南)

許多現代應用允許使用者直接在 App 內選擇偏好語言,而不是僅依賴裝置設定。

重點摘要

在 App 內提供語言選擇而非仰賴系統語言
程式化變更 Locale 並讓 Compose 重新組合更新字串
儲存使用者偏好並在重啟後還原語言設定

本文介紹在 Jetpack Compose 中實作應用內語言切換的作法。文章說明為何要在 App 提供語言選項,以及如何以程式方式變更 Locale、讓 Compose 根據狀態重新組合以顯示更新後的字串資源,並透過更新的 Context 或設定套用新語言與儲存使用者偏好以便重啟後復原。內容著重於維持順暢的使用者體驗、盡量減少不必要的重啟,並提供可整合於應用架構與生命週期的實務建議,適合已有 Compose 基礎的開發者參考。

11

RoomDB 3.0: The End of the “Android-First” Era

Medium Kotlin 作者:Ryan W 發布:03-15 00:01

RoomDB 3.0:"Android 優先" 時代的終結

新引入的 androidx.room3 命名空間標誌著對 Kotlin Multiplatform 開發者的全面革命

重點摘要

RoomDB 3.0 帶來 androidx.room3 命名空間
代表從 Android 優先設計轉向跨平台導向
對 Kotlin Multiplatform 開發者帶來關鍵影響

作者指出,RoomDB 3.0 所引入的 androidx.room3 命名空間象徵著從「Android 優先」設計到跨平台導向的重大轉變。這個命名空間暗示維護者正將 Room 打造成更平台中立的資料層,為 Kotlin Multiplatform 開發者提供統一的儲存方案。此變化可能讓 JVM、Android 與其他 Kotlin 平台間更容易共用資料庫邏輯,減少 Android 特有的 API 假設,同時為跨平台架構帶來一致性與彈性。對現有 Android 專案來說,則可能需要遷移或調整。整體而言,androidx.room3 不只是名稱改動,而是一項指向 Room 在多平台生態中新角色的戰略信號。

12

Can an LLM read a distributed trace?

Medium Kotlin 作者:Mario Gimenez 發布:03-15 02:03

LLM 能讀懂分散式追蹤嗎?

以六角形架構、Grafana Tempo、Gemini 與 Ollama 建構 LLM 驅動的根因分析代理──以及從中學到的所有教訓。

重點摘要

建構以 LLM 為核心的根因分析代理。
採用六角形(Hexagonal)架構並整合 Grafana Tempo 進行追蹤觀察。
使用 Gemini 與 Ollama 作為模型後端,並分享實作教訓與限制。

本文探討大型語言模型是否能解讀分散式追蹤,作者說明如何建立一個以 LLM 為核心的根因分析代理。專案採用六角形架構,結合 Grafana Tempo 做追蹤收集與觀察,並使用 Gemini 與 Ollama 作為模型後端。文章強調設計選擇與整合步驟,分享實作過程中的經驗、遇到的問題與學到的教訓,並概述整合過程中的限制與可能陷阱,作為將追蹤資料導入語言模型以協助診斷分散式系統問題的實務案例與反思。

13

I Built an Offline-First Android Without RemoteMediator

Medium Kotlin 作者:Yudistiro Septian Dwi Saputro 發布:03-15 04:15

我在沒有 RemoteMediator 的情況下打造了離線優先的 Android

我在依循 Paging 3 文件建立新聞閱讀器時遇到瓶頸;RemoteMediator 原本被視為解法。

重點摘要

以 Paging 3 建置新聞閱讀器應用
依文件實作時在 RemoteMediator 上遇到問題
改以離線優先架構,不使用 RemoteMediator

作者描述在使用 Android Paging 3 建置新聞閱讀器時遇到的瓶頸:雖然文件把 RemoteMediator 當作在本地快取與網路間協調的標準做法,但對作者的需求來說存在限制。因此作者選擇不依賴 RemoteMediator,而以離線優先的方式設計,使資料在沒有持續網路時仍可使用。文章說明所面臨的挑戰、迴避 RemoteMediator 的理由,以及為了支援快取、分頁與同步所採取的替代模式與權衡。透過實務說明與範例,提供讀者在選擇是否使用 RemoteMediator 或採用其他離線優先策略時的參考。

14

I Ran Kotlin HumanEval on 11 Local LLMs. An 8GB Model Beat Several 30B Models

Medium Kotlin 作者:Aldo Wachyudi 發布:03-15 04:36

我在 11 個本地 LLM 上跑了 Kotlin HumanEval:一個 8GB 模型打敗多個 30B 模型

在 11 個本地模型的 Kotlin HumanEval 測試中,一個 8GB 模型的表現超越了數個 30B 參數的模型。

重點摘要

在 JetBrains 的 Kotlin HumanEval 上測試 11 個本地/開源模型
一個 8GB 模型勝過數個 30B 參數級別的模型
作者先前測試五個模型,GPT-OSS 20B 當時大幅領先

作者在 JetBrains 的 Kotlin HumanEval 基準上測評了 11 個本地/開源大型語言模型,結果顯示一款只有 8GB 的模型竟然超越了數個約 30B 參數的模型。文章同時提到作者先前針對五個模型的測試,當時 GPT-OSS 20B 明顯領先。這些結果挑戰了參數量與性能直接相關的簡化觀點,說明在代碼生成與評估任務中,更小或更輕量的模型在特定情況下也可能勝過更大的模型,對在本地部署和選擇模型時的效率與成本考量具有啟示。