Smali語法:數(shù)據(jù)類型、方法和字段數(shù)據(jù)類型dalvik字節(jié)碼有兩種類型,原始類型和引用類型。對象和數(shù)組是引用類型,其它都是原始類型。 smali數(shù)據(jù)類型都是用一個字母表示,如果你熟悉Java的數(shù)據(jù)類型,你會發(fā)現(xiàn)表示smali數(shù)據(jù)類型的字母其實是Java基本數(shù)據(jù)類型首字母的大寫,除boolean類型外,在smail中用大寫的”Z”表示boolean類型。 V void,只能用于返回值類型 Z boolean B byte S short C char I int J long (64 bits) F float D double (64 bits) 對象以Lpackage/name/ObjectName;的形式表示。前面的L表示這是一個對象類型,package/name/是該對象所在的包,ObjectName是對象的名字,“;”表示對象名稱的結(jié)束。相當(dāng)于java中的package.name.ObjectName。 例如:Ljava/lang/String;相當(dāng)于java.lang.String 數(shù)組的表示形式? [I——表示一個整型一維數(shù)組,相當(dāng)于java中的int[]。? 對于多維數(shù)組,只要增加[就行了。[[I相當(dāng)于int[][],[[[I相當(dāng)于int[][][]。注意每一維的最多255個。? 對象數(shù)組的表示 [Ljava/lang/String;表示一個String對象數(shù)組。 方法 方法通常必須詳細(xì)的指定方法類型(?the type that contains the method) 方法名,參數(shù)類型,返回類型,所有這些信息都是為虛擬機(jī)是能夠找到正確的方法并執(zhí)行。 方法表示形式:Lpackage/name/ObjectName;->MethodName(III)Z? 在上面的例子中,Lpackage/name/ObjectName;表示類型,MethodName是方法名。III為參數(shù)(在此是3個整型參數(shù)),Z是返回類型(bool型)。? 方法的參數(shù)是一個接一個的,中間沒有隔開。 一個更復(fù)雜的例子:method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; 在java中則為:String method(int, int[][], int, String, Object[]) 一個比較全面的例子: .class public interface abstract Lcom/kit/network/CachableImage; .super Ljava/lang/Object; .source 'SourceFile' virtual methods.method public abstract getIsLarge()Z.end method .method public abstract getUrl()Ljava/lang/String; .end method .method public abstract getViewContext()Landroid/content/Context; .end method .method public abstract setBitmap(Landroid/graphics/Bitmap;Z)V .end method .method public abstract setIsLarge(Z)V .end method .method public abstract setUrl(Ljava/lang/String;)V .end method上面的smali代碼還原后的java代碼為: //#注:在實際代碼中我們還必須引入相關(guān)的包 import android.content.Context; import android.graphics.Bitmap; public interface CachableImage { public abstract boolean getIsLarge(); public abstract String getUrl(); public abstract Context getViewContext(); public abstract void setBitmap(Bitmap bitmap); public abstract void setIsLarge(boolean islarge); public abstract void setUrl(String url); } 字段 表示形式:Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;即包名,字段名和各字段類型。 eg: .field private _requestLayout:Z .field public isLarge:Z .field public resize:Z .field public thumbnailSize:I .field public url:Ljava/lang/String;還原后的java代碼為: public boolean _requestLayout; public boolean isLarge; public boolean resize; public int thumbnailSize; public String url; |
|
來自: 狂月疏星 > 《手機(jī)教程》