美文网首页
插件化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