iT邦幫忙

2026 iThome 鐵人賽

DAY 1
0
Software Development

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

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

  • 分享至 

  • xImage
  •  

這個只供內部人員用的老產品,我最印象深刻的是,

  1. 它的底部導航列按鈕的業務邏輯,要靠 MainActivity 的
f instanceof DoSomeThingFragment

的 if - else 條件來逐個頁面實例去比對套用。

  1. 它的 Activity 兼當 repository 使用。它把 API 回應的 Callback 邏輯也寫在這裡。

以及其他族繁不及備載的特色。

在維護這個產品,只能受限於這一大包的技術債及架構上來增添功能及修復錯誤。

為了能讓外勤同事們能享有比照 iOS 產品的滑順體驗,我想藉由 AI 工具的輔助,搭配人為決策的軟體架構,來建立一個現代 Android 開發框架的產品。

在專案片段去識別化、抽象化,及使用假領域之後,預計於參賽 10 多天後提供公開的程式碼以供檢閱指教。

30 天路線圖

Day 標題(暫定) 對應程式碼
01 為什麼重寫:一個一萬兩千行 Activity 的診斷書
02 目標架構總覽:分層、模組圖、依賴方向
03 建置骨架:多模組、version catalog、convention plugins、secrets 不進 git build-logic、app
04 DI 取捨:ServiceLocator 到 Hilt core:common
05 網路邊界:後端信封與 d: Any? 的約束,AppResult 的誕生 core:network
06 UiState / UiEvent / UiEffect:單向資料流但不背 MVI 的儀式 core:ui
07 導航:型別安全路由與 feature 的對外 API app NavHost
08 Design system:token、theme、元件的邊界 core:designsystem
09 測試基礎與架構守門:fake vs mock、Konsist core:testing
10 Session:40 個 static key 到 DataStore core:datastore、data
11 登入畫面:第一個完整的 UiState 實作 feature:login
12 公開架構模板:抽出 core 與一個假領域 feature 公開 repo
13 多型 JSON:Moshi adapter factory 與 sealed model data
14 拆一個 1,700 行的 ViewModel:combine 取代屏障 feature:tasks
15 拖曳排序:樂觀更新與回滾 feature:tasks
16 Use case 層要不要:何時值得 domain
17 硬體抽象:把 BLE 掃描包成 Flow core:scale
18 裝置鎖定與穩定讀值:狀態機與去抖 feature:weighing
19 硬體與生命週期:掃描綁 Compose lifecycle、權限流程 feature:weighing
20 CameraX 在 Compose:AndroidView 逃生門原則 core:media
21 離線佇列:Room + WorkManager core:database、core:upload
22 上傳策略:可插拔目標、重試與進度 core:upload
23 端到端:拍照 → 佇列 → 上傳 → UI feature:capture
24 13 個掃描 Activity 收斂成 1 個 core:scanner
25 導航回傳結果:SavedStateHandle 與共享 ViewModel 的取捨 feature:scanner
26 地圖與叢集:兩個「就緒」的競態 feature:map
27 前景定位服務與 Compose 的溝通 core:location
28 雙方握手的狀態機 feature:transfer
29 回顧:模組依賴圖、指標、沒做到的事
30 下一步:剩餘畫面的遷移策略

下一篇
Day 02|目標架構總覽:分層、模組圖、依賴方向
系列文
從 Fragment 到 Compose — 老 Android App 重寫的架構取捨5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言