缘由及作用

  1. App方法爆棚
    方法数超过了一个Dex最大方法数65535的上限,可以通过多个 Dex来解决这个问题,因而便有了插件化的概念,将一个App 划分为多个插件(Dex或相关格式)
    其他解决方法还包括:删无用代码,用H5代替部分逻辑,买付费版的Proguard
  2. 作用
    a、模块解耦;
    b、动态升级;
    c、高效并行开发(编译速度更快) ;
    d、按需加载,内存占用更低;
    e、节省升级流量

原理

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

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

  1. Java ClassLoader加载的是class文件到JVM
  2. 对于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。

byteagent Java 增强式插件 java 插件化_Android


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

Android ClassLoader

  1. DexClassLoader API地址
    用来从.jar和.apk类型的文件内部加载classes.dex文件,通过这种方式可以执行非安装的程序代码,作为程序的一部分进行运行。
  2. PathClassLoader
    只能加载已经安装到Android系统中的apk文件,一般用于系统应用。

DexClassLoader的使用:

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

byteagent Java 增强式插件 java 插件化_Android_02


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

byteagent Java 增强式插件 java 插件化_Android_03