Smali入门

来源:互联网 发布:网络家教招聘 编辑:程序博客网 时间:2024/05/21 02:53

安装插件

安装java2smali插件

写一个最简单的java类

package barray.demo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;public class MainActivity extends AppCompatActivity {    String TAG = this.getClass().getSimpleName();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Log.d(TAG,"this is a tag");    }}

转换成Smali

Build->Compile to smali

这里写图片描述

.class public Lbarray/demo/MainActivity;.super Landroid/support/v7/app/AppCompatActivity;.source "MainActivity.java"# instance fields.field TAG:Ljava/lang/String;# direct methods.method public constructor <init>()V    .registers 2    .prologue    .line 7    invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;-><init>()V    .line 8    invoke-virtual {p0}, Ljava/lang/Object;->getClass()Ljava/lang/Class;    move-result-object v0    invoke-virtual {v0}, Ljava/lang/Class;->getSimpleName()Ljava/lang/String;    move-result-object v0    iput-object v0, p0, Lbarray/demo/MainActivity;->TAG:Ljava/lang/String;    return-void.end method# virtual methods.method protected onCreate(Landroid/os/Bundle;)V    .registers 4    .param p1, "savedInstanceState"    # Landroid/os/Bundle;    .prologue    .line 12    invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V    .line 13    const v0, 0x7f04001b    invoke-virtual {p0, v0}, Lbarray/demo/MainActivity;->setContentView(I)V    .line 14    iget-object v0, p0, Lbarray/demo/MainActivity;->TAG:Ljava/lang/String;    const-string v1, "this is a tag"    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I    .line 15    return-void.end method

分析如下:

.class public Lbarray/demo/MainActivity;.super Landroid/support/v7/app/AppCompatActivity;.source "MainActivity.java" 
公共类 barray/demo/MainActivity 继承 android/support/v7/app/AppCompatActivity源文件 MainActivity.java
  • 成员变量
# instance fields.field TAG:Ljava/lang/String; 
成员变量 类型 java/lang/String 变量名 TAG
  • 构造方法
.method public constructor <init>()V
公共构造方法
  • 寄存器
.registers 2
需要两个寄存器
  • 函数的开场白
.prologue
表示函数内执行的起始标记。直译为开场白的意思。
  • 行数
.line 7 
表示当前代码在源java文件中的行数。
  • 调用实例
invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;-><init>()V
invoke-virtual 或 invoke-virtual/range 调用实例的虚方法invoke-super 或 invoke-super/range 调用实例的父类方法invoke-direct 或 invoke-direct/range 调用实例的直接方法 invoke-static 调用实例的静态方法p0代表该对象thisLandroid/support/v7/app/AppCompatActivity 中的初始化方法
  • 返回
move-result(返回基本数据类型)move-result-object(返回对象)指令 return-void 返回void
  • 变量赋值
    iput-object v0, p0, Lbarray/demo/MainActivity;->TAG:Ljava/lang/String; 
将 v0 的值赋给 TAG
  • 函数结束
end method 
  • 参数
    .param p1, "savedInstanceState"    # Landroid/os/Bundle; 
 参数 p1 参数名  savedInstanceState 类型 android/os/Bundle
  • 常量
const v0, 0x7f04001b 
 常量 v0
原创粉丝点击