App组件化/模块化开发架构思路随着业务的发展,App开发技术日趋成熟,App代码量也在快速增加对于开发人员增加了一个数量级。如何构建应用程序是每个开发人员面临的实际问题。好的架构可以提高开发人员的效率,降低维护成本。由于业务增长导致项目代码量激增,以及历史问题和结构混乱,作为一个代码洁癖的程序员,很早就开始思考如何组织App架构。目前遇到的主要问题有:代码量激增导致结构混乱。模块相互引用,耦合度高。无法独立开发或者调试的组件代码不能满足组件插件的需要(比如:产品经理今天加了这个功能,第二天去掉,第三天加回来T_T)App架构图后看了很多文档,根据实际项目开发中遇到的问题,总结出如下架构。由于层次有限,搬砖是不合理的,将App从下往上划分:内核层业务层应用层内核层内核层包含一些为App提供公共服务的库。例如:公共资源、网络库、日志工具、数据库、图片加载等核心库。这些是整个App基础库。业务层我觉得这一层是整个App架构的关键。因为根据实际业务需要,这一层会分离出很多独立的组件(实际上对应AndroidStudio的Module),但是这些组件是可以独立运行的,相当于一个小应用(组件如何独立运行会在后面详述)应用层解析)。并且这些组件不再以传统的方式相互引用,而是使用组件路由来相互通信。比如组件A需要跳转到组件B中的一个Activity页面,传统的方法是Intentintent=newIntent(this,ModuleBActivity.class);intent.putExtra("data",data);startActivity(intent);这样,模块A和模块B之间的耦合就很强了。更好的方法应该是Intentintent=Router.route(context,"BPackageName.ModuleBActivity",data);启动活动(意图);当然,实现上述路由原理的方法有很多种,比如可以利用Android系统的隐式调用来实现跳转通信。在Manifest文件中="android.intent.action.VIEW"/>实际上调用Stringurl="router://moduleb/entry";Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse(url));intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);PackageManagerpackageManager=getPackageManager();Listactivities=packageManager.queryIntentActivities(intent,0);if(!activities.isEmpty()){startActivity(intent);}Router层目前有一个很好的开源框架可以参考,来自阿里巴巴的开源项目:ARouterSDK编码思维业务层实现更好的组件分离,目前程序员的编码思维需要切换到SDK思维。那么SDK在想什么?想想项目中使用的接口是怎么引用别人写的库的,就不难理解了。即站在用户的角度思考:界面怎么用最方便?比如公司有几个App产品,每个App都需要使用同一个权限登录,那么这个权限登录模块可以独立组成一个组件。假设授权登录组件名为auth。那么其他组件在使用时可能类似下面的代码片段,比如请求用户信息等);因此,笔者认为界面设计或提供应该是无私的。当然这纯属作者一家之言,欢迎继续拍砖。顾名思义,应用层是整个App的集成,是App的入口。这里有Main和Dev。其中Main是各个业务组件的集成,是最终打包产品的上层应用。组件入口是独立运行和调试每个组件的子应用程序。Dev在AndroidStudio中对应一个Application。在gradle中配置为applyplugin:'com.android.application',是一个可以独立运行的子工程。要调试ModuleA,组件将在Devdependencies中被引用{compilefileTree(dir:'libs',include:['*.jar'])compileproject(':moduleA')...}这是一个大概的想法,可以看出这个框架的关键部分在于业务层的分离。需要将原项目中的基础模块抽取出来放在内核层。那么下一步就是开始构建我们的内核层组件。