App 组件化/模块化之路——构建开发架构思路

简介:

App 组件化/模块化开发架构思路

随着业务的发展 App 开发技术也越来越成熟,对开发者来说 App 代码量也迅速地增长到一个数量级。对于如何架构 App 已经每个开发者面临的实际问题。好的架构可以提高开发者的效率,降低维护成本。

由于业务增长引起项目中代码量激增,以及历史遗留问题和结构混乱,作为一个有代码洁癖的程序员,很早就开始思考如何组织 App 架构的问题了。目前遇到的主要有以下几点问题:

  1. 代码量激增引起结构混乱
  2. 各个模块相互引用且耦合度高
  3. 无法独立开发或者调试组件代码
  4. 无法应对组件插拔的需求(例如:产品经理今天把这个功能加上,第二天又去掉,第三天又加回来T_T)

App 架构图

在阅读了大量的文档之后,根据实际项目开发遇到的问题,我总结了以下架构。由于水平有限,有不合理的欢迎拍砖

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>
<data
android: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')
...
}

这就是一个大概的思路,可以看出这个框架关键的部分是在于业务层的分离。需要把原来项目中的基础模块抽取出来,放在内核层中。那么下一步就开始构建我们的内核层组件。





作者:AngryCode
来源:51CTO
目录
相关文章
|
2天前
uni-app 4.13开发弹出层组件(二)弹出关闭功能
uni-app 4.13开发弹出层组件(二)弹出关闭功能
10 0
|
2天前
uni-app 4.5开发聊天列表组件(一)
uni-app 4.5开发聊天列表组件(一)
11 0
|
3天前
|
开发者 微服务
探讨后端开发中的微服务架构设计与实践
【2月更文挑战第10天】随着互联网技术的不断发展,微服务架构作为一种优秀的解决方案在后端开发领域越来越受到重视。本文将深入探讨微服务架构设计与实践中的关键问题,包括服务拆分、通信机制、数据一致性等方面,旨在帮助开发者更好地理解和应用微服务架构。
|
5天前
|
消息中间件 运维 监控
后端开发中的微服务架构设计与实践
【2月更文挑战第7天】 随着互联网应用的复杂性不断增加,传统的单体应用架构已经无法满足需求,微服务架构作为一种新的架构设计思想,逐渐成为了主流。本文将探讨后端开发中微服务架构的设计原则、实践技巧以及常见挑战,并结合实际案例进行分析,旨在帮助开发者更好地理解和应用微服务架构。
152 0
|
4天前
|
前端开发 Java fastjson
且谈软件架构(二) 模块化与MVC
且谈软件架构(二) 模块化与MVC
|
5天前
|
存储 监控 负载均衡
后端开发中的微服务架构设计与实践
【2月更文挑战第8天】 在当今互联网应用的开发中,微服务架构已经成为一种流行的架构设计方式。本文将从微服务架构的定义、优势、设计原则和实践经验等方面进行探讨,以帮助后端开发人员更好地理解和应用微服务架构。
54 3
|
2天前
uni-app 4.12开发弹出层组件(一)基础架构
uni-app 4.12开发弹出层组件(一)基础架构
11 0
|
2天前
|
JavaScript
uni-app 4.6开发聊天列表组件(二)
uni-app 4.6开发聊天列表组件(二)
9 0
|
6天前
|
消息中间件 设计模式 数据库
深入探讨后端微服务架构中的分布式事务处理
【2月更文挑战第6天】在当今互联网应用开发领域,后端微服务架构已经成为一种常见的设计模式。本文将深入探讨在后端微服务架构中如何有效处理分布式事务,包括事务管理、一致性保障和异常处理策略,帮助开发者更好地应对复杂的业务场景。
93 4
|
10天前
|
监控 数据可视化 关系型数据库
微服务架构+Java+Spring Cloud +UniApp +MySql智慧工地系统源码
项目管理:项目名称、施工单位名称、项目地址、项目地址、总造价、总面积、施工准可证、开工日期、计划竣工日期、项目状态等。
149 6

相关产品

  • 云迁移中心