Android 插件化框架

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,

 

 

 


版权声明:本文为qq_39636852原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。