去管理对各个插件中类的访问,并且做一定的限制。
-
若使用单 ClassLoader 机制,主工程则可以直接通过类名去访问插件中的类。该方式有个弊端,若两个不同的插件工程引用了一个库的不同版本,则程序可能会出错。
-
资源加载
-
原理在于通过反射将插件 apk 的路径加入AssetManager 中并创建 Resource 对象加载资源,有两种处理方式:
-
合并式:addAssetPath 时加入所有插件和主工程的路径;由于 AssetManager 中加入了所
有插件和主工程的路径,因此生成的Resource 可以同时访问插件和主工程的资
源。但是由于主工程和各个插件都是独立编译的,生成的资源 id 会存在相同的情况,在
访问时会产生资源冲突。
- 独立式:各个插件只添加自己 apk 路径,各个插件的资源是互相隔离的,不过如果想要实现资源的共享,必须拿到对应的 Resource对象。
6、组件化原理
-
参考回答:
-
引入组件化的原因:项目随着需求的增加规模变得越来越大,规模的增大导致了各种业务错中复杂的交织在一起,每个业务模块之间,代码没有约束,带来了代码边界的模糊,代码冲突时有发生, 更改一个小问题可能引起一些新的问题, 牵一发而动全身,增加一个新需求,需要熟悉相关的代码逻辑,增加开发时间
-
避免重复造轮子,可以节省开发和维护的成本。
-
可以通过组件和模块为业务基准合理地安排人力,提高开发效率。
-
不同的项目可以共用一个组件或模块,确保整体技术方案的统一性。
-
为未来插件化共用同一套底层模型做准备。
-
组件化开发流程就是把一个功能完整的 App 或模块拆分成多个子模块(Module),每个子模块可以独立编译运行,也可以任意组合成另一个新的 App 或模块,每个模块即不相互依赖但又可以相互交互,但是最终发布的时候是将这些组件合并统一成一个 apk,遇到某些特殊情况甚至可以升级或者降级
-
举个简单的模型例子
App 是主 application,ModuleA 和 ModuleB 是两个业务模块(相对独立,互不影响),Library 是基础模块,包含所有模块需要的依赖库,以及一些工具类:如网络访问、时间工具等
- 注意:提供给各业务模块的基础组件,需要根据具体情况拆分成 aar 或者 library,像登录,基础网络层这样较为稳定的组件,一般直接打包成 aar,减少编译耗时。而像自定义 View 组件,由于随着版本迭代会有较多变化,就直接以源码形式抽离成 Library
7、跨组件通信
-
参考回答:
-
跨组件通信场景:
-
第一种是组件之间的页面跳转 (Activity 到 Activity, Fragment 到 Fragment, Activity 到 Fragment, Fragment 到 Activity) 以及跳转时的数据传递 (基础数据类型和可序列化的自定义类类
型)。
-
第二种是组件之间的自定义类和自定义方法的调用(组件向外提供服务)。
-
跨组件通信方案分析:
-
第一种组件之间的页面跳转实现简单,跳转时想传递不同类型的数据提供有相应的 API 即可。
-
第二种组件之间的自定义类和自定义方法的调用要稍微复杂点,需要 ARouter 配合架构中的 公共服务(CommonService) 实现:
-
提供服务的业务模块:
-
在公共服务(CommonService) 中声明 Service接口 (含有需要被调用的自定义方法), 然后在自己的模块中实现这个 Service 接口, 再通过 ARouter API 暴露