VerifyError для .access

Перенося приложение на Android 1.5, я постоянно исправляю ошибки VerifyError, но вот одна из них гораздо менее очевидна, чем обычно (полный журнал здесь):

W/dalvikvm( 6978): VFY: invalid reg type 8 on iput instr (need 6)
W/dalvikvm( 6978): VFY:  rejecting opcode 0x5c at 0x0004
W/dalvikvm( 6978): VFY:  rejected Lcom/ichi2/anki/CardEditor;.access$1776 (Lcom/ichi2/anki/CardEditor;I)Z
W/dalvikvm( 6978): Verifier rejected class Lcom/ichi2/anki/CardEditor;
W/dalvikvm( 6978): Class init failed in newInstance call (Lcom/ichi2/anki/CardEditor;)
D/AndroidRuntime( 6978): Shutting down VM
W/dalvikvm( 6978): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)
E/AndroidRuntime( 6978): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 6978): java.lang.VerifyError: com.ichi2.anki.CardEditor
E/AndroidRuntime( 6978):    at java.lang.Class.newInstanceImpl(Native Method)

Интересная строка выглядит так: rejected Lcom/ichi2/anki/CardEditor;.access

Сбивает с толку то, что в классе access. ="nofollow">CardEditor, ни его родительский класс Activity , на любом уровне общедоступного API. Исходный код Android без API фактически содержит ActivityThread.access, но я использую исключительно общедоступный API.

Этот класс CardEditor не импортирует скомпилированные библиотеки (jar или около того). Операторы импорта либо "android". или ссылаться на исходные файлы Java, которые находятся в одном проекте и, таким образом, перекомпилируются в одно и то же время. Если это имеет значение, вот как я всегда компилирую: ant clean debug, новый файл Ant, автоматически созданный Android SDK.


person Nicolas Raoul    schedule 01.12.2011    source источник


Ответы (1)


Возможно, вы столкнулись с ограничением Dalvik. Методы не могут генерировать более 65535 байт-кодов. Попробуйте определить самые большие методы в CardEditor и разбить их на части. Например, вызывая другие методы вместо того, чтобы кодировать сразу после каждого «кейса», и посмотрите, работает ли это.

Взгляните на эту ссылку.

person mamuso    schedule 07.12.2011
comment
Самый длинный метод состоял из 252 строк. Я разделил каждый случай переключения на другой частный метод, и теперь он работает, VerifyError больше нет :-) Большое спасибо! - person Nicolas Raoul; 12.12.2011