Smali常見語法

1. 獲取assets目錄中的資源

android:

AssetManager am = getResources().getAssets();
try{
  InputStream is = am.open("xxxx.png");
}catch(IOException e){
}

smali:

invoke-virtual {p0}, Lcom/speedsoftware/rootexplorer/RootExplorer;->getResources()Landroid/content/res/Resources;
move-result-object vX
invoke-virtual {vX}, Landroid/content/res/Resources;->getAssets()Landroid/content/res/AssetManager;
move-result-object v0

2. new對象的語法

android:

this.pic_hd1 = new PicHandler();

smali:

new-instance v6,Lcom/qt/MainActivity$PicHandler;
move-object v9,v6
move-object v6,v9
move-object v7,v9
move-object v8,v0
invoke-direct {v7,v8},Lcom/qt/MainActivity$PicHandler;-><init>(Lcom/qt/MainActivity;)V
iput-object v6,v5,Lcom/qt/MainActivity;->pic_hd1:Landroid/os/Handler;

3. 操作Fragment的語法 android.app.FragmentManager

android:

        // 顯示調(diào)用父類
        FragmentManager fragmentManagerSuper = super.getFragmentManager();
        // 調(diào)用繼承的方法,實際仍調(diào)用的是父類的
        FragmentManager fragmentManagerThis = this.getFragmentManager();
        // 開啟fragmentTransaction事務
        FragmentTransaction fragmentTransaction = fragmentManagerSuper.beginTransaction();
        // 加載fragment布局
        Fragment fragment = fragmentManagerSuper.findFragmentById(R.layout.activity_main);
        // 加入fragmentTransaction中的fragment才可以調(diào)用show() hide()
        fragmentTransaction.add(fragment, "test");
        // 隱藏fragment
        fragmentTransaction.hide(fragment);
        // 顯示fragment
        fragmentTransaction.show(fragment);
        // 提交后hide() show()才生效
        fragmentTransaction.commit();

smali:

    invoke-super {p0}, Landroid/support/v7/app/AppCompatActivity;->getFragmentManager()Landroid/app/FragmentManager;

    move-result-object v1

    .local v1, "fragmentManagerSuper":Landroid/app/FragmentManager;
    invoke-virtual {p0}, Ltop/nodcat/www/testlogindemo/MainActivity;->getFragmentManager()Landroid/app/FragmentManager;

    move-result-object v2

    .local v2, "fragmentManagerThis":Landroid/app/FragmentManager;
    invoke-virtual {v1}, Landroid/app/FragmentManager;->beginTransaction()Landroid/app/FragmentTransaction;

    move-result-object v3

    .local v3, "fragmentTransaction":Landroid/app/FragmentTransaction;
    invoke-virtual {v1, v0}, Landroid/app/FragmentManager;->findFragmentById(I)Landroid/app/Fragment;

    move-result-object v0

    .local v0, "fragment":Landroid/app/Fragment;
    const-string v4, "test"

    invoke-virtual {v3, v0, v4}, Landroid/app/FragmentTransaction;->add(Landroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;

    invoke-virtual {v3, v0}, Landroid/app/FragmentTransaction;->hide(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;

    invoke-virtual {v3, v0}, Landroid/app/FragmentTransaction;->show(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;

    invoke-virtual {v3}, Landroid/app/FragmentTransaction;->commit()I

4. 操作Fragment的語法 android.support.v4.app.FragmentManager

谷歌推薦使用android.support.v4包中的組件,因此比較新的app都會使用android.support.v4包中類。

java

        // 獲取android.support.v4.app.FragmentManager
        FragmentManager fragmentManagerThis = this.getSupportFragmentManager();
        // 開啟fragmentTransaction事務
        FragmentTransaction fragmentTransaction = fragmentManagerThis.beginTransaction();
        // 方式一:在Activity的layout.xml布局文件中靜態(tài)添加fragment布局方式
//        // 加載布局文件
//        Fragment fragment = fragmentManagerThis.findFragmentById(R.layout.fragment_hide_features);
//        // 加入fragmentTransaction中的fragment才可以調(diào)用show() hide()
//        fragmentTransaction.add(fragment, "test");
        // 方式二:在Activity的.java文件中動態(tài)添加
        // 創(chuàng)建需要添加的Fragment :HideFeaturesFragment
        HideFeaturesFragment hideFeaturesFragment = new HideFeaturesFragment();
        // 將創(chuàng)建的fragment添加到Activity布局文件中定義的占位符中(FrameLayout)
        fragmentTransaction.add(R.id.fragment_main, hideFeaturesFragment);
//        // 隱藏fragment
//        fragmentTransaction.hide(fragment);
//        // 顯示fragment
//        fragmentTransaction.show(fragment);
        // 提交后hide() show()才生效
        fragmentTransaction.commit();

5. 按鈕設置點擊事件的語法

android:

btn_login = findViewById(R.id.button_login);
// 設置按鈕點擊事件
btn_login.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
    ...
  }
});

smali:

const v1, 0x7f070023 # 按鈕id

invoke-virtual {p0, v1}, Ltop/nodcat/www/testlogindemo/MainActivity;->findViewById(I)Landroid/view/View;

move-result-object v1

check-cast v1, Landroid/widget/Button; # 類型轉(zhuǎn)換

iput-object v1, p0, Ltop/nodcat/www/testlogindemo/MainActivity;->btn_login:Landroid/widget/Button; # this.btn_login = v1

