简介
为什么需要架构?
当项目非常庞大时,项目的可维护性,可扩展性,易测性显得尤其的重要。
好的架构能够帮助我们更好实现:
•易维护 •易测试 •高内聚 •低耦合
Bob大神的Architecture is About Intent, not Frameworks. 个人理解是:架构应该是面向意图,而不是面向片段。
因此在架构的分层最好依据不同的意图来划分。
另外业务逻辑庞大的项目后期,必须对项目进行模块化的拆分。可以通过组件化,插件化等技术来实现。
这里我们仅针对app的架构讨论,不会涉及深入的组件化和插件化内容。
我们的CleanArchitecture架构
CleanArchitecture架构是在项目实践中不断总结出的Clean Architecture
是我们产品研发时尽可能遵循的原则,我们的期望是任何一个内部环节对外部是解耦的,没有依赖关系。
这也是架构设计的核心:独立性和可测试性;二者是相符想成的。
比如纯Java的可以用JUnit等测试,Android业务相可以用Android Instrumentation等测试。
效果图:
我们的项目基本包含四个层次
其中数据层,业务无关层分别是独立的library;展示层和业务公有层在app module中; 展示层和数据层的通过接口方式现实数据监听
-
展示层business
业务展示层采用MVP架构
- V: activity, fragment, view
- M: model
- P: presenter处理数据逻辑,使用data module中的各个repository
- P和V的解耦合可以通过Lisenter,EventBus, RxAndroid/RxJava等方式
- P调用使用data module中的各个repository,异步数据监听可以通过data层的接口来实现
实际使用中展示层是依据功能模块分成各个独立的模块,例如Home, User等。
每个模块都包含view,model,presenter,listerner,adapter,fragment 六个标准文件夹,用户也可以按照自己的需要再客制化
-
业务公共层 businesscommon
- router 页面跳转器
- utils 业务公用工具
- base 业务封装基类
-
数据层 data module
- repository 提供给展示层的数据接口(例如UserProvider等)
- listener 提供给上层的数据变化监听接口
- cache 缓存
- db 数据库
- entity 数据单元,其中可解析的entity多用于网络请求
- exception 异常
- net 网络相关
- task 各类任务线程池
-
业务无关库 common module
- 业务逻辑无关的一些公用库
- 也有使用到已发布的JCenter上的库
除此之外还有debug模块来管控log输出和调试
MVP架构说明
- V:是一个接口
- P:BasePresenter持有V
-
BaseMVPActivity持有P extends BasePresenter
,且implements V的接口 --------BaseMVPActivity public abstract class BaseMVPActivity<V, P extends BasePresenter<V>> extends BaseActivity { --------应用实例 1. 定义V接口 public interface IHomeDisplayer { void onDisplay(UserModel model); } 2. HomePresenter继承BasePresenter<IHomeDisplayer> public class HomePresenter extends BasePresenter<IHomeDisplayer> { 数据加载成功后调用V的方法(viewWeakRef.get()获取View的实例) viewWeakRef.get().onDisplay(DataTransaction.transform(user)); 3. HomeActivity继承BaseMVPActivity,实现V IHomeDisplayer的方法 public class HomeActivity extends BaseMVPActivity<IHomeDisplayer, HomePresenter> implements IHomeDisplayer { @Override public void onDisplay(UserModel model) { if (model != null) { resultTV.setText(model.getUserId()); } }
待优化
- 组件化部分尚未加入
- JUnit, espresso等测试用例模板尚未加入
后续项目复杂度提升,实践后再更新出来。
其他建议
- 尽可能搭配组件化/插件化:注意独立模块的单独调试和继承测试
- 动态加载(轻量级插件化):若app对更新时效性有要求,需要。例如金融类app
- 性能和测试
- 对app核心行为和各个组件交互和生命周期的监控,后期可以搭配bug服务器平台跟trace log一起上传,以便于bug的分析和追踪(LogMan写入文件)
- 建议接入移动测试平台
Vivian 的Android架构
开源架构
查看知乎的一种更清晰的Android架构