我反编译了一个APK,并在一个Activity中添加了@Override onDestroy()方法,该方法没有此方法,所有这些都以Smali格式(显然不是Java)发生。但是我有个例外,说java.lang.VerifyError: Verifier rejected class com.mobi.MainActivity due to bad method void com.mobi.MainActivity.onDestroy()
我尝试在Android Studio中创建一个具有简单onDestroy()方法的简单项目,将其编译为APK,然后反编译APK以获取Smali文件,然后转到MainActivity.smali并复制了onDestroy()代码并将其粘贴到目标MainActivity.smali中进行注入,我再次对其进行了重新编译并得到了异常。
我编译了简单的onDestroy代码,并从以下位置获得了Smali:
@Override
protected void onDestroy() {
super.onDestroy();
}
我从此方法获得的Smali代码:
.method protected onDestroy()V
.locals 0
.line 49
invoke-super {p0}, Landroid/support/v7/app/AppCompatActivity;->onDestroy()V
.line 51
return-void
.end method
将目标代码粘贴到目标Smali文件后:
.method public onCreate(Landroid/os/Bundle;)V
.... some code ...
.end method
.method protected onDestroy()V
.locals 0
.line 49
invoke-super {p0}, Landroid/support/v7/app/AppCompatActivity;->onDestroy()V
.line 51
return-void
.end method
预计它可以平稳运行而不进行任何更改(因为显然onDestroy()方法目前尚无说明)
但是我得到了这个异常:
java.lang.VerifyError: Verifier rejected class com.mobi.MainActivity due to bad method void com.mobi.MainActivity.onDestroy()
PS:当我重新编译APK而没有注入onDestroy代码时-> Works
PS2:重新编译所创建的简单应用程序时,该应用程序具有相同的onDestroy()Smali代码-> Works
PS3:当我通过注入简单的onDestroy()Smali代码->异常重新编译目标APK时!
答案 0 :(得分:0)
解决了..
问题非常明显,我发布了此答案,因此可以帮助很多滞留在其中的开发人员:
该问题已解决。 5
1. .method protected onDestroy()V
2. .locals 0
3.
4. .line 49
5. invoke-super {p0}, Landroid/support/v7/app/AppCompatActivity;->onDestroy()V
6.
7. .line 51
8. return-void
.end method
Landroid/support/v7/app/AppCompatActivity
的位置是对AppCompatActivity
进行如下扩展的活动:
public class MainActivity extends AppCompatActivity {
}
Landroid/app/Activity
用于扩展Activity
的活动,如下所示:
public class MainActivity extends Activity{
}
我犯的错误是,我在onDestroy()
中注入了super.onDestroy()
的方法Activity
,但不知道目标MainActivity.smali是AppCompatActivity
还是Activity
。
实际上,目标MainActivity是建立在AppCompatActivity
上的,而源MainActivity是在invoke-super {p0}, Landroid/support/v7/app/AppCompatActivity;->onDestroy()V
上进行的,因此复制的Smali代码将无法像源活动中那样在Target MainActivity.smali上运行。 br />
解决方案:
将Line.5更改为:
invoke-super {p0}, Landroid/app/Activity;->onDestroy()V
收件人:
Activity
如何知道目标活动是否扩展了AppCompatActivity
或1. .class public Lcom/mobi/MinActivity;
2. .super Landroid/app/Activity;
3. .source "MainActivity.java"
? :
只需检查Activity的Smali文件的第二行,类似于:
.super
{{1}}之后的第二行显示了活动的继承。
我希望这对很多人有帮助,如果您仍然没有陷入这个错误,那么现在您知道该怎么做。