Внедрение байт-кода Java на Android

Я понимаю, что это невозможно, поскольку в Android нет JVM, но есть ли решение этой проблемы? Мне нужно выполнить операцию внедрения байт-кода для приложения Android. Какие-либо предложения?


person Mike G    schedule 22.11.2011    source источник
comment
Вы проверили это поток?   -  person CRM    schedule 22.11.2011
comment
И вот этот.   -  person Dave Newton    schedule 22.11.2011


Ответы (3)


Вы не можете напрямую вводить байт-код в уже загруженные классы/методы. Однако вы можете динамически создавать новые классы, записывать их в dex-файл, а затем динамически загружать их.

См. эту запись в блоге для получения дополнительной информации. при динамической загрузке классов из dex файла на диск.

Чтобы динамически создать новый файл dex, вы можете использовать dexlib, который является частью кодовой базы smali/baksmali, которая является общей целевая библиотека для чтения/записи файлов dex.

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

person JesusFreke    schedule 22.11.2011

Внедрение кода возможно в Android, ознакомьтесь с проектом Disabler, размещенным на Github.

Disabler позволяет оптимизировать, отслеживать и модифицировать проект Android на лету, используя вставку кода в существующий проект. Код внедряется на лету, нет необходимости модифицировать старые функции для добавления ведения журнала/профилирования или отключения части потока.

Основные функции инструмента:

  1. трассировка: вход/выход в/из метода, сбор параметров и выходное значение)
  2. profile: измерение частоты и продолжительности вызовов методов
  3. отключить: отключение/пропуск части потока программы путем переопределения возвращаемого значения из методов, определенных пользователем
  4. задержка: ввести задержки в определенных участках кода (т.е. для определенных пакетов)

Под капотом используется механизм сборки AspectJ и Eclipse (javac заменен на ajc).

person Andrei Karpushonak    schedule 13.01.2013
comment
@Привет, как я могу использовать проект? У вас есть какие-нибудь примеры? - person P basak; 15.01.2014
comment
да, посмотрите здесь: github.com /miktam/Disabler/blob/master/src/com/devoxx/disabler/ Также посмотрите выступление — там много примеров: devoxx.com/display/DV12/Code+injection+in++Android - person Andrei Karpushonak; 15.01.2014
comment
Привет, но поддерживаете ли вы внедрение кода на лету для приложений Android в формате dex? Я имею в виду приложения без исходного кода. Например, я запускаю приложение и пытаюсь внедрить свои собственные классы для целей тестирования? - person P basak; 25.01.2014

Вы хотите внедрить во время выполнения или во время компиляции?

Для времени компиляции - есть несколько очень зрелых решений для управления исходным кодом / байт-кодом Java - ASM, java-assist и т. Д.

Конкретно для андроида попробуйте ASMDEX

http://asm.ow2.org/doc/tutorial-asmdex.html

person YAZR    schedule 06.09.2016