Каковы входы и выходы в байт-коде Dalvik?

В коде dex (например, созданном инструментом dexdump) для каждого определения метода я вижу «входы» и «выходы» в дополнение к другим метаданным, таким как «регистры», «размер inns».

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

Итак, мой вопрос: что представляют собой эти «входы» и «выходы»?

(к вашему сведению: для этого я использую dexlib2.)


person Saswat Anand    schedule 03.12.2014    source источник
comment
Разместите этот вопрос в суперпользователе Stackoverflow: D   -  person Jorgesys    schedule 04.12.2014


Ответы (1)


Эти поля описаны на странице http://source.android.com/devices/tech/dalvik/dex-format.html.

ins_size | количество слов входящих аргументов метода, для которого предназначен этот код

outs_size | количество слов пространства исходящих аргументов, необходимое этому коду для вызова метода

ins_size в основном не требует пояснений - это количество 32-битных слов, необходимых для хранения аргументов метода (включая неявный аргумент this для нестатических методов). Для всех аргументов требуется 1 слово, кроме длинных (J) и двойных (D), для которых требуется 2 слова.

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

Если вы хотите инструментировать dex-файл, не беспокоясь о таких деталях, вы можете использовать dexlib2 (библиотека, разработанная и используемая smali/baksmali для чтения/записи файлов dex). Библиотека доступна в репозитории maven, так что легко связать, если вы используете gradle/mvn.

person JesusFreke    schedule 04.12.2014
comment
Я использую MutableMethodImplementation dexlib2 для инструментирования. - person Saswat Anand; 04.12.2014
comment
Тогда вам не придется беспокоиться о входах и выходах. dexlib2 рассчитает их соответствующим образом, когда вы запишете новый файл dex. Ваша проблема, вероятно, заключается в том, что какой-то регистр стирается сделанной вами модификацией или чем-то подобным. Я рекомендую смотреть logcat во время установки приложения на наличие ошибок проверки dalvik/art. - person JesusFreke; 04.12.2014