iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
Software Development

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

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

  • 分享至 

  • xImage
  •  

今天的取捨問題

三件事同時要解:

  1. 多模組的設定重複。每個 Android library 模組都要設 compileSdkminSdk、Java 版本、flavor、JUnit 5、Compose 依賴。十幾個模組手寫等於十幾份會漂移的複本。
  2. Secrets 曾經進過 git。舊 repo 的建置腳本裡以字面值寫著雲端儲存的 access key/secret key(正式與測試各一組)、推播服務的 App ID;gradle.properties 裡有 keystore 密碼;四份 Firebase 設定檔與一張自簽 CA 憑證也在版本控制裡。這些不是「有人不小心」,而是建置流程本來就沒有給 secrets 一個不在 git 的家。
  3. 工具鏈跳了一個大版本。舊 repo 停在 AGP 8.1 / Kotlin 2.0;新 repo 直接用 AGP 9.4 / Kotlin 2.4 / Gradle 9.7。AGP 9 把 Kotlin 編譯內建進去了,舊的寫法會直接報錯。

選項與代價

選項 做法 優點 代價
A. 單模組 一個 app,靠 package 分層 零建置設定 昨天已經否決:邊界靠自律、公開範例要手挑、跨產品覆用等於複製
B. 多模組 + root 的 subprojects {} 在 root build script 用 subprojects { plugins.withId("com.android.library") { ... } } 統一設定 一個地方管 跨專案設定(cross-project configuration)與 configuration cache、project isolation 相衝;邏輯散在 root 腳本,難測試
C. 多模組 + convention plugins build-logic/ 是一個 included build,定義 xxx.android.library 這類 plugin,每個模組只寫一行 設定是型別安全的 Kotlin 程式碼;可以組合(feature = library + compose + hilt);Gradle 官方推薦 前期投資約一天;要懂 pluginManagement { includeBuild } 與 version catalog 在 included build 裡的存取方式
  • build-logic/:比較像「施工規範」。每個模組的建置檔寫一行「照 A 規範施工」,就套用那套規範。它只在 build 的時候用到,不會打包進 APK。
  • core:*:就是建築元件,會真的蓋進房子(APK)裡。
  • 照這個比喻延伸:feature:* 是一個個房間,app 是整棟房子。

為什麼選 C 方案而不選 B ?
因為 Gradle 官方建議的做法 convention plugin,是要替補 subprojects {} 一個專案的建置邏輯能直接修改其他專案的邏輯。

secrets 為什麼不能再進 git ?

  1. 會外洩出去。
  2. 事後刪掉金鑰也還會在舊的 commits 裡存在。
  3. Repo 是放程式碼的地方,不應該作為保管金鑰的倉庫。

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

尚未有邦友留言

立即登入留言