其中36-40行是打印日志的位置,文件内容很清晰,每个区域的意义如下:
.class 类名
.super 父类名
.source 文件名
.implements 这个类实现的接口
.field 成员变量
.method 方法
然后新建一个工程,在这个工程中实现想要替换的代码,我们这里是希望将原始工程中打印日志的地方替换为弹出一个Toast。
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showToast();
}
public void showToast() {
Toast.makeText(this,"我是反编译后进行的修改。",Toast.LENGTH_LONG).show();
}
}
然后像前面一样执行apktool命令,生成的smali文件内容如下:
.class public Lcom/viclee/decompiledemo/MainActivity;
.super Landroid/support/v7/app/AppCompatActivity;
.source "MainActivity.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 7
invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;-><init>()V
return-void
.end method
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.locals 1
.param p1, "savedInstanceState" # Landroid/os/Bundle;
.prologue
.line 10
invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V
.line 11
const v0, 0x7f040019
invoke-virtual {p0, v0}, Lcom/viclee/decompiledemo/MainActivity;->setContentView(I)V
.line 13
invoke-virtual {p0}, Lcom/viclee/decompiledemo/MainActivity;->showToast()V
.line 14
return-void
.end method
.method public showToast()V
.locals 2
.prologue
.line 17
const-string v0, "u6211u662fu53cdu7f16u8bd1u540eu8fdbu884cu7684u4feeu6539u3002"
const/4 v1, 0x1
invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v0
invoke-virtual {v0}, Landroid/widget/Toast;->show()V
.line 18
return-void
.end method










