簡單的說,smali就是Dalvik VM內部執行的核心代碼。
Dvm和Jvm
Dalvik字節碼Dalvik是google專門爲Android操作系統設計的一個虛擬機,經過深度的優化。雖然Android上的程序是使用java來開發的,但是Dalvik和標準的java虛擬機JVM還是兩回事。Dalvik VM是基於寄存器的,而JVM是基於棧的;Dalvik有專屬的文件執行格式dex(dalvik executable),而JVM則執行的是java字節碼。Dalvik VM比JVM速度更快,佔用空間更少。
通過Dalvik的字節碼我們不能直接看到原來的邏輯代碼,這時需要藉助如Apktool或dex2jar+jd-gui工具來幫助查看。但是,注意的是最終我們修改APK需要操作的文件是.smali文件,而不是導出來的Java文件重新編譯(況且這基本上不可能)。
SMALI語法
smali基本數據類型和java一樣,只是符號不同
B—byte
C—char
D—double
F—float
I—int
J—long
S—short
V—void
Z—boolean[XXX—arrayLxxx 數組的表示方式是:在基本類型前加上前中括 號“[”,例如int數組和float數組分別表示爲:[I、[F;
/yyy—object 對象的表示則以L作爲開頭,格式是LpackageName/objectName;(注意必須有個分號跟在最後),例如String對象在smali中爲:Ljava/lang/String;,其中java/lang對應java.lang包,String就是定義在該包中的一個對象。
內部類的表示:LpackageName/objectName$subObjectName;在內部類前面加美元符
函數的定義
二、函數的定義
函數的定義一般爲:
Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type
注意參數與參數之間沒有任何分隔符,同樣舉幾個例子就容易明白了:
1. foo ()V
沒錯,這就是void foo()。
2. foo (III)Z
這個則是boolean foo(int, int, int)。
3. foo (Z[I[ILjava/lang/String;J)Ljava/lang/String;
看出來這是String foo (boolean, int[], int[], String, long) 了嗎?
未完待續。。。。。。。。。。。。。