Это действительно звучит так, как будто ты ищешь больше для этого:
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "<whatever>";
proc.Start();
Я успешно использовал DexClassLoader . Важно предоставить dexOutputDir
, который действительно может записывать ваше приложение, поэтому не / data / dalvik-cache
. В противном случае в журнале будет отображаться одна или две строки о невозможности записи в него, за которыми следует исключение ClassNotFoundException
.
cl = new DexClassLoader("/full/path/com.example.apk",
getFilesDir().getAbsolutePath(),// /data/data/foo/files
null, // native lib path, I haven't used this
MyClass.class.getClassLoader());
// This doesn't make Class.forName() work, instead I do this:
Class<?> foo = cl.loadClass("com.example.foo");
Чтобы заставить Class.forName ()
работать, вы можете попробовать Thread.setContextClassLoader () (у меня нет).
Действительно, все, что вы хотите, поддерживается и работает. DexClassLoader у меня работает не так, как ожидалось, но следующий код работает нормально.
DexFile df = new DexFile(new File("/data/app/my_downloaded_lib.apk"));
ClassLoader cl = getClassLoader();
Class clazz = df.loadClass("com/my/lib/MyClass", cl);
Что касается рыночного вопроса, я не вижу здесь никаких проблем, но вы должны прочитать лицензионное соглашение, чтобы быть уверенным .
DexClassLoader
- правильный ответ. Приложения никогда не должны использовать DexFile
напрямую (он предназначен для использования загрузчиками классов).
Вы можете использовать внешнее хранилище ( / sdcard
) или область личных данных приложения для параметра dexOutputDir
. Внешнее хранилище обычно больше, но если карта будет извлечена, ваше приложение будет убито, а из-за отсутствия принудительного применения разрешений для файлов третьим лицам будет легко заменить ваш код. Это может позволить вредоносным приложениям заставить ваше приложение выполнять произвольные действия. (Если вы все равно хотите это сделать, получите путь через Environment.getExternalStorageDirectory ()
; требуется разрешение WRITE_EXTERNAL_STORAGE
.)
Область личных данных приложения (получить путь from Context.getFilesDir ()
) более безопасен, а также имеет то преимущество, что очищается автоматически при удалении приложения. Это рекомендуемый подход.