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;
本例中,它获取ID这个String类型的成员变量并放到v0这个寄存器中。
注意:前面需要该变量所属的类的类型,后面需要加一个冒号和该成员变量的类型,中间是“->”表示所属关系。
相当于:this.timer=null
相当于: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 没有返回值