Я пишу инструментарий на байт-коде Dalvik, который выполняет некоторую регистрацию для различных записей вызова метода. В частности, на различных сайтах вызова методов я буду вставлять набор инструкций, которые собирают параметры, помещают их в массив Object[]
, а затем передают их функции регистрации.
Это все хорошо, я внедрил и преодолел все кладжи для большинства приложений. Но я столкнулся с одной особенно непроницаемой ошибкой верификатора Dalvik:
java.lang.VerifyError: Verifier rejected class io.a.a.g: void io.a.a.g.r()
failed to verify: void io.a.a.g.r(): [0x570] register v5 has type Reference:
java.lang.Object but expected Precise Reference: java.lang.String
Я посмотрел на код, генерируемый моей аппаратурой, и все, что я делаю, это помещаю регистр v5 в массив объектов.
У меня есть несколько вопросов:
- Что такое точная ссылка и почему она несовместима со ссылками?
- Что здесь означает смещение?
[0x570]
указывает на середину инструкции байт-кода, поэтому она явно не соответствует каким-либо инструкциям: инструкции там не включаютv5
. - Как мне это отладить? В идеале я хотел бы знать, что, по мнению верификатора, должно происходить, и исправить это.
РЕДАКТИРОВАТЬ:
Вот дамп байт-кода метода, о котором я говорю. https://gist.github.com/kmicinski/c8382f0521b19643bb24379d91c47d36 Как видите, 0x570 не t в начале инструкции, и (насколько я могу судить) нет места, где r5 конфликтует со строкой, где она должна быть объектом.