2013-06-20 4 views
2

В настоящее время я разрабатываю распределенную систему, узлы которой могут загружать файлы 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) { } 

Я отдаю себе отчет в вопросах безопасности при выполнении динамического кода разгрузки, но это всего лишь исследовательский проект.

ответ

1

код Попробуйте https://gist.github.com/nickcaballero/7045993

Этот метод вид добавляет вновь созданный DexClassLoader к существующему.

Обратите внимание, что оно использует отражение, поэтому может не работать для всех версий Android. По крайней мере, это работает на моем SDK19.

+0

Это работает. Thanks – aleGrazioli

+0

Рад, что это помогает. Завершите некоторое время, и теперь у Google появилась официальная поддержка multi-dex (главным образом, чтобы обойти известный предел метода 65k). Для подробностей вы можете обратиться к https://github.com/casidiablo/multidex. Этот код, вероятно, будет охватывать больше версий API. – weidongxu

Смежные вопросы