iT邦幫忙

鐵人檔案

2026 iThome 鐵人賽
回列表
Software Development

從 Fragment 到 Compose — 老 Android App 重寫的架構取捨 系列

一個維護了九年的 Android 外勤 App:Java 與 Kotlin 各半、一個一萬兩千行的 Activity、沒有 DI、沒有測試。這個系列記錄我用 Jetpack Compose 多模組架構把它重寫的 30 天:每天一個真實的架構決定,寫下選項、代價與理由,並附上去識別化的程式碼。主題涵蓋 DI、狀態管理、導航、藍牙硬體抽象、離線上傳佇列,以及可跨產品覆用的 core 模組設計。

參賽天數 25 天 | 共 25 篇文章 | 1 人訂閱 訂閱系列文 RSS系列文
DAY 1

Day 01|為什麼重寫:一個一萬兩千行 Activity 的診斷書

這個只供內部人員用的老產品,我最印象深刻的是, 它的底部導航列按鈕的業務邏輯,要靠 MainActivity 的 f instanceof DoSomeTh...

2026-09-15 ‧ 由 Jim 分享
DAY 2

Day 02|目標架構總覽:分層、模組圖、依賴方向

今天的取捨問題 昨天決定另開 repo 重寫。第一個要回答的問題不是「用什麼函式庫」,而是:程式碼要怎麼切,才能同時滿足三件事? 30 天內要交出能在真實硬體...

2026-09-16 ‧ 由 Jim 分享
DAY 3

Day 03|建置骨架:多模組、version catalog、convention plugin,以及 secrets 為什麼不能再進 git

今天的取捨問題 三件事同時要解: 多模組的設定重複。每個 Android library 模組都要設 compileSdk、minSdk、Java 版本、f...

2026-09-17 ‧ 由 Jim 分享
DAY 4

Day 04|DI 取捨:從 ServiceLocator 與 17 分支的工廠到 Hilt

程式碼片段 舊世界的 ServiceLocator:想做的兩件事都沒做到 ServiceLocator 是結合本地跟遠端兩個 data source, 形成 A...

2026-09-18 ‧ 由 Jim 分享
DAY 5

Day 05|網路邊界:後端信封與 `d: Any?` 的約束,`AppResult` 的誕生 | core:network |

先從"信封"兩字講起, ┌───────────────────────────┐│ Backend Envelope │...

2026-09-19 ‧ 由 Jim 分享
DAY 6

Day 06 | UiState / UiEvent / UiEffect:單向資料流但不背 MVI 的儀式

UiState:畫面「現在長什麼樣」 UiEvent:畫面「發生了什麼」 UiEffect:只需要發生一次的事情 老專案常常把導航或其他一次性事件寫成 Li...

2026-09-20 ‧ 由 Jim 分享
DAY 7

Day 07 | 導航:型別安全路由與 feature 的對外 API

動筆前的自問自答(兩題) 1.【決策邊界|架構論述】 本篇的規則是:feature 對外只暴露 NavGraphBuilder 擴充與 navigateToXx...

2026-09-21 ‧ 由 Jim 分享
DAY 8

Day 08|Design system:token、theme、元件的邊界

動筆前先答(兩題) 1.【模擬面試追問|UI 與版型】 面試官看到 internal val LocalSpacing = staticCompositionL...

2026-09-22 ‧ 由 Jim 分享
DAY 9

Day 09|測試基礎與架構守門:fake vs mock、Konsist

動筆前先答(兩題) 1.【決策邊界|測試與品質】 有一份能力要求清單寫著「覆蓋率 90%」。今天的做法是只產生 Kover 報告、不設門檻。你會在什麼條件下改成...

2026-09-23 ‧ 由 Jim 分享
DAY 10

Day 10|Session:從一個塞滿東西的 SharedPreferences 到 typed DataStore

動筆前先答(兩題) 1.【模擬面試追問|持久化與離線】 面試官:「你說 DataStore 同一個檔案在同一個 process 只能有一個實例,所以用 Hilt...

2026-09-24 ‧ 由 Jim 分享