插件化相关知识介绍
出现背景
app体积越来越大,功能模块越来越多;
模块耦合度越来越高,协同开发沟通成本极大;
方法数可能超过65535,占用内存过大。
门户型大型app必须解决这类问题
如何解决
将一个大的apk按照业务分割成多个小的apk
每个小的apk既可以独立运行又可以作为插件运行
哪些优势
业务模块基本完全解耦
高效的并行开发,(编译测试速度更快)
按需加载,内存占用更低。(不加载的类不占用内存)
插件化相关概念
宿主:主APk 可以加载插件,也称为Host;
插件:插件App 被宿主加载的app,可以是跟普通app一样的apk文件;
插件化:将一个应用按照宿主插件的方式改造就叫插件化。
插件化后结构对比
1.pngupdate.so和firstbundle.so是用到的apk文件
与组件化对比
组件化是一种编程思想,插件化是一种技术;
组件化是为了代码高复用性出现的;
插件化是为了解决应用越来越庞大而出现的。
与动态更新对比
与动态更新一样,都是动态加载技术的应用;
动态更新是为了解决线上bug或者小功能的更新而出现;
插件化是为了解决应用越来越大而出现的。
插件化原理
相关知识
android ClassLoader加载class文件原理
Java反射原理
Android资源加载原理
四大组件加载原理
Manifest处理
3.png宿主Manifest merge了所有的Manifest(默认的不会合并插件中的Manifest,要自己做-完成清单文件的合并)
插件中类的加载
4.png宿主apk因为已经安装,所以有pathclassloader就够用了。各个业务插件apk因为没有安装,所以没有classloader。所以要插件化创建classloader加载对应的class文件。
产生两个问题:
如何自定义classLoader加载类文件;
如何调用插件apk文件中的类
代码演示模拟上面问题的解决
5.pngapp中的MainActivity:
6.png将bundle打成apk传入push到指定路径中。
7.png运行主app
8.png成功。类加载原理演示完毕
自定义一个自己的ClassLoader
9.png所以 虽然apk并没有被安装,但可以被classloader调用了。
是不是为每个apk都创建一个classloader?
是,
1、Android是为每个app创建classloader;
2、不创建的话,路径一样的类只要初始化一次就不会被加载。
插件中资源加载
android 提供哪些类来加载资源
10.png核心还是AssetManager。
插件没有Resource类和AssetManager类,需要插件化框架去动态创建。
当前主流框架做法:
11.png为每个插件(bundle)分别创建AssetManager加载资源路径。
核心技术总结
处理所有插件APK文件中的Manifest文件
管理宿主APK中所有的插件APK信息
为每个插件APK创建类加载器,资源管理器
模拟上面步骤
建立类模拟插件实体类:
12.png管理所有插件的管理类:
13.png小结
通过DexClassLoader确实可以加载未安装APK的dex文件。
为每个插件APK创建类加载器,资源管理器。
网友评论