Android 动态加载运行jar/dex


DexClassLoader 可以从jar或者apk文件中加载类,执行相关代码。

DexClassLoader 需要一个私有目录来缓存优化后的classes,注意不要将这个目录放在SD卡上。

File optimizedDexOutputDir = context.getDir(“dex”, 0); 使用DexClassLoader来加载类:

1
2
3
4
5
6
7
8
9
10
DexClassLoader cl = new DexClassLoader(dexStoragePath.getAbsolutePath(),
                        optimizedDexOutputDir.getAbsolutePath(),
                        null,
                        getClassLoader());

Class libProviderClazz = null;

libProviderClazz = cl.loadClass( com.example.dex.lib.LibraryProvider );
LibraryInterface lib = (LibraryInterface) libProviderClazz.newInstance();
lib.showAwesomeToast(view.getContext(), hello);

这里使用了接口对loadClass进行了类型转化,当然也可以使用反射,不过反射是复杂和低效的。

总结一下,加载jar/apk中类的步骤如下:

1、获取jar/apk文件

2、通过DexClassLoader类加载器来解析优化jar/apk文件

3、通过loadClass函数来载入类

4、通过newInstance来生成类的对象,并使用

在下面的这两篇篇博客中详细介绍了DexClassLoader的使用。

http://yunfeng.sinaapp.com/?p=87

http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html

http://yunfeng.sinaapp.com/?p=87这篇文章中提到需要将jar/apk拷贝到私有目录再加载,经过测试,这是不需要的,jar/apk在SD卡中也可以。

Custom Class Loading in Dalvik Android Developers Blog