一個使用 Jetpack Compose 和 TMDB API 打造的現代化 Android 電影資訊 App。此專案展示了最新的 Android 開發實踐,包含多模組架構、Clean Architecture、以及 Jetpack 生態系中的各種元件。
此文章詳細說明了本專案的多模組架構設計思路、實作細節以及最佳實踐,是理解專案架構的最佳參考資料。
🎥 功能展示: YouTube Demo
快速預覽 App 的核心功能和使用者介面,包含電影瀏覽、搜尋、詳情查看等主要特色。
- 電影探索: 瀏覽熱門、即將上映、和高評分的電影。
- 電影搜尋: 透過關鍵字即時搜尋電影。
- 詳細資訊: 查看電影的詳細介紹、預告片、評分和演員陣容。
- 個人收藏: 將喜歡的電影加入收藏清單以便日後查看。
- 主題切換: 支援深色與淺色主題模式。
- 語言切換: 支援英文與繁體中文。
| 首頁 | 電影詳情 |
|---|---|
![]() |
![]() |
| 搜尋 | 收藏清單 |
|---|---|
![]() |
![]() |
| 首頁 | 電影詳情 |
|---|---|
![]() |
![]() |
| 搜尋 | 收藏清單 |
|---|---|
![]() |
![]() |
| 設定頁 | 觀看歷史 | 主題切換 |
|---|---|---|
![]() |
![]() |
![]() |
- UI: Jetpack Compose - 用於建構原生 UI 的現代化工具包。
- 語言: Kotlin - 主要開發語言。
- 非同步處理: Coroutines & Flow - 用於處理非同步任務和資料流。
- 架構:
- 多模組 (Multi-module) 架構
- Clean Architecture (分層式架構)
- MVVM (Model-View-ViewModel)
- 依賴注入: Hilt - 簡化 Android 的依賴注入。
- 網路請求: Retrofit & OkHttp - 強大且高效的 HTTP 客戶端。
- 資料庫: Room - 在本地持久化儲存資料。
- 分頁載入: Paging 3 - 漸進式地從遠端或本地載入資料。
- 資料儲存: Proto DataStore - 安全且高效地儲存鍵值對或型別物件。
- 圖片載入: Coil - 基於 Kotlin Coroutines 的圖片載入庫。
本專案採用了現代化的多模組 (Multi-module) 架構,將程式碼按照功能和分層進行隔離,以達到高內聚、低耦合的目標。整體架構遵循 Clean Architecture 的原則,分為三個主要層次:feature、core 和 app。
app層: 負責整合所有模組,建立依賴注入圖,並作為應用程式的進入點。feature層: 包含所有獨立的功能模組 (如首頁、搜尋、電影詳情等)。每個feature模組都擁有自己的 UI 和 ViewModel,並透過domain層與資料層互動。core層: 提供了所有feature模組共享的基礎建設和業務邏輯。它進一步細分為:ui: 共享的 Compose 元件。domain: 包含 UseCases 和業務邏輯。data: 資料儲存庫 (Repository) 的實作,負責協調遠端和本地資料來源。network: 處理所有遠端 API 請求。database: Room 資料庫的定義和 DAOs。datastore: Proto DataStore 的實作。model: 定義了整個應用程式共用的資料模型。designsystem: 定義 App 的顏色、字體和主題。common: 共享的工具類和擴充函式。
以下是 core 內部各模組的依賴關係圖:
graph TD
subgraph core
data --> common
data --> database
data --> datastore
data --> model
data --> network
database --> common
database --> model
datastore --> common
datastore --> model
domain --> common
domain --> data
domain --> model
network --> common
network --> model
ui --> common
ui --> designsystem
ui --> model
end
請依照以下步驟在本機環境中建置並執行專案:
git clone https://github.com/CiaShangLin/JetpackMovieCompose.git
cd JetpackMovieCompose本專案需要使用 The Movie Database (TMDB) 的 API 金鑰才能取得電影資料。請依照以下步驟設定:
-
前往 TMDB 網站 註冊一個帳號並申請一組 API 金鑰。
-
在專案的根目錄下,找到
key.properties檔案。如果檔案不存在,請自行建立一個。 -
在
key.properties檔案中,加入您的 API 金鑰,格式如下:API_KEY="YOUR_TMDB_API_KEY"
注意:
key.properties已被加入.gitignore中,以確保您的金鑰不會被上傳到版本控制系統。
一切就緒後,您可以使用 Android Studio 開啟專案,並點擊 "Run" 按鈕來建置和執行應用程式。
或者,您也可以使用以下 Gradle 指令:
# 在您的裝置或模擬器上安裝 Debug 版本的 App
./gradlew installDebug本專案採用 GitHub Actions 實現自動化的 CI/CD 流程,確保程式碼品質並簡化發布流程。
graph LR
A[推送程式碼] --> B[觸發 GitHub Actions]
B --> C[程式碼檢查]
C --> D[單元測試]
D --> E[建置 APK]
E --> F[簽名 APK]
F --> G[建立 Release]
G --> H[上傳到 GitHub Releases]
- 程式碼品質檢查: 使用 Ktlint 進行程式碼格式化檢查
- 單元測試執行: 自動執行所有模組的單元測試
- APK 建置: 自動建置 Release 版本的 APK
- APK 簽名: 使用預設的簽名金鑰進行 APK 簽名
- 自動發布: 當推送版本標籤時,自動建立 GitHub Release
- Changelog 生成: 自動產生版本更新日誌
-
建立版本標籤並推送:
git tag v1.0.0 git push origin v1.0.0
-
GitHub Actions 會自動執行:
- 執行測試套件
- 建置並簽名 APK
- 建立 GitHub Release
- 上傳 APK 檔案
專案包含以下 CI/CD 相關設定檔案:
releases/GITHUB_ACTIONS_SETUP.md: GitHub Actions 詳細設定指南.github/workflows/: GitHub Actions 工作流程定義(如存在)
為了讓 CI/CD 流程正常運作,需要在 GitHub Repository 設定以下 Secrets:
| Secret 名稱 | 說明 | 必要性 |
|---|---|---|
TMDB_API_KEY |
TMDB API 金鑰 | ✅ 必要 |
KEYSTORE_BASE64 |
簽名檔案的 Base64 編碼 | ✅ 必要 |
KEYSTORE_PASSWORD |
Keystore 密碼 | ✅ 必要 |
KEY_ALIAS |
金鑰別名 | ✅ 必要 |
KEY_PASSWORD |
金鑰密碼 | ✅ 必要 |
| 分支 | 建置狀態 | 程式碼覆蓋率 |
|---|---|---|
| main |
在推送之前,您可以在本地執行相同的檢查:
# 執行程式碼格式檢查
./gradlew ktlintCheck
# 執行所有單元測試
./gradlew test
# 建置 Release APK
./gradlew assembleProdRelease
# 執行所有檢查(包含測試和 Lint)
./gradlew check詳細的 CI/CD 設定說明請參考 releases/GITHUB_ACTIONS_SETUP.md。
以下是專案的未來開發計劃,歡迎有興趣的開發者提交 Pull Request 貢獻:
- 搜尋點擊收藏功能實現 - 在搜尋結果頁面新增收藏按鈕,讓使用者可以直接收藏電影
- 狀態欄跟隨主題切換 - 實現狀態欄顏色隨深色/淺色主題自動調整
- 演員結果頁 - 新增演員詳細資訊頁面,展示演員的作品列表和個人資料
- 單元測試 - 單元測試
注意: 由於作者需要開發公司專案,此專案暫時擱置開發。但仍歡迎社群貢獻者提交 Pull Request!
我們歡迎任何形式的貢獻,包括但不限於:
- 新功能開發
- Bug 修復
- 程式碼重構
- 文件改進
- 單元測試擴充
Copyright 2025 Your Name
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.