iget-object v1, p0, Ltop/nodcat/www/testlogindemo/MainActivity;->btn_login:Landroid/widget/Button;

new-instance v2, Ltop/nodcat/www/testlogindemo/MainActivity$1; # 匿名內(nèi)部類 View.OnClickListener接口的匿名實現(xiàn)

invoke-direct {v2, p0}, Ltop/nodcat/www/testlogindemo/MainActivity$1;-><init>(Ltop/nodcat/www/testlogindemo/MainActivity;)V # 構(gòu)造函數(shù)

invoke-virtual {v1, v2}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V # 為按鈕設置監(jiān)聽事件

6. 區(qū)分invoke-virtual、invoke-super

invoke-virtual表示調(diào)用繼承的方法 this.method();
invoke-super表示直接調(diào)用父類的方法 super.method();
invoke-direct表示調(diào)用自身的方法或者某個對象構(gòu)造方法
android:

this.login(username, pwd);

FragmentManager fragmentManagerSuper = super.getFragmentManager();

FragmentManager fragmentManagerThis = this.getFragmentManager();

smali:


7. Activity跳轉(zhuǎn)的語法

android:

// 方法一:可以在Activity以及Fragment中調(diào)用該方法跳轉(zhuǎn)到指定的Activity
this.startActivity(new Intent(this,PanelActivity.class));

// 方法二:在AndroidManifest.xml中配置<intent-filter>
        <activity android:alwaysRetainTaskState="true" android:exported="true" android:label="車來了" android:launchMode="singleTask" android:name="dev.xesam.chelaile.app.module.PanelHostActivity" android:screenOrientation="portrait" android:theme="@style/AppTheme" android:windowSoftInputMode="adjustPan">
            <intent-filter>
                <action android:name="android.intent.action.CREATE_SHORTCUT"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:host="panelhost" android:scheme="chelaile"/>
            </intent-filter>
            <intent-filter>  <action android:name="dev.xesam.chelaile.app.module.PanelHostActivity"/>  </intent-filter>
        </activity>
// 傳入指定action動作的Intent后將自動匹配跳轉(zhuǎn)的activity
this.startActivity(new Intent("android.intent.action.VIEW"));

smali:

# 方法二對應smali:
    new-instance v0, Landroid/content/Intent;
    const-string v1, "android.intent.action.VIEW"
    invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V # new Intent("android.intent.action.VIEW")
    invoke-virtual {p0, v0}, Ladmsdk/library/activity/AdDetailActivity;->startActivity(Landroid/content/Intent;)V # this.startActivity(v0); v0=new Intent("android.intent.action.VIEW")
    

8. 安卓動態(tài)設置控件布局屬性的語法

android:

textview.setLayoutParams(layoutParams);

smail:

invoke-virtual {v0, v1}, Landroid/view/View;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V # v0=textview對象 v1為LayoutParams對象

9. 獲取證書簽名的語法

android:

/** 通過包管理器獲得指定包名包含簽名的包信息,PackageManager.GET_SIGNATURES的值為64,轉(zhuǎn)換為16進制則為0x40 **/
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
/******* 通過返回的包信息獲得簽名數(shù)組 *******/
Signature[] signatures = packageInfo.signatures;
/******* 循環(huán)遍歷簽名數(shù)組拼接證書簽名 *******/
return signatures[0].toCharsString();
/************** 得到證書簽名 **************/

smali:

    iget-object v1, p0, Lcom/shuqi/app/ShuqiApplication$3;->val$context:Landroid/content/Context;

    invoke-virtual {v1}, Landroid/content/Context;->getPackageName()Ljava/lang/String;

    move-result-object v1

    const/16 v2, 0x40

    # 獲取packageInfo對象
    invoke-virtual {v0, v1, v2}, Landroid/content/pm/PackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;

    move-result-object v0
    # 得到packageInfo.signatures屬性,該屬性為Signature[] 數(shù)組
    iget-object v0, v0, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature;

    const/4 v1, 0x0
    # 獲取數(shù)組中的第一個元素signatures[0]即Signature對象
    aget-object v0, v0, v1

10. 退出app的語法 — 方式一

android:

# 殺掉自己進程
android.os.Process.killProcess(android.os.Process.myPid());

smali:

# 獲取進程ID
invoke-static {}, Landroid/os/Process;->myPid()I

move-result v0
# 殺死指定ID的進程
invoke-static {v0}, Landroid/os/Process;->killProcess(I)V

11. 退出app的語法 — 方式二

android:

System.exit(0);

smali:

const v0, 0
invoke-static {v0}, Ljava/lang/System;->exit(I)V

12.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,292評論 0 17
  • 一、簡歷準備 1、個人技能 (1)自定義控件、UI設計、常用動畫特效 自定義控件 ①為什么要自定義控件? Andr...
    lucas777閱讀 5,371評論 2 54
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準。 注意:講述HT...
    kismetajun閱讀 28,755評論 1 45
  • 很多人寫文章,喜歡把什么行業(yè)現(xiàn)狀啊,研究現(xiàn)狀啊什么的寫了一大通,感覺好像在寫畢業(yè)論文似的,我這不廢話,先直接上幾個...
    龐哈哈哈12138閱讀 3,054評論 1 8
  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 https://blog.csdn.net/zhaoyanj...
    勤奮的pangdunhu閱讀 2,225評論 0 1

友情鏈接更多精彩內(nèi)容