Android удаленная загрузка кода

Это действительно звучит так, как будто ты ищешь больше для этого:

System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "<whatever>";
proc.Start();
16
задан sehugg 16 June 2009 в 14:43
поделиться

3 ответа

Я успешно использовал 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 () (у меня нет).

13
ответ дан 30 November 2019 в 22:31
поделиться

Действительно, все, что вы хотите, поддерживается и работает. 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);

Что касается рыночного вопроса, я не вижу здесь никаких проблем, но вы должны прочитать лицензионное соглашение, чтобы быть уверенным .

3
ответ дан 30 November 2019 в 22:31
поделиться

DexClassLoader - правильный ответ. Приложения никогда не должны использовать DexFile напрямую (он предназначен для использования загрузчиками классов).

Вы можете использовать внешнее хранилище ( / sdcard ) или область личных данных приложения для параметра dexOutputDir . Внешнее хранилище обычно больше, но если карта будет извлечена, ваше приложение будет убито, а из-за отсутствия принудительного применения разрешений для файлов третьим лицам будет легко заменить ваш код. Это может позволить вредоносным приложениям заставить ваше приложение выполнять произвольные действия. (Если вы все равно хотите это сделать, получите путь через Environment.getExternalStorageDirectory () ; требуется разрешение WRITE_EXTERNAL_STORAGE .)

Область личных данных приложения (получить путь from Context.getFilesDir () ) более безопасен, а также имеет то преимущество, что очищается автоматически при удалении приложения. Это рекомендуемый подход.

2
ответ дан 30 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: