如何在没有 dex 的情况下在 Android 上加载 class

How to load class on Android without dex

我正在尝试加载没有 android SDK 编译的 .jar 文件(因此 classes 不会合并到 dex)。我花了很多时间尝试所有可能的方法(Javassist,系统默认 class 加载器...),现在我发现我需要使用 DexClassLoader 但(逻辑上)它只能加载 dexed classes .有没有可能加载非 dexed class 的方法?基本上我认为不,因为 Android 在 Dalvik 上 运行ning 可以 运行 only dex.

我用过

URLClassLoader child = new URLClassLoader(new URL[]{file.toURI().toURL()}, BotLoader.class.getClassLoader());
return Class.forName(className, true, child);

但这只适用于 classes included or compile with project.

我也用过

DexClassLoader classLoader = new DexClassLoader(
                pathToJar, tmp.getAbsolutePath(), null, BotLoader.class.getClassLoader());
        return classLoader.loadClass(className);

但我不知道如何获得 optimizedDirectory

如果我不能使用非 dexed classes,有人可以告诉我如何将我现有的 classes(.class in .jar)dex 到新的jar包?

谢谢。

好的,我结束了命令

cd "C:\Android_Studio\Android\Sdk\build-tools.0.3"
dx --dex --output="C:\Users\Intel i5\Desktop\ExamplePlugin\out\artifacts\plugin_main_jar\classes.dex" "C:\Users\Intel i5\Desktop\ExamplePlugin\out\artifacts\plugin_main_jar\plugin_main.jar"

生成 classes.dex,我手动将它们添加到 plugin_main.jar。我在应用程序中尝试过它并且有效。

在应用程序中,我使用了:

final File tmpDir = new File(activity.getCacheDir().toString());

tmpDir.mkdirs();

DexClassLoader classLoader = new DexClassLoader(
        pathToJar, tmpDir.getAbsolutePath(), null, BotLoader.class.getClassLoader());
return classLoader.loadClass(className);

代码 activity.getCacheDir() 实现了优化目录的技巧。