Android 應用程式模組化指南

含有多個 Gradle 模組的專案稱為多模組專案。本指南包含開發多模組 Android 應用程式的最佳做法和建議模式。

程式碼集不斷擴增的問題

由於程式碼集不斷擴增,隨著時間過去,擴充性、可讀性和整體程式碼品質通常會逐漸下降。這是因為程式碼集的規模增加,但沒有維護人員採取主動措施來實行易於維護的結構。模組化是一種建構程式碼集的方式,能提升可維護性,並避免上述問題。

什麼是模組化?

模組化是將程式碼集整理成鬆耦合和獨立部分的做法。每個部分都是一個模組,而每個模組都是獨立的,具有明確用途。將問題分成幾個較易解決的小部分,就能降低設計和維護大型系統的複雜度。

圖 1:多模組程式碼集範例中的依附元件圖表

模組化的優點

模組化的優點有很多,但主要在於提升程式碼集的可維護性和整體品質。下表摘要說明主要優點。

好處 摘要
複用性 藉由模組化,您可以共用程式碼,並從同一個基礎建構多個應用程式。模組可有效建構區塊。應用程式應是功能的總和,而功能會歸類成獨立的模組。特定模組提供的功能不一定會在特定應用程式中啟用。舉例來說,:feature:news 可以是完整版變種版本和 Wear 應用程式的一部分,但不能是試用版變種版本的一部分。
嚴格控管瀏覽權限 您可以利用模組輕鬆控管對程式碼集其他部分公開的內容。公開介面以外的任何內容均可標示為 internalprivate,這樣就能避免在模組外使用。
可自訂提供方式 Play Feature Delivery 會使用應用程式套件的進階功能,方便您依條件或隨選方式提供應用程式的特定功能。

模組化的優點只能透過模組化程式碼集實現。 使用其他技術或許也能享有下列優點,但模組化功能可進一步強制實現這些優點。

好處 摘要
擴充性 在緊耦合的程式碼集中,單一變更可能會在看似不相關的多個程式碼部分中,觸發一連串變更。經過適當模組化的專案會謹守關注點分離原則,進而限制耦合。這個做法能給予貢獻者更高的自主能力。
擁有權 除了提供自主能力以外,模組也可用來賦予責任。模組可設立一位專屬擁有者,負責維護程式碼、修正錯誤、新增測試及審查變更。
封裝 封裝是指程式碼各部分對於其他部分的認知,應維持在最低限度。獨立的程式碼更容易閱讀及理解。
可測試性 可測試性是指測試程式碼的方便程度。如果程式碼集中的元件能輕鬆在獨立狀態下進行測試,就稱為可測試的程式碼集。
建構時間 部分 Gradle 功能可利用模組化的特性提升建構效能,這類功能包括漸進式建構、建構快取或平行建構。

常見陷阱

程式碼集的精細程度是指組成程式碼集的模組精細程度。程式碼集越精細,含有的模組越多也越小。設計模組化程式碼集時,應決定精細程度,並考量程式碼集的大小和相對的複雜度。過於精細會導致負擔加重,過於粗略則會降低模組化的優勢。

一些常見陷阱如下:

  • 過於精細:每個模組都會增加建構複雜度和樣板程式碼,帶來一定程度的負擔。複雜的建構設定會導致難以在各模組間保持一致的設定。樣板程式碼過多會導致程式碼集變得冗贅,因而難以維護。如果負擔抵消了提升擴充性帶來的好處,請考慮合併部分模組。
  • 過於粗略:反之,如果模組過大,最終就又等於是單體,失去了模組化的好處。舉例來說,在小型專案中,您可以將資料層放入單一模組。但隨著規模擴增,可能需要將存放區和資料來源分割為獨立模組。
  • 太過複雜:將專案模組化不一定是合理做法,這主要取決於程式碼集大小。如果您預計專案數量不會增加至超過特定閾值,那麼擴充性和建構時間增長的情形就不會發生。

我適合使用模組化技術嗎?

如要享受重複使用程式碼、嚴格控制瀏覽權限或採用 Play Feature Delivery 所帶來的優點,就必須使用模組化技術。如果不需要以上功能,但仍想提升擴充性、擁有權、封裝或建構時間,不妨嘗試模組化。

範例