我是如何开发 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