您的位置:首页 > 移动开发 > Android开发

Android插件化及动态加载

2016-01-10 15:13 323 查看

缘由及作用

App方法爆棚

方法数超过了一个Dex最大方法数65535的上限,可以通过多个 Dex来解决这个问题,因而便有了插件化的概念,将一个App 划分为多个插件(Dex或相关格式)

其他解决方法还包括:删无用代码,用H5代替部分逻辑,买付费版的Proguard

作用

a、模块解耦;

b、动态升级;

c、高效并行开发(编译速度更快) ;

d、按需加载,内存占用更低;

e、节省升级流量

原理

插件化的原理实际是 Java ClassLoader 的原理,具体可参考Java ClassLoader基础

但是对比于java还是有区别的:

Java ClassLoader加载的是class文件到JVM

对于Android应用程序,本质上使用的是java开发,使用标准的java编译器编译出Class文件,和普通的java开发不同的地方是把class文件再重新打包成dex类型的文件,这种重新打包会对Class文件内部的各种函数表、变量表等进行优化,最终产生了dex文件。

在Android中可以动态加载,但无法像Java中那样方便动态加载jar

原因:Android的虚拟机(Dalvik VM)是不认识Java打出jar的byte code,需要通过dx工具来优化转换成Dalvik byte code才行。这一点在Android项目打包的apk中可以看出:引入其他Jar的内容都被打包进了classes.dex。



将打包的jar包拷贝到SDK安装目录android-sdk-windows\platform-tools下,执行命令:dx –dex –output=test.jar suishen_exitpage_sdk.jar

Android ClassLoader

DexClassLoader API地址

用来从.jar和.apk类型的文件内部加载classes.dex文件,通过这种方式可以执行非安装的程序代码,作为程序的一部分进行运行。

PathClassLoader

只能加载已经安装到Android系统中的apk文件,一般用于系统应用。

DexClassLoader的使用:

调用构造函数,获得classLoader对象



通过classLoader加载相应的类,反射调用方法。



开源项目

dynamic-load-apk

缺点:遵守一套插件apk的开发规范,开发不便。

DynamicLoadApk 源码解析

git上源码地址

AndroidDynamicLoader

git上源码地址

参考文章

Android 插件化

Android动态加载jar/dex

携程Android App插件化和动态加载实践
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  插件