今天研究了一下apk文件添加AlertDialog对话框,搞了一天终于搞定了,发个破文分享一下
。
使用到的工具:ApktoolGui v2.0 Final(http://bbs.pediy.com/showthread.php?t=148006有下载)
添加对话框的软件:合金弹头v1.8
首先添加一个最简单的应用,就是弹出一个消息框,在android中可以这样实现
new AlertDialog.Builder(self)
.setTitle("普通对话框")
.setMessage("你好,Android!")
.show();
转化成smali如下图:
具体语法解释见http://bbs.pediy.com/showthread.php?t=151769中我的回帖。
将合金弹头反编译,将上述smali代码插入MainActivity.smali中的create函数的return-void语句前面,重新编译成apk文件,安装运行
运行成功,O了。
再来点复杂点的吧
下面我们来添加一个带一个确定按钮的对话框,android代码为
new AlertDialog.Builder(this)
.setTitle("普通对话框")
.setMessage("你好,Android!")
.setPositiveButton("确定",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialoginterface, int i){
//按钮事件
}
})
.show();
转换成smali语言如下:
我们看到代码中多了以下几条语句
.line 33
const-string v2, "\u786e\u5b9a"
new-instance v3, Lcom/kinglau/mslug/MainActivity$5;
invoke-direct {v3, p0}, Lcom/kinglau/mslug/MainActivity$5;-><init>(Lcom/kinglau/mslug/MainActivity;)V
invoke-virtual {v1, v2, v3}, Landroid/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;
其中还调用了Lcom/kinglau/mslug/MainActivity$5中的内容。MainActivity$5.smali文件的编写如下:
.class Lcom/kinglau/mslug/MainActivity$5;
.super Ljava/lang/Object;
.source "MainActivity.java"
# interfaces
.implements Landroid/content/DialogInterface$OnClickListener;
# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
value = Lcom/kinglau/mslug/MainActivity;->onCreate(Landroid/os/Bundle;)V
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x0
name = null
.end annotation
# instance fields
.field final synthetic this$0:Lcom/kinglau/mslug/MainActivity;
# direct methods
.method constructor <init>(Lcom/kinglau/mslug/MainActivity;)V
.locals 0
.parameter
.prologue
.line 1
iput-object p1, p0, Lcom/kinglau/mslug/MainActivity$5;->this$0:Lcom/kinglau/mslug/MainActivity;
.line 33
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# virtual methods
.method public onClick(Landroid/content/DialogInterface;I)V
.locals 0
.parameter "dialog"
.parameter "which"
.prologue
.line 40
return-void
.end method
这主要是因为在监控按钮事件时定义了一个内部类,smali对每一个类都应该有一个对应的文件来实现该类的功能。因此我们添加MainActivity$5.smali就是实现监控按钮事件功能。
将smali代码插入,同时将MainActivity$5.smali文件添加到MainActivity.smali文件夹中,编译成apk,安装运行
运行成功
。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工
作,每周日13:00-18:00直播授课
上传的附件: