DexClassLoader和PathClassLoader有什么区别?

时间:2016-05-18 09:57:29

标签: android dexclassloader

我将包含.dex文件的.jar文件放到目录" / sdcard",然后我尝试分别使用DexClassLoader和PathClassLoader在.jar文件中加载该类。它们都可以成功加载类。他们之间有什么区别? 这是我的代码:

String dexPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.jar";
PathClassLoader classLoader1 = new PathClassLoader(dexPath, getClassLoader());
DexClassLoader classLoader2 = new DexClassLoader(dexPath, getDir("dex", 0).getAbsolutePath(), null, getClassLoader());
try {
     Class clazz1 = classLoader1.loadClass("com.focans.loader.Peter");
     Class clazz2 = classLoader2.loadClass("com.focans.loader.Peter");
} catch (Exception e) {
     e.printStackTrace();
}

2 个答案:

答案 0 :(得分:2)

您应该阅读官方的指南

<强> DexClassLoader

  

从.jar和.apk文件加载类的类加载器   一个classes.dex条目。这可用于执行未安装的代码   申请的一部分。

<强> PathClassLoader

  

提供一个在列表上运行的简单ClassLoader实现   本地文件系统中的文件和目录,但没有   尝试从网络加载类。 Android使用此类   它的系统类加载器及其应用程序类加载器。

实例化

DexClassLoader 以从提取的辅助dex文件加载库。

PathClassLoader 用于在ant中加载类,其路径与用于启动ant的类路径不同。请注意,即使该类在系统类路径上使用forceLoadClass方法,也可以强制类进入此加载器。然后,该类加载的任何后续类将使用此加载器而不是系统类加载器。

答案 1 :(得分:2)

对于Android 8.1(API 27)及更高版本,DexClassLoaderPathClassLoader基本相同。它们既extend BaseDexClassLoader,又在构造时立即调用super()。没有实现上的差异或副作用(至少在我这里引用的AOSP版本中)。

在以前的版本(8.0和更早版本)中,DexClassLoader接受了String optimizedDirectory的参数,该参数允许调用者为存储的Dex指定目录来存储优化的Dex代码(ODEX文件)。由类加载器。此参数在更新的Android版本中仍然存在,但has no effect