美文网首页
插件化1、原理深入讲解

插件化1、原理深入讲解

作者: flynnny | 来源:发表于2021-04-02 01:39 被阅读0次

插件化相关知识介绍

出现背景

app体积越来越大,功能模块越来越多;
模块耦合度越来越高,协同开发沟通成本极大;
方法数可能超过65535,占用内存过大。

门户型大型app必须解决这类问题

如何解决

将一个大的apk按照业务分割成多个小的apk
每个小的apk既可以独立运行又可以作为插件运行

哪些优势

业务模块基本完全解耦
高效的并行开发,(编译测试速度更快)
按需加载,内存占用更低。(不加载的类不占用内存)

插件化相关概念

宿主:主APk 可以加载插件,也称为Host;
插件:插件App 被宿主加载的app,可以是跟普通app一样的apk文件;
插件化:将一个应用按照宿主插件的方式改造就叫插件化。

插件化后结构对比

1.png

update.so和firstbundle.so是用到的apk文件

与组件化对比

组件化是一种编程思想,插件化是一种技术;
组件化是为了代码高复用性出现的;
插件化是为了解决应用越来越庞大而出现的。

与动态更新对比

与动态更新一样,都是动态加载技术的应用;
动态更新是为了解决线上bug或者小功能的更新而出现;
插件化是为了解决应用越来越大而出现的。

2.png

插件化原理

相关知识

android ClassLoader加载class文件原理
Java反射原理
Android资源加载原理
四大组件加载原理

Manifest处理

3.png

宿主Manifest merge了所有的Manifest(默认的不会合并插件中的Manifest,要自己做-完成清单文件的合并)

插件中类的加载

4.png

宿主apk因为已经安装,所以有pathclassloader就够用了。各个业务插件apk因为没有安装,所以没有classloader。所以要插件化创建classloader加载对应的class文件。

产生两个问题:
如何自定义classLoader加载类文件;
如何调用插件apk文件中的类

代码演示模拟上面问题的解决

5.png

app中的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创建类加载器,资源管理器。

相关文章

网友评论

      本文标题:插件化1、原理深入讲解

      本文链接:https://www.haomeiwen.com/subject/aasxkltx.html