В настоящее время я разрабатываю распределенную систему, узлы которой могут загружать файлы jar и dex с сервера, чтобы изменить их поведение во время выполнения. Не-Android узлы добавлять банки, используя следующий код для вызова метода addURL предоставленного ClassLoader:Добавление dex в classpath для Android во время выполнения
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) { }
Можно ли сделать то же самое с файлом DEX на Android узла? 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) { }
Я отдаю себе отчет в вопросах безопасности при выполнении динамического кода разгрузки, но это всего лишь исследовательский проект.
Это работает. Thanks – aleGrazioli
Рад, что это помогает. Завершите некоторое время, и теперь у Google появилась официальная поддержка multi-dex (главным образом, чтобы обойти известный предел метода 65k). Для подробностей вы можете обратиться к https://github.com/casidiablo/multidex. Этот код, вероятно, будет охватывать больше версий API. – weidongxu