簡單的說,Smali就是Dalvik VM內(nèi)部執(zhí)行的核心代碼。
1. Smali的基本類型
- B---byte
- C---char
- D---double
- F---float
- I---int
- J---long
- S---short
- V---void
- Z---boolean
- [XXX---array (數(shù)組)
- Lxxx/yyy---object (對象)
2. 函數(shù)的定義
函數(shù)的定義一般為:
Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type
注意參數(shù)與參數(shù)之間沒有任何分隔符,同樣舉幾個例子就容易明白了:
(1) foo ()V
沒錯,這就是void foo()。
(2) foo (III)Z
這個則是boolean foo(int, int, int)。
(4) foo (Z[I[ILjava/lang/String;J)Ljava/lang/String;
看出來這是String foo (boolean, int[], int[], String, long) 了嗎?
3. Smali基本語法
- .field private isFlag:z 定義變量
- .method 方法
- .parameter 方法參數(shù)
- .prologue 方法開始
- .line123 此方法開始于123行
- invoke-super 調(diào)用父函數(shù)
- const/high16 v0,0x7fox 把0x7fox的值賦值給v0
- invoke-direct 調(diào)用函數(shù)
- return-void 函數(shù)返回void
- .end method 函數(shù)結(jié)束
- new-instance 創(chuàng)建實例
- iput-object 對象賦值
- iget-object 調(diào)用對象
- invoke-static 調(diào)用靜態(tài)函數(shù)
- .class public Lcom/disney/WMW/WMWActivty; 類名
- .super Lcom/XXX/XXX/XXX; 父類名
- .source “XXX.java” 源文件名
- .implements Lcom/XXX/XXX/XXX; 實現(xiàn)了接口
- .annotation 內(nèi)部類
- Smali局部變量
(1) 本地寄存器 (local register, 非參寄存器)
常用v開頭數(shù)字結(jié)尾的符號表示 v0,v1,v2…
(2) 參數(shù)寄存器 (parameter regisgter)
常用p開頭數(shù)字結(jié)尾的符號來表示 p1,p2,p3…
a .register 用來標明方法中寄存器的總數(shù),即參數(shù)寄存器和非參寄存器
b .local 標明在這個函數(shù)中最少要用到本地寄存器的個數(shù),出現(xiàn)在方法第一行.
5.Smali條件語法
if-eq vA,vB,:cond_** 如果vA等于vB則跳轉(zhuǎn)到:cond_**
ne 不等于
lt 小于
le 小于等于
gt 大于
ge 大于等于
eqz 等于0
nez 不等于0
ltz 小于0
gez 大于等于0
gtz 大于0
lez 小于0