bin^2

bin^2

discord server
twitter

我是如何開發Android App的——歷程

我是如何開發 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
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。