Android 组件化

来源:互联网 发布:it之家官网 编辑:程序博客网 时间:2024/05/18 20:05

随着时间的推移,项目变得越来越臃肿,随便修改一些东西,重新编译一次,也要几分钟,极大影响开发效率。
故在一个月前,决定引入组件化,来缓解这种情况。
先对组件化的优势和主要的问题做下记录。

Router框架

Intent intent = new Intent(mContext, XxxActivity.class);intent.putExtra("key","value"); startActivity(intent); 

在Android开发中,是最常用的功能就是页面的跳转,先排除从浏览器或者其他App跳转到自己App中页面的需求,仅仅是简简单单的页面跳转,随着时间的推移,也会遇到一些问题:

  • 集中式的URL管理
    • 谈到集中式的管理,总是比较蛋疼,多人协同开发的时候,大家都去AndroidManifest.xml中定义各种IntentFilter,使用隐式Intent,最终发现AndroidManifest.xml中充斥着各种Schame,各种Path,需要经常解决Path重叠覆盖、过多的Activity被导出,引发安全风险等问题
  • 可配置性较差
    • Manifest限制于xml格式,书写麻烦,配置复杂,可以自定义的东西也较少
  • 跳转过程中无法插手
    • 直接通过Intent的方式跳转,跳转过程开发者无法干预,一些面向切面的事情难以实施,比方说登录、埋点这种非常通用的逻辑,在每个子页面中判断又很不合理,毕竟activity已经实例化了
  • 跨模块无法显式依赖
    • 在App小有规模的时候,我们会对App做水平拆分,按照业务拆分成多个子模块,之间完全解耦,通过打包流程控制App功能,这样方便应对大团队多人协作,互相逻辑不干扰,这时候只能依赖隐式Intent跳转,书写麻烦,成功与否难以控制。

而Router框架很好地解决了以上问题,比如ARouter。

ARouter路由框架

  • 支持通过URL进行跳转,并自动注入参数到目标页面
  • 支持多模块工程使用
  • 支持添加多个拦截器,自定义拦截顺序
  • 支持依赖注入,可单独作为依赖注入框架使用
  • 等等…

详见 传送门

组件化

随着时间的推移,项目变得越来越臃肿,随便修改一些东西,重新编译一次,也要几分钟,极大影响开发效率。

使用组件化可实现

  • 模块间进一步解耦,所有的基础公共库按需进行依赖,各个项目可共用
  • 开发阶段仅对单个模块进行运行和调试,提高开发效率
  • 减少协同开发中的冲突,提高开发效率
  • 可自由选择开发姿势(MVC/MVP/MVVM等)
  • 可进行针对性的的测试(仅需对修改过的模块进行测试)
  • 实现各模块的配置和组装,当一个功能不需要的时候,随时可去掉,当又需要该功能的时候,随时又可加上。

而使用Router框架是实现组件化的一个很好的方式。

公司项目组件

最终,把公司项目拆分为如下结构,各个业务模块之间可以独立运行,亦可组合在一起打Release包。

这里写图片描述

使用组件化的注意事项

Debug和Release模式下,Manifest不同

使用两个Manifest,在Debug模式下,使用Debug路径下的Manifest,Release模式下,使用Release的manifest。

这里写图片描述

在Module的gradle文件中,进行配置

sourceSets {        main {            if (rootProject.ext.is_build_module) {                manifest.srcFile 'src/main/debug/AndroidManifest.xml'                java.srcDirs += "src/main/debug/java/";            } else {                manifest.srcFile 'src/main/release/AndroidManifest.xml'                java.srcDirs += "src/main/release/java/";            }        }    }

资源ID冲突

合并多个组件到主程序,资源名相同时,会引起资源冲突。比较简单的解决方式是通过配置资源前缀名resourcePrefix来避免。配置了resourcePrefix后,该组件所有的资源都需要添加这个前缀才能编译通过。(但是 resourcePrefix 这个值只能限定 xml 里面的资源,并不能限定图片资源,所有图片资源仍然需要你手动去修改资源名)

android {    resourcePrefix "news_"}  

初始化

Debug模式下,可以配置组件自己的Application,进行初始化一些类库,但是在Release模式下,就无法做到一个组件一个Application了,一个较好的解决方案是使用ARouter的拦截器,ARouter拦截器的init方法,会在程序启动的时候,进行调用,并且会传入Context对象。

@Interceptor(priority = 8)public class TestInterceptor implements IInterceptor {    @Override    public void init(Context context) {    }}

Demo程序

ModularizationTest

原创粉丝点击