1窘俺、基礎(chǔ)
1、變量類型
B—byte
C—char
D—double
F—float
I—int
S—short
V—void
J—long
Z—boolean
2、運(yùn)算符
Smali |
含義 |
符號(hào) |
eq |
equals |
== |
ne |
not equals |
!= |
lt |
less than |
< |
gt |
bigger than |
> |
le |
less and equals |
<= |
ge |
bigger and equals |
>= |
eqz |
equals zero |
=0 |
nez |
not equals zero |
!=0 |
ltz |
less than zero |
<0 |
btz |
bigger than zero |
>0 |
gez |
bigger and equals zero |
>=0 |
lez |
less and equals zero |
<=0 |
3、關(guān)鍵字
// L 代表一個(gè)對象類型
//.class 表示一個(gè)類痢畜,pulic 代表公有 敛熬,后面是全包名
// ; 分號(hào)作為語句結(jié)尾
.class public Lcom/zk/demo/MainActivity;
//.super 表示父類
.super Landroid/support/v7/app/AppCompatActivity;
//.source 代表類所在的文件名
.source "MainActivity.java"
// # 聲明
// .implements (實(shí)現(xiàn)接口 一般在文件頂部) <實(shí)現(xiàn)的接口>
# interfaces
.implements Ljava/lang/Runnable;
// 直屬方法 當(dāng)前類所有的肺稀,不可被覆寫的方法 一般是 私有/靜態(tài)方法、及靜態(tài)構(gòu)造方法
# direct methods
// 虛方法 當(dāng)前類實(shí)現(xiàn)应民,但是可以被 子類覆寫的方法话原,多為 public/protect/inteface 的方法
# virtual methods
//代碼所屬行數(shù)
. line
// 局部變量 寄存器申請數(shù)
.locals N
// 方法的形參 非靜態(tài)參數(shù) p0 代指this ; p1 代指第一個(gè)形參 ,靜態(tài)函數(shù) p0 代指第一個(gè)參數(shù)
// .param [形參變量][形參名][形參類型]
.param p1, "msg" # Ljava/lang/String;
//方法開始位置
.prologue
// 結(jié)束位置
.end field / mehod / annotation
//創(chuàng)建實(shí)例 new-instance v1, Lcom/example/zhaokai/demo/Test;
new-instance
// 獲取 變量
sget-object
// 賦值
iput-object
4诲锹、字段
// # 后面跟聲明 標(biāo)識(shí)接下來的類型 <static 靜態(tài)> 繁仁、<instance 實(shí)例>
# instance fields
.field private isPayTest:Z
# static fields
// .field 表示后面跟的是字段類型,結(jié)合上面語句代表 當(dāng)前字段
//REQUEST_CODE 是個(gè)私有靜態(tài)的int類型
// : 前面是字段名稱归园,后面則是字段類型 改备,= 后面則是字段的賦值
// 格式 .field <訪問權(quán)限> <靜態(tài)> <不可更改> <變量名> : <變量類型> = <賦值>
.field private static final REQUEST_CODE:I = 0x186b4
5、方法
//.method [方法權(quán)限]{[abstract/static/final] [varargs] }[方法名](形參類型 形參類型)[返回值類型]
.method protected setMsg(Ljava/lang/String;Ljava/lang/String;)V
//方法內(nèi)局部變量數(shù)(不包含形參)
.locals 1
.param p1, "msg" # Ljava/lang/String;
// 形參 可變形參 用數(shù)組標(biāo)識(shí) #[Ljava/lang/String;
// 行數(shù)
.line 31
//…… 執(zhí)行方法
.line 32
return-void
//無返回值 returen-object 返回指定值
//方法結(jié)束
.end method
6蔓倍、局部變量
//本地寄存器(local register悬钳,非參寄存器)用v開頭數(shù)字結(jié)尾的符號(hào)來表示,如v0偶翅、v1默勾、v2、…聚谁,
// locals 1 對應(yīng)一個(gè)本地寄存 v0
//參數(shù)寄存器(parameter register)用p開頭數(shù)字結(jié)尾的符號(hào)來表示母剥,如p0、p1形导、p2环疼、…,p0 默認(rèn)為this
7朵耕、賦值獲取
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
//獲取參數(shù)值 變量名,對象類型 -> 獲取方法 : 獲取對象類型
iput-boolean v0, p0, Lcom/example/zhaokai/demo/Test;->isTest:Z
//給參數(shù)賦值
sget/sput: static 對已標(biāo)識(shí)的靜態(tài)字段執(zhí)行已確定的對象靜態(tài)字段運(yùn)算
iget/iput: instance 對已標(biāo)識(shí)的字段執(zhí)行已確定的對象實(shí)例字段運(yùn)算
aget/aput: array 在給定數(shù)組的已標(biāo)識(shí)索引處執(zhí)行已確定的數(shù)組運(yùn)算
sget-類型 [wide/boolean/object/byte/char/short]
8炫隶、方法執(zhí)行
//返回值
move-result-object v3
//調(diào)用指定的方法。所得結(jié)果(如果有的話)可能與緊跟其后的相應(yīng) move-result* 變體指令一起存儲(chǔ)阎曹。
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
//使用 invoke-virtual 調(diào)用正常的虛方法(該方法不是 private伪阶、static 或 final,也不是構(gòu)造函數(shù))
invoke-direct {v0, v1}, Lcom/example/zhaokai/demo/Test;->print(Ljava/lang/String;)Ljava/lang/String;
//invoke-direct 用于調(diào)用非 static 直接方法(也就是說处嫌,本質(zhì)上不可覆蓋的實(shí)例方法栅贴,
// 即 private 實(shí)例方法或構(gòu)造函數(shù))
invoke-static {v2}, Lcom/example/zhaokai/demo/Test;->setVERSION(Ljava/lang/String;)V
//invoke-static 用于調(diào)用 static 方法(該方法始終被視為直接方法)。
invoke-interface {v0}, Ljava/lang/Runnable;->run()V
//invoke-interface 用于調(diào)用 interface 方法熏迹,也就是說檐薯,在具體類未知的對象上,使用引用 interface 的 method_id注暗。
invoke-super {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v0
//invoke-super 來調(diào)用在該接口上定義的該方法的最具體坛缕、未被覆蓋版
9墓猎、常用語句
//日志輸出
const-string v2, "push"
.local v2, "tag":Ljava/lang/String;
invoke-static {v2, p1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
10、smali 文件結(jié)構(gòu)
// 當(dāng)前類名:.class public Lcom/kwai/game/ddz/MainActivity;
// 父類:.super Lcom/unity3d/player/UnityPlayerActivity;
// 文件名:.source "MainActivity.java"
# static fields
//靜態(tài)字段 finish 會(huì)賦值祷膳、其他則只聲明
# instance fields
//實(shí)例字段
# direct methods
.method static constructor <clinit>()V
//靜態(tài)構(gòu)造函數(shù)<靜態(tài)代碼塊><靜態(tài)初始化>
.method public constructor <init>()V
//實(shí)例構(gòu)造函數(shù)
//其他方法
# virtual methods