3

我将一个包含 .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();
}
4

2 回答 2

3

你应该阅读官方指南关于

DexClassLoader

一个类加载器,它从包含 classes.dex 条目的 .jar 和 .apk 文件加载类。这可用于执行未作为应用程序的一部分安装的代码。

路径类加载器

提供一个简单的 ClassLoader 实现,它对本地文件系统中的文件和目录列表进行操作,但不尝试从网络加载类。Android 将此类用于其系统类加载器和应用程序类加载器。

实例化DexClassLoader以从提取的辅助 dex 文件中加载库。

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

于 2016-05-18T10:08:01.407 回答
2

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

在以前的版本(8.0 和更早版本)中,DexClassLoader接受一个参数 for String optimizedDirectory,它允许调用者为类加载器加载的 Dex 指定存储优化的 Dex 代码(ODEX 文件)的目录。这个论点在较新版本的 Android 中仍然存在,但没有任何作用

于 2020-01-31T16:04:43.563 回答