Загрузите apk с помощью ClassLoader и openRawResources

Могу ли я загрузить apk, который я поместил в свою папку res/raw/, с помощью ClassLoader? И для загрузки apk я использую openRawResources().


person Hank    schedule 25.05.2011    source источник


Ответы (3)


Я не знаю, можете ли вы сделать это из ресурса, но если вы извлекаете ресурс в файловую систему, вы можете использовать следующую последовательность (которая игнорирует исключения, которые вам нужно будет обработать). Отсюда вы можете использовать обычные методы отражения для «loadedClass».

DexClassLoader classLoader = new DexClassLoader(
    "/path/to/your/apk", getFilesDir().getAbsolutePath(),
    null, getClass().getClassLoader());
Class<?> loadedClass = classLoader.loadClass("full.package.and.class.name");
person mah    schedule 25.05.2011

Вы всегда можете сбросить этот файл в файловую систему и загрузить его с помощью отражения и DexFile, что дает вам доступ к вашему классу на основе отражения.

person Kerem Kusmezer    schedule 21.02.2012

Вы, конечно, можете загрузить APK-файл, но вы не можете просто «запустить» его (так как сначала необходимо установить приложение), и ваше приложение не может устанавливать новые приложения (из-за политики безопасности).

Если вам нужно какое-то другое приложение для вашей программы, вы должны упомянуть об этом при первом запуске или что-то в этом роде.


Вы можете открыть .apk-файл, используя что-то для распаковки (например, 7zip). Но вы не можете использовать классы внутри него, так как в нем нет нормальных .class-файлов.

Это связано с тем, что Android использует не обычную JVM, а DVM. Это JVM, основанная на проекте Apache Harmony и оптимизированная для работы на устройствах с небольшим объемом памяти (например, на телефонах Android). Эта JVM не использует обычный байт-код Java (который находится в .class файлах), а использует собственный байт-код Dalvik, который создается Android SDK (инструмент dx) при экспорте вашего проекта.

Короче говоря: вы не можете получить доступ к классам в APK-файле из своего приложения. Нет, если у вас нет исходного кода для самостоятельной компиляции классов.

См. статью Википедии.

person Lukas Knuth    schedule 25.05.2011
comment
Я не хочу его устанавливать, я просто хочу классы, но как мне его загрузить? - person Hank; 25.05.2011
comment
Тогда как DexClassLoader получает файлы классов из apk? - person Hank; 25.05.2011
comment
Да, похоже, вы можете использовать его для загрузки .dex-файлов. См. здесь - person Lukas Knuth; 26.05.2011