Smali從入門到精通(一)之初步認識Smali

轉載請聲明出處: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.smalianalyzesampleTest.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.

本次內容,就到這裏,下面的代碼暫時不講解,將在下一篇分析。

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