Можно ли загрузить apk, который я разместил в моей папке res/raw/
, используя ClassLoader? И для загрузки apk я использую openRawResources().
Вы всегда можете выгружать этот файл в файловую систему и загружать его с помощью отражения и DexFile, что дает вам доступ на основе отражения к вашему классу.
Я не знаю, можете ли вы сделать это из актива, но если вы извлечете актив в файловую систему, вы можете использовать следующую последовательность (которая игнорирует исключения, которые вам нужно обработать). Отсюда вы можете использовать обычные методы отражения на 'loadedClass'.
DexClassLoader classLoader = new DexClassLoader(
"/path/to/your/apk", getFilesDir().getAbsolutePath(),
null, getClass().getClassLoader());
Class<?> loadedClass = classLoader.loadClass("full.package.and.class.name");
Вы можете загрузить файл APK-, но вы не можете просто "запустить" его (так как сначала нужно установить приложение), и ваше приложение не сможет устанавливать новые приложения (из-за политики безопасности).
Если вам нужно другое приложение для вашей программы, вы должны упомянуть об этом при первом запуске или что-то в этом роде.
Вы можете открыть .apk
-file, используя что-то, чтобы распаковать (например, 7zip). Но вы не можете использовать классы внутри него, так как в нем нет нормального .class
-file s.
Это связано с тем, что Android не использует обычный JVM, а DVM. Это JVM, основанный на проекте Apache Harmony и оптимизированный для работы на устройствах с низкой памятью (например, Android-телефоны). Этот JVM не использует обычный Java Byte- Code (который находится в .class
-file s), но имеет собственный Dalvik- Byte- код, созданный Android SDK (инструмент dx
) при экспорте проекта.
Итак, чтобы сделать это коротко: вы не можете получить доступ к классам в файле APK- из вашего приложения. Нет, если у вас нет исходного кода для компиляции классов самостоятельно.
См. Статья в Википедии.