App 组件化/模块化之路——构建开发架构思路
App 组件化/模块化开发架构思路
随着业务的发展 App 开发技术也越来越成熟,对开发者来说 App 代码量也迅速地增长到一个数量级。对于如何架构 App 已经每个开发者面临的实际问题。好的架构可以提高开发者的效率,降低维护成本。
由于业务增长引起项目中代码量激增,以及历史遗留问题和结构混乱,作为一个有代码洁癖的程序员,很早就开始思考如何组织 App 架构的问题了。目前遇到的主要有以下几点问题:
- 代码量激增引起结构混乱
- 各个模块相互引用且耦合度高
- 无法独立开发或者调试组件代码
- 无法应对组件插拔的需求(例如:产品经理今天把这个功能加上,第二天又去掉,第三天又加回来T_T)
App 架构图
在阅读了大量的文档之后,根据实际项目开发遇到的问题,我总结了以下架构。由于水平有限,有不合理的欢迎拍砖

自下而上将 App 分为:
- 内核层
- 业务层
- 应用层
内核层
内核层是包含了为 App 提供公共服务的的一些库。例如:公共资源、网络库、日志工具、数据库、图片加载等核心库。这些是整个 App 基础库。
业务层
我认为这一层是整个 App 架构的关键。因为根据实际业务需求,这一层会分离出许多独立组件(其实就是对应于 Android Studio 的 Module),但这些组件可以独立运行,相当于一个小应用(组件如何独立运行将在应用层中会详细解析)。并且这些组件不再像传统的方式进行相互引用,而是采用了组件路由进行各个组件的通信。
比如组件 A 中需要跳转到组件 B 中的一个 Activity 页面,传统的做法是在 ModuleAActivity 中
Intent intent = new Intent(this,ModuleBActivity.class);intent.putExtra("data", data);startActivity(intent);
这样 Module A 与 Module B 耦合度就很强
比较好的做法应该是
Intent intent = Router.route(context,"BPackageName.ModuleBActivity",data);startActivity(intent);
当然实现上面的路由原理也有很多方式,例如可以使用 Android 系统的隐式调用实现跳转通信。
在 Manifest 文件中
<activity android:name=".ModuleBActivity"><intent-filter><dataandroid:host="moduleb"android:path="/entry"android:scheme="router"/><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><category android:name="android.intent.category.BROWSABLE"/></intent-filter></activity>
实际调用
String url = "router://moduleb/entry";Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);PackageManager packageManager = getPackageManager();List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);if (!activities.isEmpty()) {startActivity(intent);}
Router 层目前有一个比较好的开源框架可以参考,来自 alibaba 的开源项目:ARouter
SDK 编码思维
业务层要实现比较好组件分离,对程序猿现在编码思维要转换一下,要切换到 SDK 思维。
那什么是 SDK 思维呢?
想想项目中引用他人编写的库的接口使用方式,就不难理解了。即站在使用者的角度上思考:如何使用接口才是最方便的?例如公司现有好几个 App 产品,每个 App 都需要使用同样的授权登录。那么这个授权登录模块就可以独立成一个组件。
假设将授权登录组件命名为auth。那么其它组件在使用的时候可能类似以下代码片段
AuthApi.authorize(context,userId,password).onAuthorizeFinished(authInfo->doAuthorizeWorks(authInfo)//处理登录后的逻辑,把授权码保存用于请求其他业务接口,例如请求用户信息等);
所以,作者觉得接口设计或者提供应该是利他主义的。当然这纯粹是作者的一家之言,欢迎继续拍砖。
应用层
顾名思义,这一层是对整个 App 的整合,也是 App 的入口。这里有 Main 和 Dev。其中 Main 是对各个业务组件的整合,是最终打包的产品的上层应用。而组件入口是独立运行和调试各个组件的子应用。
Dev 在 Android Studio 中是对应一个 Application 。在 gradle 中配置为
apply plugin: 'com.android.application'
它是一个可以独立运行的子工程,要调试 Module A 那么在 Dev 中将引用该组件
dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile project(':moduleA')...}
这就是一个大概的思路,可以看出这个框架关键的部分是在于业务层的分离。需要把原来项目中的基础模块抽取出来,放在内核层中。那么下一步就开始构建我们的内核层组件。可持续关注 wecodexyz/Componentization 项目的更新。
App 组件化/模块化之路——构建开发架构思路的更多相关文章
- App 组件化/模块化之路——使用SDK的思路进行模块化设计接口
在不久之前分享一篇<App 组件化/模块化之路——如何封装网络请求框架>文章介绍了我在项目中封装网络请求框架的思路.开发一个 App 会涉及到很多网络请求 API ,例如登录注册接口.用户 ...
- App 组件化/模块化之路——如何封装网络请求框架
App 组件化/模块化之路——如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-asyn ...
- App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南
面对越来越复杂的 App 需求,Google 官方发布了Android 框架组件库(Android Architecture Components ).为开发者更好的开发 App 提供了非常好的样本. ...
- App 组件化/模块化之路——Repository 模式
什么是 Repository 模式 Repository 这个词直译过来仓库.仓储的意思.这个意思其实也能反应出 Repository 模式作用.App 开发中少不了对数据的操作,数据的来源可能有很多 ...
- Android 组件化/模块化之路——在展示层搭建MVP结构
Android 组件化/模块化之路——在展示层搭建MVP结构 什么是MVP Model–View–Presenter (MVP) 源于 Model–View–Controller (MVC) 的结构设 ...
- 得到、微信、美团、爱奇艺APP组件化架构实践
一.背景 随着项目逐渐扩展,业务功能越来越多,代码量越来越多,开发人员数量也越来越多.此过程中,你是否有过以下烦恼? 项目模块多且复杂,编译一次要5分钟甚至10分钟?太慢不能忍? 改了一行代码 或只调 ...
- Android 开发:由模块化到组件化(一)
在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发 以下高能,请做好心理准备,看不懂请发私信来交流 ...
- Android 开发:由模块化到组件化
在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发 以下高能,请做好心理准备,看不懂请发私信来交流 ...
- [Android Pro] 由模块化到组件化(一)
cp from : https://blog.csdn.net/dd864140130/article/details/53645290 在Android SDK一文中,我们谈到模块化和组件化,现在我 ...
随机推荐
- javaWeb学习总结(8)- JSP基础语法(2)
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...
- VR大时代-全景智慧城市搭建是一个任重而道远的任务
全景智慧城市搭建是一个任重而道远的任务,但是也促进了实体市场的蓬勃发展与进步.VR技术改变了人们以往的娱乐方式,而全景智慧城市将会彻底改变人们的生活习惯.VR是未来的计算平台,更是人力发展历史中,技术 ...
- Elasticsearch与Solr
公司之前有个用Lucene实现的伪分布式项目,实时性很差,后期数据量逐渐增大的时候,数据同步一次需要十几小时.当时项目重构考虑到的是Solr和ES,我参与的是Solr技术的预研.因为项目实时性要求很高 ...
- R TUTORIAL: VISUALIZING MULTIVARIATE RELATIONSHIPS IN LARGE DATASETS
In two previous blog posts I discussed some techniques for visualizing relationships involving two o ...
- vue实例的几个概念
1.构造器 vue应用都是通过vue构造函数创建实例来启动的,在创建vue实例时需要传入一个options对象,该对象可以包含数据.模板.挂在元素.方法.生命周期钩子等选项: var vm = new ...
- web前端面试集锦(自己搜集的,如有错误请不吝赐教)
css 1 浏览器兼容性 CSS hack(针对IE6-,IE7,IE8,IE9以及其他浏览器) ‘ * ’ : 所有的IE浏览器都能识别 说明:在标准模式中 “-″减号是IE6专有的hack “\9 ...
- 两强相争,鹿死谁手 — JQuery中的Ajax与AngularJS中的$http
一.JQuery与AngularJS 首先,先简单的了解一下JQuery与AngularJS.从源头上来说,两者都属于原生JS所封装成的库,两种为平行关系. 二.Ajax请求与数据遍历打印 这里是Aj ...
- C++进阶引导
1.C++的用途和意义 t0185b047e29feffc26.jpg 总体来说,C++作为一门软件开发语言,它的流行度是在减少的.主要原因在于语言的复杂和灵活导致软件开发成本提高,这体现在开发周期和 ...
- activeMQ的安装
1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip, 修改配置 ...
- sql拼接,String和Stringbuffer的问题
首先提出来一个问题: 下边两种拼字符串的方式,哪种更好一些,或者还有更好的方式? StringBuffer hql=new StringBuffer(); hql.append("from ...