模块化
模块化是指以重用化为目的,将一个系统拆分为一个个单独的小功能工具:避免重复造轮子,节省开发维护成本;降低项目复杂性,提升开发效率;同一个模块,在一定层度上确保了技术方案的统一性。
组件化
由app空壳,只包含mainActivity的东西,和baseModule和各个module组成完整项目.
APP空壳module:声明应用包名,名称、图标以及其他组件中最终在集成开发模式下都被合并到这份 AndroidManifest.xml 中。另外Android还有应用的打包签名代码混淆。
basemodule:在基础组件的Application实现各组件Application初始化操作(反射方法获取所有依赖的module的application),统筹管理所有依赖关系,moudle向base module注册service接口,其他module可以调用实现跨moudle通信。还有就是共用工具库的实现。
普通module:业务相关的各个模块。通过修改他们的buildtype可以设置是单独运行还是集成运行,每个moudle拥有自己的application和两份清单文件,集成编译时设置引用app的application和清单文件。还要注意资源名重复,通过加前缀。
组件化优势
1.组件化解耦:使各业务组件化间解耦,因此各个都是独立的module,它们之间是没有依赖关系。
2.单独编译:每个module实际上也是一个完整的项目,可以进行单独编译,调试。
3.并行开发:互不影响可以并行开发。
组件通信
1.组件之间的页面跳转 (Activity 到 Activity, Fragment 到 Fragment, Activity 到 Fragment, Fragment 到 Activity) 以及跳转时的数据传递 (基础数据类型和可序列化的自定义类类型)。使用arouer跳转
2.组件之间的自定义类和自定义方法的调用(组件向外提供服务)。需要 ARouter 配合架构中的 公共服务(CommonService) 实现:在公共服务(CommonService) 中声明 Service 接口 (含有需要被调用的自定义方法), 然后在自己的模块中实现这个 Service 接口, 再通过 ARouter API 暴露实现类。此外还可通过eventBus等异步通信库。
arouter路由原理
我们在代码里加入的@Route注解,会在编译时期通过apt生成一些存储path和activity.class映射关系的类文件,然后app进程启动的时候会加载这些类文件,把保存这些映射关系的数据读到内存里(保存在map里),然后在进行路由跳转的时候,ARouter会通过它自己存储的路由表找到路由地址对应的Activity.class,它的内部会调用startActivity(intent)进行跳转,这样便可以实现两个相互没有依赖的module顺利的启动对方的Activity了。
插件化
插件化是将一个apk根据业务功能拆分成不同的子apk(也就是不同的插件),每个子apk可以独立编译打包,最终发布上线的是集成后的apk。在apk使用时,每个插件是动态加载的,插件也可以进行热修复和热更新。
主要解决三个问题:如何加载类、如何加载资源、如何管理组件生命周期。
插件化原理
插件化就是通过类加载、资源加载、组件生命周期管理去动态加载一个apk。
:类加载:
Android中类的加载也是通过ClassLoader来完成包含DexClassLoader和PathClassLoader。DexClassLoader用来加载未安装apk的dex。PathClassLoader主要用来加载系统类和应用程序的类。
资源加载
Android系统通过Resource对象加载资源,因此只需要将apk需要的资源文件所在路径到AssetManager中,即可实现对插件资源的访问。
生命周期管理
主流的是hook方式,通过自定义Instrumentation替换activityThread中的Instrumentation代理类欺骗了系统,hook了Activity的启动和创建,省去了手动管理插件Activity生命周期的繁琐,让插件Activity像正常的Activity一样被系统管理,并且插件Activity在开发时和常规一样,即能独立运行又能作为插件被主工程调用。
Atlas
热修复
插件化是想把需要实现的模块当做一个独立的提取出来,减少宿主的规模,使用时动态加载。
热修复强调的是在不需要二次安装应用的前提下修复已知的bug。
在原先的app打包的时候,阻止相关类去打上核查标志,然后将补丁 dex 文件放到 dex数组靠前位置,这样在加载 class 时被抢先加载代替掉Bug类从而达到修复的目的。
Tinker
插件化和组件化区别
1.组件化的单位是module静态加载,插件化的单位是apk,动态加载
2.关注点不同,插件化更关注动态加载、热更新、热修复等‘插拔’技术。
网友评论