Получение байт-кода класса на Android

Я хочу отправить по сети файл класса (.class) для выполнения на удаленном сервере. Я не могу использовать сериализацию, потому что класс не существует на стороне сервера, и я хочу динамически добавлять новые классы. Я не хочу использовать RMI.

На Dekstop Java это легко сделать с помощью:

  • Загрузка класса с Class<?> clazz = Class.forName("mypackage.MyClass"),
  • Получение доступа к файлу (или jar-контейнеру) с помощью URL url = clazz.getResource("MyClass.class")

На Android мне удалось загрузить экземпляр класса с этим хаком, ноclazz.getResource() всегда возвращает ноль. (И это логично, поскольку формат хранения Dalvik другой).

Я пробовал Apache BCEL, но он не работает. Следующий код бросает ClassNotFoundException:

 JavaClass clazz = Repository .lookupClass("mypackage.mMyClass");
 byte[] b = clazz.getBytes();

Есть ли способ перевести байт-код Dalvik в байт-код обычного класса на Android, чтобы я мог восстановить из него файл.class и затем отправить его по проводам?

Благодарю.

1 ответ

Android не использует .class файлы. Оно использует .dex файлы, это совершенно другой формат. Инструменты, такие как dx а также dex2jar можно переводить туда и обратно большую часть времени, но это не идеально, потому что у каждого формата есть свои особенности, которые не совсем соответствуют другому.

Во всяком случае, я думаю, что проще всего было бы скомпилировать его на рабочем столе и собрать все .class файлы как ресурсы в вашем apk. Фактический код будет выполнен classes.dex но таким образом вы можете извлечь сохраненные файлы классов и отправить их на ваш сервер.

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

Другие вопросы по тегам