我是如何開發 Android App 的 —— 歷程#
#系列
#2022-01-06
#android
#article/done/published
歷程#
階段一:單個 app 單個模塊#
開始需求很簡單,只要一個 app 就可以了,所有的功能直接放在一個 module 中。
component app
階段二:單個 app 多個功能模塊#
開始有獨立的模塊功能,需要定制,一個方案是 DynamicFeature
component app
component dynamic_feature_a
component dynamic_feature_b
component dynamic_feature_n
dynamic_feature_a --> app
dynamic_feature_b --> app
dynamic_feature_n --> app
DynamicFeature 需要應用市場的支持。
對於需要獨立部署的情況不太使用,當然還有https://github.com/iqiyi/Qigsaw 可以自己部署支持動態功能的應用市場。但是部署過於複雜。
另一個方案就是插件化,插件化有運行時插件化和編譯時插件化。
編譯時插件化實現相對簡單,只需要動態修改 app 的依賴就可以了,運行時通過反射獲取所有的插件實現並調用對應方法即可。
component app
component feature_a
component feature_b
component feature_n
app --> feature_a
app --> feature_b
app --> feature_n
編譯不同的插件模塊
build.gradle
dependencies{
if(useFeature("feature_a")){
implementation ":feature_a"
}
if(useFeature("feature_b")){
implementation ":feature_b"
}
}
階段三:單個 app 多個功能模塊單個公共模塊#
隨著功能模塊數量的增加,不同模塊會有大量重複的庫的依賴,並且可能會有版本衝突,
為了統一工具庫的版本和使用,需要統一進行封裝。
所以引入了公共庫。
原則上所有非功能模塊核心功能的依賴都要放到公共庫中,如網絡請求、圖片處理、鍵值存儲、數據庫等
並且功能模塊不應直接依賴第三方的庫,需要經過公共庫的封裝,方便將來的升級和遷移。
component app
component feature_a
component feature_b
component feature_n
app --> feature_a
app --> feature_b
app --> feature_n
component common
feature_a --> common
feature_b --> common
feature_n --> common
階段四:功能模塊相互依賴#
隨著功能模塊的增加,功能模塊之間也需要有相關的調用,但是功能模塊從分層上屬於同一層,
同層之間不應該有直接依賴,否則容易形成循環依賴。
所以需要引入一個公共功能模塊(services)或者叫服務總線,
所有功能模塊通過實現 servcies 中的接口向其他模塊提供服務。
公共模塊和公共功能模塊這裡一起作為 Framework
package apps{
component app
}
package features{
component feature_a
component feature_b
component feature_n
}
app --> feature_a
app --> feature_b
app --> feature_n
package framework{
component common
component services {
component feature_a_service
component feature_b_service
component feature_n_service
}
}
features --> common
feature_a --> feature_a_service
feature_b --> feature_b_service
feature_n --> feature_n_service
關於模塊間公開服務調用還有另一種方式,就是每個功能模塊單獨定義一個公開服務的組件給其他模塊調用,但是容易造成依賴關係指數級複雜,所以採用將所有模塊的公開服務統一管理的方式
component feature_a
component feature_a_service
feature_a --|> feature_a_service
component feature_b
component feature_b_service
feature_b --|> feature_b_service
component feature_n
component feature_n_service
feature_n --|> feature_n_service
feature_a --> feature_b_service
feature_b --> feature_a_service
feature_n --> feature_a_service
feature_n --> feature_b_service
階段五:專注功能#
將功能註冊到市場,app 自動發現功能
package framework{
package apps{
component app
}
component common
component services {
component feature_a_service
component feature_b_service
component feature_n_service
}
}
package features{
component feature_a
component feature_b
component feature_n
}
features --> common
app --> feature_a
app --> feature_b
app --> feature_n
feature_a --> feature_a_service
feature_b --> feature_b_service
feature_n --> feature_n_service