我正在尝试加载没有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包中?
谢谢。
答案 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的问题。