Smali語法(二)

Smali語法(二)

本文主要根據(jù)一個(gè)簡(jiǎn)單的demo來簡(jiǎn)單介紹下smali語法.

1: 源碼-MainActivity

demo中主頁面的代碼很簡(jiǎn)單, 兩個(gè)button+對(duì)應(yīng)的點(diǎn)擊事件.

11 public class MainActivity extends AppCompatActivity {
12
13    @Override
14    protected void onCreate(Bundle savedInstanceState) {
15        super.onCreate(savedInstanceState);
16        setContentView(R.layout.activity_main);
17        findViewById(R.id.btn_start).setOnClickListener(view -> {
18            Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
19            startActivity(intent);
20        });
21
22        findViewById(R.id.btn_test).setOnClickListener(view -> test());
23    }
24
25    private void test() {
26    }
27 }

這里我加上了源碼中對(duì)應(yīng)的行數(shù).方便下面對(duì)應(yīng)smali分析.

2: smali 文件

我們根據(jù)apk獲取到smali文件如下:

.class public Lcom/test/accessbilitytest/MainActivity;
.super Landroidx/appcompat/app/AppCompatActivity;
.source "MainActivity.java"


# direct methods
.method public constructor <init>()V
    .registers 1

    .line 11
    invoke-direct {p0}, Landroidx/appcompat/app/AppCompatActivity;-><init>()V

    return-void
.end method

.method private test()V
    .registers 1

    .line 26
    return-void
.end method


# virtual methods
.method public synthetic lambda$onCreate$0$MainActivity(Landroid/view/View;)V
    .registers 4
    .param p1, "view"    # Landroid/view/View;

    .line 18
    new-instance v0, Landroid/content/Intent;

    const-string v1, "android.settings.ACCESSIBILITY_SETTINGS"

    invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

    .line 19
    .local v0, "intent":Landroid/content/Intent;
    invoke-virtual {p0, v0}, Lcom/test/accessbilitytest/MainActivity;->startActivity(Landroid/content/Intent;)V

    .line 20
    return-void
.end method

.method public synthetic lambda$onCreate$1$MainActivity(Landroid/view/View;)V
    .registers 2
    .param p1, "view"    # Landroid/view/View;

    .line 22
    invoke-direct {p0}, Lcom/test/accessbilitytest/MainActivity;->test()V

    return-void
.end method

.method protected onCreate(Landroid/os/Bundle;)V
    .registers 4
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;

    .line 15
    invoke-super {p0, p1}, Landroidx/appcompat/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V

    .line 16
    const v0, 0x7f0b001c

    invoke-virtual {p0, v0}, Lcom/test/accessbilitytest/MainActivity;->setContentView(I)V

    .line 17
    const v0, 0x7f080048

    invoke-virtual {p0, v0}, Lcom/test/accessbilitytest/MainActivity;->findViewById(I)Landroid/view/View;

    move-result-object v0

    new-instance v1, Lcom/test/accessbilitytest/-$$Lambda$MainActivity$IjKj-Gn1BX-W2NglRcBa8cBCb0M;

    invoke-direct {v1, p0}, Lcom/test/accessbilitytest/-$$Lambda$MainActivity$IjKj-Gn1BX-W2NglRcBa8cBCb0M;-><init>(Lcom/test/accessbilitytest/MainActivity;)V

    invoke-virtual {v0, v1}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    .line 22
    const v0, 0x7f080049

    invoke-virtual {p0, v0}, Lcom/test/accessbilitytest/MainActivity;->findViewById(I)Landroid/view/View;

    move-result-object v0

    new-instance v1, Lcom/test/accessbilitytest/-$$Lambda$MainActivity$cM1FSKBLATCUARbrJwEG_i9d7Tc;

    invoke-direct {v1, p0}, Lcom/test/accessbilitytest/-$$Lambda$MainActivity$cM1FSKBLATCUARbrJwEG_i9d7Tc;-><init>(Lcom/test/accessbilitytest/MainActivity;)V

    invoke-virtual {v0, v1}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    .line 23
    return-void
.end method

3: smali解析

這里我們根據(jù)獲取到的MainActivity.smali來具體介紹下smali.

3.1: 頭信息

.class public Lcom/test/accessbilitytest/MainActivity;
.super Landroidx/appcompat/app/AppCompatActivity;
.source "MainActivity.java"

頭信息三行: 分別指定了當(dāng)前類的類名;父類的類名;單前類的源文件

3.2: 構(gòu)造方法

# direct methods
.method public constructor <init>()V
    .registers 1

    .line 11
    invoke-direct {p0}, Landroidx/appcompat/app/AppCompatActivity;-><init>()V

    return-void
.end method
  1. .method 是方法聲明.
  2. .method public constructor <init>()V : 聲明了一個(gè)公共的(public)無參構(gòu)造函數(shù). 這里需要注意: Java源碼中可能并沒有顯式地提供一個(gè)無參構(gòu)造函數(shù),但編譯過程(通過AOSP的build系統(tǒng)纹磺,比如aapt)會(huì)自動(dòng)生成這樣的構(gòu)造器.
  3. <init>是默認(rèn)無參構(gòu)造函數(shù)名稱. ()V:表示返回值為空,并且無參數(shù).
  4. .registers指定了方法內(nèi)使用寄存器的總數(shù),也就是說 registers指令告知編譯器分配多少空間來存放這些臨時(shí)變量
  5. .line 11表明該代碼行對(duì)應(yīng)于源文件中的第11行峦睡。在實(shí)際編譯過程中膀估,這通常是注釋的一部分,幫助追蹤原始代碼位置雨涛。
  6. invoke-direct是間接調(diào)用父類的構(gòu)造函數(shù)
  7. {p0}: 是參數(shù)列表,p0 是第一個(gè)參數(shù)的位置引用,對(duì)于構(gòu)造函數(shù)而言兜挨,通常不需要提供參數(shù),因?yàn)闃?gòu)造函數(shù)是用來初始化新創(chuàng)建的對(duì)象的眯分,所以這里是空參數(shù)列表.
  8. Landroidx/appcompat/app/AppCompatActivity 這部分指定了要調(diào)用的具體構(gòu)造函數(shù)屬于 AppCompatActivity 類
  9. return-void: 結(jié)束構(gòu)造函數(shù)并返回void(即無返回值).
  10. .end method 結(jié)束方法

