Smali 添加toast弹窗
1 反编译apk
利用apktool.jar在java环境中将hello_world.apk反编译,输出为桌面上的output_dir文件夹。命令为
java -jar apktool.jar d hello_world.apk -o output_dir
文件夹如图所示。
2 利用jadx-gui寻找合适的添加地方
下载jadx-gui,该工具是将字节码变成java的图形化工具,可用来寻找修改的何时地方。
2.1 打开jadx
找到相应路径,打开jadx图形化工具,将反编译的文件夹拖进工具中。
2.2 找到修改地方
找到源代码中的androidx中组件活动的onCreate方法,在这里可以添加toast弹窗。
2.3 在反编译的文件夹中找到修改地方
按照jadx-gui中所找到的路径进入文件夹,找到相应的smali文件的onCreate方法,添加toast弹窗消息。路径如上图所示。
.method protected onCreate(Landroid/os/Bundle;)V
.locals 1
.line 149
invoke-super {p0, p1}, Landroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V
.line 150
iget-object v0, p0, Landroidx/activity/ComponentActivity;->mSavedStateRegistryController:Landroidx/savedstate/SavedStateRegistryController;
invoke-virtual {v0, p1}, Landroidx/savedstate/SavedStateRegistryController;->performRestore(Landroid/os/Bundle;)V
.line 151
invoke-static {p0}, Landroidx/lifecycle/ReportFragment;->injectIfNeededIn(Landroid/app/Activity;)V
.line 152
iget p1, p0, Landroidx/activity/ComponentActivity;->mContentLayoutId:I
if-eqz p1, :cond_0
.line 153
invoke-virtual {p0, p1}, Landroidx/activity/ComponentActivity;->setContentView(I)V
:cond_0
return-void
.end method
3 修改
.method protected onCreate(Landroid/os/Bundle;)V
.locals 2
.line 149
invoke-super {p0, p1}, Landroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V
.line 150
iget-object v0, p0, Landroidx/activity/ComponentActivity;->mSavedStateRegistryController:Landroidx/savedstate/SavedStateRegistryController;
invoke-virtual {v0, p1}, Landroidx/savedstate/SavedStateRegistryController;->performRestore(Landroid/os/Bundle;)V
.line 151
invoke-static {p0}, Landroidx/lifecycle/ReportFragment;->injectIfNeededIn(Landroid/app/Activity;)V
.line 152
iget p1, p0, Landroidx/activity/ComponentActivity;->mContentLayoutId:I
if-eqz p1, :cond_0
.line 153
invoke-virtual {p0, p1}, Landroidx/activity/ComponentActivity;->setContentView(I)V
:cond_0
.line 154
const-string v1, "Hello, World!"
const/4 v0, 0x1
invoke-static {p0, v1, v0}, 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
return-void
.end method
在
onCreate
方法中添加显示 Toast 消息的代码。注意点==1.==在
onCreate
方法中已经声明了一个本地变量v0
,但在后续代码中如果又重新使用了v0
作为参数传递给makeText
方法,这可能导致寄存器冲突。解决方法:在onCreate
方法中声明一个新的本地变量,例如v1
,将要弹出的文本信息存储在其中。使用新的本地变量作为参数传递给makeText
方法。2.
.locals 2
:表示该方法会使用到两个本地变量。因为用到的变量增加,所以这个也要加1。
4 重新打包为apk
用java -jar apktool.jar b output_dir命令将反编译修改后的文件夹重新打包为apk。
5 签名
用
keytool -genkeypair -alias roland.keystore -keyalg RSA -validity 500000 -keystore roland.keystorev
生成密码库,密码库存储在桌面上。用jarsigner -verbose -keystore roland.keystore -signedjar test.apk output_dir/dist/hello_world.apk roland.keystore
给打好包的hello_world.apk签名并保存为桌面上的test.apk
6 安装
在模拟器中安装成功!