gpt4 book ai didi

java - 在运行时将 dex 添加到 Android 类路径

转载 作者:行者123 更新时间:2023-11-30 11:31:22 25 4
gpt4 key购买 nike

我目前正在开发一个分布式系统,其节点能够从服务器下载 jar 和 dex 文件以在运行时改变它们的行为。 Not-Android节点添加jar使用如下代码调用ClassLoader提供的addURL方法:

File f = new File(fileName);
URL u = f.toURI().toURL();

URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();

Class<?> sysclass = URLClassLoader.class;

try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysloader, new Object[] { u });
} catch (Throwable t) { }

是否可以对 Android 节点上的 dex 文件执行相同的操作? DexClassLoader 和 PathClassLoader 没有提供 addURL 等方法。我知道我可以使用反射添加单个类,但我不知道如何添加整个 dex 文件。问题是,如果我将所有类一一添加到 dex 中,则会出现缺少依赖项的异常。这是因为一个类可能依赖于另一个仍然需要添加的类。无论如何,我用来添加单个类的代码如下。

File f = new File(pathToSaveFile + dexFile);
Object obj = null;
final File optimizedDexOutputPath = context.getDir("outdex", 0);

DexClassLoader classLoader = new DexClassLoader(
f.getAbsolutePath(),
optimizedDexOutputPath.getAbsolutePath(), null,
context.getClassLoader());

String path = pathToSaveFile + dexFile;

try {
DexFile dx = DexFile.loadDex(
path,
File.createTempFile("opt", "dex", context.getCacheDir()).getPath(),
0);
Class<?> myClass = classLoader.loadClass(className);
} catch (Exception e) { }

我知道执行动态代码卸载的安全问题,但这只是一个研究项目。

最佳答案

尝试 https://gist.github.com/nickcaballero/7045993 中的代码

这种方法将您新创建的 DexClassLoader 附加到现有的 DexClassLoader。

请注意,它使用反射,因此它可能不适用于所有 Android 版本。至少它适用于我的 SDK19。

关于java - 在运行时将 dex 添加到 Android 类路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17215284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com