轉載請聲明出處:https://blog.csdn.net/YoYo_Newbie/article/details/90745115
官方吐槽:什麼是Smali
smali是將Android字節碼用可閱讀的字符串形式表現出來的一種語言,可以稱之爲Android字節碼的反彙編語言。
修改Smali文件有什麼作用?
通過修改使用工具將Apk反編譯生成的smali文件,可以重新生成新的Apk進行使用。
怎麼得到Smali文件?
通過反編譯Java,生成Smali(可以使用apktool工具可進行反編譯), 如xx.Test.java 反編譯==> xx.Test.smali
實踐分析
構建一個包名爲csdn.yoyo_newbie.smalianalyzesample的Test.java文件
package csdn.yoyo_newbie.smalianalyzesample;
public class Test {
public Test(){
super();
}
}
使用apktool進行反編譯生成的Smali文件:
csdn\yoyo_newbie\smalianalyzesample\Test.smali
.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test;
.super Ljava/lang/Object;
.source "Test.java"
# direct methods
.method public constructor <init>()V
.locals 0
****
.prologue
.line 5
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 6
return-void
.end method
如下,第一行 ,代表聲明一個public的class ,它的className爲"csdn.yoyo_newbie.smalianalyzesample.Test.class",
其中L代表是對象類型
.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test
第二行,代表它繼承的父類爲 java.lang.Object.class
.super Ljava/lang/Object;
第三行,代表這個csdn.yoyo_newbie.smalianalyzesample.Test.class來自Test.java個文件
.source “Test.java”
爲什麼還要聲明來自哪裏,一定就是Test.java這個文件無疑,不是多此一舉嗎?一開始我也是這樣想的,當我深思後才恍然大悟,不是有內部類嗎?請看下面代碼
package csdn.yoyo_newbie.smalianalyzesample;
public class Test {
public Test(){
super();
}
public static class Show{
}
}
編譯後,會生成2個文件
csdn\yoyo_newbie\smalianalyzesample\Test.smali
.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test;
.super Ljava/lang/Object;
.source "Test.java"
................... 此處省略其他代碼
csdn\yoyo_newbie\smalianalyzesample\Test$Show.smali
.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test$Show;
.super Ljava/lang/Object;
.source "Test.java"
................... 此處省略其他代碼
有沒有發現!內部類Show的.Source的值也是Test.java.
本次內容,就到這裏,下面的代碼暫時不講解,將在下一篇分析。