Ошибка проверки Android Dalvik: регистр1 v1 тип 0, хотел ref
Я изучал, как кодировать файлы smali, и я создал определенный метод, который принимает строковый параметр и помещает его в журнал. Его эквивалент Java выглядит примерно так:
public void log(String param){
Log.d(param, param);
}
И когда я снова отправил его и подписал apk, я получил следующую ошибку в logCat:
10-05 21:52:42.081: W/dalvikvm(32021): VFY: register1 v2 type 0, wanted ref
10-05 21:52:42.081: W/dalvikvm(32021): VFY: bad arg 0 (into Ljava/lang/String;)
10-05 21:52:42.081: W/dalvikvm(32021): VFY: rejecting call to Landroid/util/Log;.d (Ljava/lang/String;Ljava/lang/String;)I
10-05 21:52:42.081: W/dalvikvm(32021): VFY: rejecting opcode 0x71 at 0x0000
10-05 21:52:42.081: W/dalvikvm(32021): VFY: rejected Lcom/shqipe/worthstream/utils/Utils;.log (Ljava/lang/String;)V
10-05 21:52:42.081: W/dalvikvm(32021): Verifier rejected class Lcom/shqipe/worthstream/utils/Utils;
10-05 21:52:42.081: D/AndroidRuntime(32021): Shutting down VM
Это метод в файле smali:
.method public static log(Ljava/lang/String;)V
.registers 2
.parameter "paramString"
.prologue
invoke-static {p1, p1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 63
return-void
.end method
Может кто-нибудь объяснить мне, как я могу отладить эту ошибку?
2 ответа
p1 является неверным регистром в этом контексте. На самом деле, Баксмали должен был это поймать!:)
С.registers 2 и одним аргументом у вас есть регистры v0 и v1, а p0 связан с v1. На самом деле p1 будет v2, что недопустимо, согласно вашей директиве.registers.
Что вы хотите
invoke-static {p0, p0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
или эквивалентно
invoke-static {v1, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
Что касается отладки такого рода ошибок, лучшее, что вы могли бы сделать, - это посмотреть в исходном коде dalvik строки ошибок VFY, которые вы видите, и точно определить, что означает сообщение об ошибке (то есть, какое состояние ошибки это сработало), и где в байт-коде происходит ошибка.
Чтобы определить, где происходит байт-код ошибки, посмотрите на строки ошибок.
10-05 21:52:42.081: W/dalvikvm(32021): VFY: rejecting opcode 0x71 at 0x0000
10-05 21:52:42.081: W/dalvikvm(32021): VFY: rejected Lcom/shqipe/worthstream/utils/Utils;.log (Ljava/lang/String;)V
Это показывает, что ошибка произошла в Lcom/shqipe/worthstream/utils/Utils;.log (Ljava/lang/String;)V
метод, со смещением байтового кода 0 (т.е. первая инструкция). Однако в случае, если неясно, на какую инструкцию он ссылается, вы можете использовать опцию -f для baksmali, которая заставит его добавить смещение байтового кода в качестве комментария перед каждой инструкцией.
Просто дополнение к ответу JesusFreke, p0 НЕ ссылается на Java this
в примере, так как функция является статической. Таким образом, аргументы начинаются с p0, как сказал JesusFreke.