Small
流程:创建app,集成small,宿主module中初始化small
strictSplitResources = false :是否严格执行资源分割
创建插件module名字为APP.main 包名为com.example.appmain
创建assets文件夹和bundle.json文件记录module信息,所有的插件都需要在bundle.json中添加uri和pkg信息
Small.setup进行跳转
创建一个公共库 库名lib.network module名 lib.network 包名:com.example.libnetwork
公共库和普通库的区别:公共库呗打包成一个so文件可以独立更新。
定义公共库有两种方法:
1.指定module name 为 lib.***
2.在small DSL 中显示指出bundls lib ***
Atlas
阿里独立研发和开源的一种插件化技术方案,功能强大且复杂,使用于大型app
核心原理与samll相同,都是提供能够加载插件中的类,资源“动态加载”
Atlas的整体结构:
第一层:hack层,负责系统层面注入和hack工具初始化
第二层:bundle层,主要负责管理bundle的声明周期
第三层:runtime层,负责给bundle查找类和资源
第四层:对外接入层,处理插件的applicaiton和清单文件
Atlas的类加载机制:atlas中会创建两种classlaoder,第一个是DelegateClassloader作为一个类查找的路由存在,本身不负责真正的类加载。它被启动时会被atlas注入loaderApk中。替换原有的pathclassloader,第二个是bundleclasslaoder,每个bundle 在resolve的时候会分配一个bundleclassloader,负责该bundle的类加载(概括就是,delegateclassloader以bootclasslaoder为parent,而它本身又有类似于路由的功能,可以引用pathclassloader,从而找到所有的bundlerclasslaoder)
Atlas的资源加载机制:loadedApk中的资源会被替换成Atlas内部的delegateResource,在每个bundle的安装过程中,每个bundle的assetspath会被更新到delegateResource的AssetsMananger
Bundle的生命周期:
1.installed:bundle被安装到storage目录
2.Resolved:classloader被创建,assetspath注入delegateResource
3.Active:bundle通过了安全校验,bundle的dex检测已经成功dexopt,resouece已经成功注入
4.Started:bundle开始运行,调用applicaiton的oncreate方法
bundle的构建过程中,每个bundle会被独分区,packeld保证全局唯一。packgeid在host的构建工程内会有packageidFile.properties进行统一分配。
每个bundle都在清单文件中声明了自己的packagename,但是在aapt的过程中,arsc文件里所有的bundle的packagename均被统一为hostapk的packge,