了解了android中类加载的前期知识点后,来看看android中DexClassLoader具体的实现
具体加载流程如下:
宿主程序会到文件系统比如SD卡中去加载APK【1】,然后通过一个叫proxy的Activity去执行apk中的Activity
关于动态加载ap,理论上可用用到DexClassLoad、PathClassLoader、URLClassLoader;
DexClassLoader: 可以加载文件系统上的jar、dex、apk
PathClassLoader:可以加载 /data/app 目录下的apk,这也意味着它只能加载已经安装的apk
URLClassLoader:可以加载java中的jar,但由于android中的dalvik不能直接识别jar,所有该方法在android中无法使用,虽然有这个类
获取AssetsManager
加载的方法是通过反射,通过调用AssetManager中的addAssetPath方法,我们可以将一个apk中的资源加载到Resources中,由于addAssetPath是隐藏api我们无法直接调用,所以只能通过反射,下面是它的声明,通过注释我们可以看出,传递的路径可以是zip文件也可以是一个资源目录,而apk就是一个zip,所以直接将apk的路径传给它,资源就加载到AssetManager中了,然后再通过AssetManager来创建一个新的Resources对象,这个对象就是我们可以使用的apk中的资源了
封装数据:
1:把classLoader、assetManager、resource作为插件的成员,封装成bean
2:多插件时通过Map维护,其中key为apk的packageName
插件加载到内存流程:
具体加载流程如下:
宿主程序会到文件系统比如SD卡中去加载APK【1】,然后通过一个叫proxy的Activity去执行apk中的Activity
关于动态加载ap,理论上可用用到DexClassLoad、PathClassLoader、URLClassLoader;
DexClassLoader: 可以加载文件系统上的jar、dex、apk
PathClassLoader:可以加载 /data/app 目录下的apk,这也意味着它只能加载已经安装的apk
URLClassLoader:可以加载java中的jar,但由于android中的dalvik不能直接识别jar,所有该方法在android中无法使用,虽然有这个类
获取AssetsManager
加载的方法是通过反射,通过调用AssetManager中的addAssetPath方法,我们可以将一个apk中的资源加载到Resources中,由于addAssetPath是隐藏api我们无法直接调用,所以只能通过反射,下面是它的声明,通过注释我们可以看出,传递的路径可以是zip文件也可以是一个资源目录,而apk就是一个zip,所以直接将apk的路径传给它,资源就加载到AssetManager中了,然后再通过AssetManager来创建一个新的Resources对象,这个对象就是我们可以使用的apk中的资源了
封装数据:
1:把classLoader、assetManager、resource作为插件的成员,封装成bean
2:多插件时通过Map维护,其中key为apk的packageName
插件加载到内存流程:
加载插件的Activity:
›
插件
Activity
本身无法启动(生命周期,资源等问题),是通过宿主提供的
ProxyActivity
来加载的。
›
当我们发
Intent
去启动插件当
Activity
时实质启动的是
ProxyActivity
›
为了封装细节所以封装了
DXIntent
›
所有插件实现了
IDXPlugin
接口
PrxoyActivity接管了所有插件Activity
DXPluginBean 封装bean
›
封装了每个
Plugin
也就是
apk
的数据
›
维护在
DXPluginManger
类的
Map
中
DXPluginManager 插件管理核心类
›
加载插件、
启动插件、
插件维护
IDXPlugin:
›
把每个插件的
Activity
抽象成一个“插件”
›
IDXPlugin
实现了
Activity
的主要方法
›
onAttach
方法是插件专用的回调方法,当插件
Activity
被
Proxy
加载当时候
,
把
proxy
的引用赋值给
that
DXIntent:
›
pluginPackgeName:
跳转的
Plugin
的包名,也就是
Manifest
里的
packageName
pluginClassName:跳转的Plugin中指定的ActivityName,可以传null,则默认时跳转main Activity
DXPluginBaseActivity、DXPluginBaseFragmentActivity:
所有插件Activity继承这两个Activity
该Activity实现IDXPlugin接口
onAttach方法中获得proxyActivity的引用
›
所有
activity
继承方法中需要对插件本身启动还是在宿主中被启动进行判断 ----》FROM_INTERNAL和FROM_EXTERNAL
DXProxyActivity、DXProxyFragmentActivity :.
›
宿主
Activity
›
在
host
中调用插件
Activity
的跳转,本质就是这两个
Activity
之间的跳转
›
为插件提供真正的
Context
›
为减少重复代码将插件的初始化放在
DXPluginInitializer
类中
DXPluginInitializer
›
修复
theme
带来的崩溃问题
›
启动插件
Activity
1 通过反射获得插件Activity的默认构造函数
2 通过反射new出一个插件并强转成IDXPlugin
3 回调onAttach方法传入Prxoy的引用
4 调用onCreate方法调起插件
可以直接参考demo:
http://download.csdn.net/detail/yaya_soft/8858645