$ext - 拓展:加载Dex,Apk,Jar,So

  • 更新时间:2025-12-13 11:58:45

加载DexApkJarSo拓展API

$ext顾名思义就是"拓展"的意思,主要用来加载第三方库,拓展本应用中没有的功能。

加载apk(apk路径)

加载apk文件

  • 参数 : apk路径 {字符串} apk文件路径

  • 返回 : {DexClassLoader} 类加载器

  • 版本 : 1.7.0

$拓展.加载apk("/sdcard/测试.apk");

加载dex(dex路径)

加载dex文件

$拓展中存在一个内置的缓存机制,被加载的dex文件会被生成一个唯一的id作为类加载器的标识,

在起初加载dex文件的时候会保存id和类加载器对象

当再次加载相同的dex文件时,会通过id直接取得类加载器对象来执行类

如果想重新加载需要调用$拓展.clear()清除id和类加载器

  • 参数 : dex路径 {字符串} dex文件路径

  • 返回 : {DexClassLoader} 类加载器

  • 版本 : 1.7.0

$拓展.加载dex("./res/demo.dex");
//开始使用dex中的类

加载多个dex(路径数组)

加载多个dex文件

  • 参数 : 路径数组 {字符串数组[]} dex文件路径

  • 返回 : {DexClassLoader} 类加载器

  • 版本 : 1.7.0

//加载多个dex文件(传入所有dex文件的路径数组即可)
$拓展.加载多个dex(["/res/demo1.dex","/res/demo2.dex","/res/demo3.dex"]);

加载jar(jar路径)

加载jar文件

$拓展中存在一个内置的缓存机制,被加载的jar文件会被生成一个唯一的id作为类加载器的标识,

在起初加载jar文件的时候会保存id和类加载器对象

当再次加载相同的jar文件时,会通过id直接取得类加载器对象来执行类

如果想重新加载需要调用$拓展.clear()清除id和类加载器

注意:被加载的jar必须经过安卓开发环境(AndroidStudio)编译生成class字节码归档文件才可被加载

  • 参数 : jar路径 {字符串} jar文件路径

  • 返回 : {DexClassLoader} 类加载器

  • 版本 : 1.7.0

$拓展.加载jar("/res/demo.jar");
//开始使用jar中的类

加载多个jar(jar路径数组)

加载多个jar文件

注意:被加载的jar必须经过安卓开发环境(AndroidStudio)编译生成class字节码归档文件才可被加载

  • 参数 : jar路径数组 {字符串数组[]} jar文件路径

  • 返回 : {DexClassLoader} 类加载器

  • 版本 : 1.7.0

//加载多个jar文件(传入所有jar文件的路径数组即可)
$拓展.加载多个jar(["/res/demo1.dex","/res/demo2.dex","/res/demo3.dex"]);

加载dex(配置)

加载dex/so文件

值得注意的就是so文件也有很多架构(x86_64,arm64_v8a等),根据自己手机的架构来选择需要加载的so文件(安卓特性); 此外:如果dex(java代码)中已经使用System.load(so);加载过的so文件不要重复加载,因为so文件只能被类加载器加载一次(安卓机制)

  • 参数 : 配置 {LoadExtConfig} 加载配置

  • 返回 : {DexClassLoader} 类加载器

  • 版本 : 1.7.0

定义 配置 = {
    路径:["dexOrJar路径"],//jar或者dex文件路径数组(可以传入多个dex或jar文件路径)
    so:[
         {路径:"so路径", 加载:},
         {
           路径:"so路径",//so文件路径
           加载://是否执行系统加载System.load(so);
         },
         //...
    ]
}
$拓展.加载dex(配置);
//开始使用dex里面的类

加载jar(配置)

加载jar/so文件

值得注意的就是so文件也有很多架构(x86_64,arm64_v8a等),根据自己手机的架构来选择需要加载的so文件(安卓特性); 此外:如果dex(java代码)中已经使用System.load(so);加载过的so文件不要重复加载,因为so文件只能被类加载器加载一次(安卓机制)

注意:被加载的jar必须经过安卓开发环境(AndroidStudio)编译生成class字节码归档文件才可被加载

  • 参数 : 配置 {LoadExtConfig} 加载配置

  • 返回 : {DexClassLoader} 类加载器

  • 版本 : 1.7.0

定义 配置 = {
    路径:["dexOrJar路径"],//jar或者dex文件路径数组,可以传入多个dex或jar文件路径
    so:[
         {路径:"so路径", 加载:},
         {
            路径:"so路径",//so文件路径
            加载://是否执行系统加载System.load(so);
         },
         //...
    ]
}
$拓展.加载jar(配置);
//开始使用jar里面的类

加载apk(配置)

加载apk/so文件

  • 参数 : 配置 {LoadExtConfig} 加载配置

  • 返回 : {DexClassLoader} 类加载器

  • 版本 : 1.7.0

定义 配置 = {
    路径:["apk路径"],//数组格式,但是只支持一个apk路径,传入多个apk文件路径,只会加载第一个apk文件
    so:[
         {路径:"so路径", 加载:},
         {
            路径:"so路径",//so文件路径
            加载://是否执行系统加载System.load(so);
         },
         //...
    ]
}
$拓展.加载apk(配置);
//开始使用apk里面的类

清除缓存()

清除缓存的类加载器

$拓展中存在一个内置的缓存机制,被加载的jar/dex文件会被生成一个唯一的id作为类加载器的标识,

在起初加载jar/dex文件的时候会保存id和类加载器对象

当再次加载相同的jar/dex文件时,会通过id直接取得类加载器对象来执行类

如果想重新加载需要调用$拓展.清除缓存()清除id和类加载器

如果只是单纯的加载dex/jar文件,这个函数可以随便调用; 但是如果加载了so文件,这个函数最好只使用一次,因为so文件只能被一个类加载器加载一次

就算不小心把加载过so文件的类加载器清空了也没有关系,重启app重新运行即可。

  • 版本 : 1.7.0

$拓展.清除缓存();

删除缓存()

删除缓存文件

dex加载必须要在安卓的私有目录(安卓机制),所以每次加载的dex文件都会放在私有目录下面

然而我们最主要只是拿到类加载器,当加载完后dex文件也就不需要了,所以可以调用这个函数来删除dex文件

  • 版本 : 1.7.0

$拓展.删除缓存();