如何在没有dex的Android上加载类

时间:2018-08-02 15:24:08

标签: java android dex

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

我用过

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

但这仅适用于项目中包含或编译的类。

我也用过

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

但我不知道如何获得optimizedDirectory

如果我不能使用非精简类,有人可以告诉我如何将现有的类(.jar中的.class)精编到新的jar包中?

谢谢。

1 个答案:

答案 0 :(得分:0)

好吧,我最终得到了命令

cd "C:\Android_Studio\Android\Sdk\build-tools\27.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()可以解决OptimizedDirectory的问题。