smali语句中sget和sput

sput是对静态字段写操作,sget是对静态字段读操作。iput和iget是面对普通字段。

smali代码:

sget-object v0, Lcom/disney/Class1;->PREFS_INSTALLATION_ID:Ljava/lang/String;

上句中sget-object指令把PREFS_INSTALLATION_ID这个String成员变量获取并放到v0寄存器中。

iget-object v0, p0, Lcom/disney/Class1;->_view:Lcom/disney/Class2;

上句iget-object指令比sget-object多了一个参数p0,就是该变量所在类的实例,在这里就是p0即“this”。


put指令的使用和get指令是统一的,示例:

const/4 v3, 0x0
sput-object v3, Lcom/disney/Class1;->globalIapHandler:Lcom/disney/config/GlobalPurchaseHandler;

上句相当于Class1.globalIapHandler = null;




Smali成员变量指令简析

1.sget-object v0, Lcom/aaa;->ID:Ljava/lang/String;

  • sget-object就是用来获取变量值并保存到紧接着的参数的寄存器中

本例中,它获取ID这个String类型的成员变量并放到v0这个寄存器中。

注意:前面需要该变量所属的类的类型,后面需要加一个冒号和该成员变量的类型,中间是“->”表示所属关系。

2.iget-object v0, p0, Lcom/aaa;->view:Lcom/aaa/view;

  • 可以看到iget-object指令比sget-object多了一个参数,就是该变量所在类的实例,在这里就是p0即“this”。

3.sput指令的使用

  • const/4 v3, 0x0
  • sput-object v3, Lcom/aaa;->timer:Lcom/aaa/timer;

  相当于:this.timer=null

4.iput指令的使用

  • .local v0, args:Landroid/os/Message;
  • const/4 v1, 0x12
  • iput v1, v0, Landroid/os/Message;->what:I

  相当于:args.what = 18;

# instance fields  定义实例变量的标记

# static fields 定义静态变量的标记

# direct methods 定义类直系方法(自定义)的标记

# virtual methods 定义类非直系(继承重载等)的标记


const-string v7 ,"Launcher"    字符串常量v7赋值给Launcher

new-instance v6,L java/lang/StringBuilder;   新实例化一个StringBuilder对象


input-boolean v6, p0, L com/android/launcher2/Launcher;->mPermanentMenuKey:Z

p0代表该对象的this,v6代表一个变量(寄存器中值),该命令java命令实现为将v6值赋值给mPermanentMenuKey,以下为java代码

(this.)mPermanentMenuKey =  v6;


iget-object v6, p0, L com/android/launcher2/Launcher;->mModel:Lcom/android/launcher2/LauncherModel;

p0代表该对象this,v6代表一个变量,该命令java实现po.(this.)mModel赋值给v6,以下为java代码

v6 = (this.)mModel;


invoke-super {p0,p1},Landroid/app/ActivityGroup;->onCreate(Landroid/os/Bundle;)V

p0代表该对象this,p1为方法参数,java代码

super.onCreate(Bundle p1);  (p1=insavestance)


invoke-virtual {p0},Lcom/android/Launcher2/Launcher;_>getApplication()L android/app/Application;

p0代表该对象this,java代码:(this.)getApplication();


invoke-interface {v3,v6,v9},Landroid/content/SharedPreferences;->getBoolean(Ljava/lang/String;Z)Z

java实现代码为:v3.getBoolean(v6,v9);


move-result-object v0 将上一条命令的结果赋值给v0


check-cast v0,Lcom/android/Launcher2/launcherApplication;

定义v0的类型为LauncherApplication


if-nez p1,  :cond_2

如果p1不为null,则执行cond_2代码块

 

return-void 没有返回值


你可能感兴趣的:(smali语句中sget和sput)