3.3: 普通方法

.method private test()V
    .registers 1

    .line 26
    return-void
.end method

這里就很簡(jiǎn)單了, 代表聲明了一個(gè)名稱為test的私有方法. 該方法無返回值, 位于源碼的第26行.

3.4: 點(diǎn)擊事件方法

# virtual methods
.method public synthetic lambda$onCreate$0$MainActivity(Landroid/view/View;)V
    .registers 4
    .param p1, "view"    # Landroid/view/View;

    .line 18
    new-instance v0, Landroid/content/Intent;

    const-string v1, "android.settings.ACCESSIBILITY_SETTINGS"

    invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

    .line 19
    .local v0, "intent":Landroid/content/Intent;
    invoke-virtual {p0, v0}, Lcom/test/accessbilitytest/MainActivity;->startActivity(Landroid/content/Intent;)V

    .line 20
    return-void
.end method
  1. synthetic: 這是編譯器生成的,并非源碼直接提供的.

  2. lambdaonCreate0$MainActivity 是方法的標(biāo)識(shí)符拌汇,通常在匿名內(nèi)部類中.

  3. (Landroid/view/View;)V 則聲明了 該方法的參數(shù)為View, 無返回值.

  4. .param p1, "view" # Landroid/view/View; 這一行是用來聲明方法參數(shù)的, p1代表了第一個(gè)參數(shù). "view"是參數(shù)名.

  5. new-instance v0, Landroid/content/Intent;這一行代表了創(chuàng)建新對(duì)象的指令, Landroid/content/Intent 代表了創(chuàng)建對(duì)象的類型.

  6. const-string v1, "android.settings.ACCESSIBILITY_SETTINGS" 是一段常量字符串賦值指令."android.settings.ACCESSIBILITY_SETTINGS"就是實(shí)際的字符串?dāng)?shù)據(jù).

  7. invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V 則是代表了創(chuàng)建了Intent對(duì)象,傳入了字符串類型參數(shù). (Ljava/lang/String;)V 描述了參數(shù)列表和返回類型,其中 V 表示無返回值

  8. .local v0, "intent":Landroid/content/Intent; 這一行則是代表了局部變量的聲明.

3.5: onCreate方法

onCreate方法中有一些類似的我們就省略了.

  1. invoke-super {p0, p1}, Landroidx/appcompat/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V: 這一行用于聲明父類onCreate的調(diào)用,{p0,p1}p0這里指的是當(dāng)前對(duì)象的引用(self) ,p1則代表了參數(shù)bundle.

  2. const v0, 0x7f0b001c : 是一條常量指令弊决,它告訴編譯器將數(shù)值0x7f0b001c存儲(chǔ)到寄存器v0中噪舀。

    這里的0x7f0b001c是一個(gè)十六進(jìn)制的整數(shù)魁淳,通常在資源ID(Resource ID)的表示中看到,因?yàn)樗赡軐?duì)應(yīng)于XML布局文件中的某個(gè)控件id与倡、字符串資源或其他資源. 我們可以全局搜索就可以看到0x7f0b001c,是在R$layout.smali 中定義的: .field public static final activity_main:I = 0x7f0b001c.

  3. move-result-object v0:將findViewById的結(jié)果賦值給同樣名為v0的變量

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布界逛!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纺座,隨后出現(xiàn)的幾起案子息拜,更是在濱河造成了極大的恐慌,老刑警劉巖比驻,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件该溯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡别惦,警方通過查閱死者的電腦和手機(jī)狈茉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掸掸,“玉大人氯庆,你說我怎么就攤上這事∪鸥叮” “怎么了堤撵?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)羽莺。 經(jīng)常有香客問我实昨,道長(zhǎng),這世上最難降的妖魔是什么盐固? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任荒给,我火速辦了婚禮,結(jié)果婚禮上刁卜,老公的妹妹穿的比我還像新娘志电。我一直安慰自己,他們只是感情好蛔趴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布挑辆。 她就那樣靜靜地躺著,像睡著了一般孝情。 火紅的嫁衣襯著肌膚如雪鱼蝉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天箫荡,我揣著相機(jī)與錄音魁亦,去河邊找鬼。 笑死菲茬,一個(gè)胖子當(dāng)著我的面吹牛吉挣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婉弹,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼睬魂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了镀赌?” 一聲冷哼從身側(cè)響起氯哮,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎商佛,沒想到半個(gè)月后喉钢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡良姆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年肠虽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玛追。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡税课,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痊剖,到底是詐尸還是另有隱情韩玩,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布陆馁,位于F島的核電站找颓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏叮贩。R本人自食惡果不足惜击狮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妇汗。 院中可真熱鬧帘不,春花似錦、人聲如沸杨箭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽互婿。三九已至捣郊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慈参,已是汗流浹背呛牲。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驮配,地道東北人娘扩。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓着茸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親琐旁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涮阔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容