1. 程式人生 > >smali的檔案語法格式

smali的檔案語法格式

無論是普通類、抽象類、介面類或者內部類,在反編譯出來的程式碼中,他們都以單獨的smali檔案來存放。

一、smali檔案的頭3行描述了當前類的一些資訊,格式如下:

.class <訪問許可權>[修飾關鍵字]<類名> 
.super <父類名>                     
.source <原始檔名>

類名開頭的L是遵循Dalvik位元組碼的相關約定,表示後面跟隨的字串為一個類,經過混淆的dex檔案,反編譯出來的smali程式碼可能沒有原始檔資訊,因此,.source行可能為空。

二、smali檔案中,欄位的宣告使用“.field”指令

  • 靜態欄位格式:
#static fields
.field <訪問許可權> static[修飾關鍵字]<欄位名>:<欄位型別>
  • 例項欄位格式:
#instance fields
.field <訪問許可權> static[修飾關鍵字]<欄位名>:<欄位型別>

三、smail檔案中,方法的宣告使用“.method”指令,方法有直接方法與虛方法。

  • 直接方法宣告格式:
#direct methods
.method <訪問許可權>[修飾關鍵字]<方法原型>
<.locals>		//置頂了使用的區域性變數的個數
[.parameter]		//多個引數則有多個[.parameter]
[.prologue]		//指定了程式碼的開始處,混淆過的程式碼可能去掉了該指令
[.lime]			//置頂了該處指令在原始碼中的行號,混淆過的程式碼可能去除了行號
<程式碼體>
.end method
  • 虛方法的宣告格式:
#virtual methods
.method <訪問許可權>[修飾關鍵字]<方法原型>
<.locals>		//置頂了使用的區域性變數的個數
[.parameter]		//多個引數則有多個[.parameter]
[.prologue]		//指定了程式碼的開始處,混淆過的程式碼可能去掉了該指令
[.lime]			//置頂了該處指令在原始碼中的行號,混淆過的程式碼可能去除了行號
<程式碼體>
.end method

四、如果類實現了介面,在smali檔案中使用“.implements”,格式如下:

#interfaces
.implements <介面名>

五、如果類使用了註解,在smali檔案中使用“.annotation”,格式如下:

#annotations
.annotatiion[註解屬性]<註解類名>
	[註解欄位 = 值]
.end annotation

註解的作用範圍可以是類、方法或欄位。如果註解的作用方位是類,“.annotation”指令會直接定義在檔案中,如果是方法或欄位,“.annotation”指令則包含在方法或欄位定義中。