我有以下Smali代码:
.method private k(I)V
.registers 27 (original) 29 (after)
...
#@68a
invoke-direct/range {v24 .. v25}, Landroid/widget/LinearLayout;-><init>(Landroid/content/Context;)V
...
这被Dalvik验证程序拒绝。 0x76是直接调用/范围。
dalvikvm: VFY: register1 v25 type 0, wanted ref
dalvikvm: VFY: bad arg 1 (into Landroid/content/Context;)
dalvikvm: VFY: rejecting call to Landroid/widget/LinearLayout;.<init> (Landroid/content/Context;)V
dalvikvm: VFY: rejecting opcode 0x76 at 0x068a
dalvikvm: VFY: rejected Lcom/pocketwood/myav/MyAV;.k (I)V
dalvikvm: Verifier rejected class Lcom/pocketwood/myav/MyAV;
dalvikvm: Class init failed in newInstance call (Lcom/pocketwood/myav/MyAV;)
有趣的是,在68a以上的任何指令中均未使用v25!原始的APK运行正常,但是重新打包了smali,验证程序拒绝了MyAV类。
答案 0 :(得分:1)
我怀疑您的代码位置错误。如果您查看错误消息,它会提到操作码0x76,即invoke-direct/range
。您提供的代码段中没有invoke-direct/range
指令,因此,除非确实发生了一些麻烦,否则不会成为导致问题的代码。
此外,请查看错误消息中的方法名称: Lcom/pocketwood/myav/MyAV;.k (I)V
。 k之后看起来像是一个空格。空格字符本身不是方法名称中的有效字符,但实际上它可能是其他一些类似空格的Unicode字符?
没关系。该空间似乎被烘焙到error message中。
最后,错误消息(at 0x068a
)中提到的偏移应为包含方法中指令的代码偏移。拆卸dex文件时,可以使用baksmali的--offsets
选项,并且baksmali将在每条指令之前添加注释,其代码偏移量。虽然,我不确定偏移是否以字节或代码单位(16位)为单位,所以偏移量可能为2。
答案 1 :(得分:0)
解决方案是:v26为p1,v25为p0。由于修改,寄存器计数已扩展到29,并且由于v25不再为p0。