Smali语言其实就是Davlik的寄存器语言;Smali语言就是android的应用程序.apk通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件的展示语言,我们可以通过分析修改Smali程序达到修改源程序的目的。
下面给出修改一个android工程其中Textview的教程。
如图,下面是android工程listedittest的目录:
通过apktool反编译出来的Smali文件夹里面的目录
先打开一个主类MainActivity.smali文件,先来浏览一下里面的语言,再来说说smali的语法规则:
.class public Lcom/myandroid/listedittest/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"
# static fields
.field static str:[Ljava/lang/String;
# instance fields
.field private bt_cancel:Landroid/widget/Button;
.field private bt_confirmdelete:Landroid/widget/Button;
.field private bt_deselectall:Landroid/widget/Button;
.field private bt_selectall:Landroid/widget/Button;
.field private checkNum:I
.field private list:Ljava/util/ArrayList;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/ArrayList",
"<",
"Ljava/util/HashMap",
"<",
"Ljava/lang/String;",
"Ljava/lang/String;",
">;>;"
}
.end annotation
.end field
.field private lv:Landroid/widget/ListView;
.field private mAdapter:Lcom/myandroid/listedittest/MyAdapter;
.field private tv_show:Landroid/widget/TextView;
# direct methods
.method static constructor <clinit>()V
.locals 3
.prologue
.line 30
const/16 v0, 0xd
new-array v0, v0, [Ljava/lang/String;
const/4 v1, 0x0
const-string v2, "data1"
aput-object v2, v0, v1
const/4 v1, 0x1
const-string v2, "data2"
aput-object v2, v0, v1
const/4 v1, 0x2
const-string v2, "data3"
aput-object v2, v0, v1
const/4 v1, 0x3
const-string v2, "data4"
aput-object v2, v0, v1
const/4 v1, 0x4
const-string v2, "data5"
aput-object v2, v0, v1
const/4 v1, 0x5
const-string v2, "data6"
aput-object v2, v0, v1
const/4 v1, 0x6
const-string v2, "7"
aput-object v2, v0, v1
const/4 v1, 0x7
const-string v2, "data8"
aput-object v2, v0, v1
const/16 v1, 0x8
const-string v2, "data9"
aput-object v2, v0, v1
const/16 v1, 0x9
const-string v2, "data10"
aput-object v2, v0, v1
const/16 v1, 0xa
const-string v2, "data11"
aput-object v2, v0, v1
const/16 v1, 0xb
const-string v2, "data12"
aput-object v2, v0, v1
const/16 v1, 0xc
const-string v2, "data13"
aput-object v2, v0, v1
sput-object v0, Lcom/myandroid/listedittest/MainActivity;->str:[Ljava/lang/String;
return-void
.end method
.method public constructor <init>()V
.locals 0
.prologue
.line 20
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
.method static synthetic access$000(Lcom/myandroid/listedittest/MainActivity;)Ljava/util/ArrayList;
.locals 1
.parameter "x0"
.prologue
.line 20
iget-object v0, p0, Lcom/myandroid/listedittest/MainActivity;->list:Ljava/util/ArrayList;
return-object v0
.end method
.method static synthetic access$100(Lcom/myandroid/listedittest/MainActivity;)I
.locals 1
.parameter "x0"
.prologue
.line 20
iget v0, p0, Lcom/myandroid/listedittest/MainActivity;->checkNum:I
return v0
.end method
.method static synthetic access$102(Lcom/myandroid/listedittest/MainActivity;I)I
.locals 0
.parameter "x0"
.parameter "x1"
.prologue
.line 20
iput p1, p0, Lcom/myandroid/listedittest/MainActivity;->checkNum:I
return p1
.end method
.method static synthetic access$108(Lcom/myandroid/listedittest/MainActivity;)I
.locals 2
.parameter "x0"
.prologue
.line 20
iget v0, p0, Lcom/myandroid/listedittest/MainActivity;->checkNum:I
add-int/lit8 v1, v0, 0x1
iput v1, p0, Lcom/myandroid/listedittest/MainActivity;->checkNum:I
return v0
.end method
.method static synthetic access$110(Lcom/myandroid/listedittest/MainActivity;)I
.locals 2
.parameter "x0"
.prologue
.line 20
iget v0, p0, Lcom/myandroid/listedittest/MainActivity;->checkNum:I
add-int/lit8 v1, v0, -0x1
iput v1, p0, Lcom/myandroid/listedittest/MainActivity;->checkNum:I
return v0
.end method
.method static synthetic access$200(Lcom/myandroid/listedittest/MainActivity;)V
.locals 0
.parameter "x0"
.prologue
.line 20
invoke-direct {p0}, Lcom/myandroid/listedittest/MainActivity;->dataChanged()V
return-void
.end method
.method static synthetic access$300(Lcom/myandroid/listedittest/MainActivity;)Landroid/widget/TextView;
.locals 1
.parameter "x0"
.prologue
.line 20
iget-object v0, p0, Lcom/myandroid/listedittest/MainActivity;->tv_show:Landroid/widget/TextView;
return-object v0
.end method
.method private dataChanged()V
.locals 3
.prologue
.line 157
iget-object v0, p0, Lcom/myandroid/listedittest/MainActivity;->mAdapter:Lcom/myandroid/listedittest/MyAdapter;
invoke-virtual {v0}, Lcom/myandroid/listedittest/MyAd