【Android】模块化方案

在Android Studio创建一个代码模块,是非常简单的事情,这里不再讲述

模块化存在的难题

  • 怎么划分模块,实现模块间的逻辑解耦
  • 怎么实现动态打包,在不使用某个模块时,可以不打包某个模块
  • 怎么实现业务方案动态替换,比如视频回放有多种方案,怎么在打包时动态指定使用哪个
  • 怎么实现界面方案动态替换,比如登录模块有多种界面风格,怎么在打包时动态指定使用哪个
  • 怎么实现多个业务模块自由组合
  • 怎么实现单个业务模块的启动和销毁

解决思路

  • 考虑好业务逻辑和技术逻辑,划分好逻辑层次,只允许上级模块访问下级,下级不能依赖上级
  • 假设A模块可能使用B,也可能不使用B,那么A模块就不能直接依赖B模块,直接引用B模块中的类和资源。可以定义一个配置变量isOpenB,当isOpenB=true时,通过反射的方式,来创建B模块中的类实例,当isOpenB=false时,什么都不做就行了
  • 假设A模块需要引用B,但B模块有多种实现方案。此时,我们可以只将B模块定义为一个接口层,我们把它叫做IB模块。再在B1,B2,B3等模块中,以不同的方式实现IB接口的规范。我们再定义一个配置变量implClassB,它是实现类的完整类名,A模块只引用IB模块,通过反射和implClassB的值动态创建IB实例就行了
  • 想实现界面方案动态替换的话,我们可以将界面拆分为两个模块,一个模块只定义界面规范,另一个模块提供具体的界面资源。假设这些模块的名称分别为IB,B1,B2,B3,IB模块只通过xml定义id,不提供实际资源,而B1,B2,B3则继承自IB,同时提供id对应的资源,打包时在gradle中,不管使用B1,B2,B3中的哪个,程序都可以正常运行,同时实现了界面替换功能
  • 想实现业务模块的自由组合,我们只需要将主模块设计为一个空壳模块,类似于微信的小程序模块。这个模块什么都不做,我们将模块列表设计为一个配置变量,主模块通过读取该配置变量来决定如何展示模块入口,对于不需要的模块,直接在主模块去除对应的模块依赖即可
  • 上一步我们已经做到了,如何在界面上展示模块入口。下一步,我们还需要解决如何启动模块的问题。由于安卓没有提供专门的类来表示业务模块,所以我们需要自己定义一个业务模块接口,这个接口定义如何启动界面,创建资源,销毁资源。上一步我们提到了模块配置这个变量,这个配置变量里面包含了一个业务模块的类名,图标,标题,是否允许多例等信息。我们根据模块类名,通过反射就可以创建模块实例,如何通过该对象就可以完成业务模块的启动工作

模块层次划分

  • 通用技术模块:负责网络通信,事件订阅发布,常用控件等通用技术方案

  • 定制技术模块:负责播放器,视频通话,表格读写等定制技术方案

  • 业务规范模块:负责登录,升级,定位,权限申请等单个子业务。当业务比较复杂时,该模块只定义接口规范,不负责具体实现

  • 业务实现模块:负责单个子业务的多种实现方案

  • 大业务模块:负责公司某个具体方向的大业务。同时还要负责和该总业务相关资源的创建和销毁,类似微信的小程序

  • 业务配置模块:配置启用哪些业务模块,选择哪种业务方案。所有打包时可变选项,都应当作为配置放到此模块

  • 主模块:一个套壳模块,什么都不做,根据配置模块决定启动后哪个大业务模块

  • 模块接口:安卓本身并没有提供模块这个概念的类,需要我们自己去定义。一个模块接口,代表着公司的一个大业务。这个接口定义大业务从哪个界面开始启动,启动前要创建哪些资源,如何退出模块,退出时要销毁哪些资源

你可能感兴趣的:(android-疑难杂症研究,android,android,模块化,Module,组件化,动态打包)