Android DexClassLoader



  DexClassLoader   是Android SDK里面的,它的相关描述可参考官方文档:   http://www.android-doc.com/reference/dalvik/system/DexClassLoader.html


当APP里面的功能太多时,后期的开发或升级时通常采用插件化的技术,插件化有很多优点:

(1) 模块解耦,(2) 动态升级,(3) 高效并行开发(编译速度更快) (4) 按需加载,内存占用更低 (5) 节省升级流量  

Android 动态加载 —— 这个实际是更高层次的概念,也有叫法是热加载或 Android 动态部署,指容器(App)在运⾏状态下动态加载某个模块,从而新增功能或改变某⼀部分行为

插件化的原理实际上类似于JAVA里面的ClassLoader,Android中为DexClassLoader,DexClassLoader 可以加载外部的 apk、jar 或 dex文件,并且会在指定的路径存放其 dex 文件。在了解它之前,必须先了解Java ClassLoader的原理:

 JVM 还是 Dalvik 都是通过 ClassLoader(双亲委托:loadClass 会先看这个类是不是已经被 loaded 过,没有的话则去他的 parent 去找,如此递归) 去加载所需要的类,类唯一的识别是 ClassLoader id + PackageName + ClassName,如果这两个”类”不是由一个 ClassLoader 加载,是无法将一个类的示例强转为另外一个类的,这就是 ClassLoader 隔离。

在Android中,每一个ClassLoader必须有一个父ClassLoader,在装载Class文件时,子ClassLoader会先请求其父ClassLoader加载该文件,只有当其父ClassLoader找不到该文件时,子ClassLoader才会继承装载该类。这是一种安全机制。对于Android而言,最终的apk文件包含的是dex类型的文件,dex文件是将class文件重新打包,打包的规则又不是简单地压缩,而是完全对class文件内部的各种函数表,变量表进行优化,产生一个新的文件,即dex文件。因此加载这种特殊的Class文件就需要特殊的类加载器DexClassLoader。

现在开源的插件化框架有:

(1) DynamicLoadApk: DexClassLoader 加 Activity代理 ,在容器中注册几个代理的 Activity,启动插件的 Activity 时实际启动的都是代理的 Activity,这样就解决了 Activity 必须注册的问题。

(2) AndroidDynamicLoader:他不是用代理 Activity 的方式实现而是用 Fragment 以及 schema 的方式实现  

(3) Android PluginManager:DexClassLoader 加 Activity 代理,不同的是上面的 dynamic-load-apk 项目中,插件需要依赖框架的 lib,插件组件继承框架 lib 的 Base 组件。而这个框架通过字节码操作动态生成一个子类去继承插件组件解决插件必须依赖框架的问题,从而达到插件无需做任何改动即可加载的效果。

查看更多的插件开源项目可参考:http://p.codekk.com/?s=%E6%8F%92%E4%BB%B6%E5%8C%96


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值