Smali語法解析
由於碼農對CSDN使用不熟悉,想要更好的閱覽效果請點擊http://wenku.baidu.com/view/ff08c43a69eae009581bec87.html 下載。
類型
最先來了解Dalvik字節碼只有兩種類型:基本類型和引用類型。除了對象和數組外,其他的Java類型都是基本類型。這個Smali類型是和Dalvik類型是保持一致的。
V void,只用於返回值類型
Z boolean
B byte
S short
C char
B byte
I int
J long ///長整型
F float
D double
[ 數組類型
L Java類類型
.class <訪問權限> [修飾關鍵字] <類名> //指定了當前類名
.super <父類名> //指定了當前類的父類
.soucre <源文件名> //指定了當前類的源文件名
例如:
打開某反編譯的smali文件:
該源程序結構如圖所示:(包文件不考慮)
接下介紹的是字段(fields):聲明字段使用“.field”指令
static fields
.field <訪問權限> [修飾關鍵字] static 字段:字段類型
instance fields
.field <訪問權限> [修飾關鍵字] 字段:字段類型
兩者區別:後者少了static關鍵字。
比如以下的實例字段聲明:
.field private conn:Landroid/content/ServiceConnection;
表示聲明一個私有字段conn;它的類型是“android/content/ServiceConnection;”。(注意分號不能丟)
如果一個類中有方法,那麼必然有相關的發編譯代碼。方法的聲明使用“.method”指令,“.end method”表示方法結束。
direct methods
.method <訪問權限> [修飾關鍵字] <方法原型>
<.locals> //聲明局部變量的個數
[.parameter] //聲明參數的個數
[.prologue] //指令的開始處
[.line] //指示在源代碼的行數
<代碼體>
.end method
虛方法和直接方法相同,只是註釋不同。
如果一個類實現了接口,會使用”.implememts”指令。
interfaces
.implememts <接口名>
如果一個使用了註釋,會使用“.annotation”指令。
MemberClasses 註解是編譯時自動加上的, MemberClasses 註解是一個“系統註解”,作用是爲父類提供一個MemberClasses列表。MemberClasses即子類成員集合,通俗的講就是一個內部類列表。
註釋的格式:
annotations
.annotation [註釋屬性] <註釋類名>
[註釋字段=值]
.end annotation