(4)Smali系列學習之Smali語法詳解內部類
在這一節,我們來介紹一下內部類。對於Java文件中的每一個內部類,都會產生一個單獨的smali文件,比如ActivityThread$1.smali。這些文件的命名規範是如果是匿名內部類,則命名規則是外部類+$+數字,否則的話是外部類+$+內部類的名字。
當在內部類中調用外部類的私有方法時,編譯器會自動合成一個靜態函數。比如下面這個類:
public class Hello {
public class A {
void func() {
setup();
}
}
private void setup() {
}
我們在內部類A的func方法中調用了外部類的setup方法,最終編譯的smali代碼為:
Hello$A.smali文件代碼片段:
# virtual methods
.method func()V
.locals 1
.prologue
.line 5
iget-object v0, p0, LHello$A;->this$0:LHello;
#calls: LHello;->setup()V
invoke-static {v0}, LHello;->access$000(LHello;)V
.line 6
return-void
.end method
Hello.smali代碼片段:
.method static synthetic access$000(LHello;)V
.locals 0
.parameter
.prologue
.line 1
invoke-direct {p0}, LHello;->setup()V
return-void
.end method
可以看到,編譯器自動合成了一個access$000方法,假如當我們在一個較復雜的內部類中加入了一個對外部類私有方法的調用,雖然只是導致新合成了一個方法,但是這些合成的方法名可能都會有變化,這樣的結果就是smali文件差異較大,這個時候需要仔細分析,找到調用的私有方法。然後給合成的方法選取一個未被使用的名字。
(4)Smali系列學習之Smali語法詳解內部類