初識smali

簡單的說,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) 了嗎?

未完待續。。。。。。。。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章