资料html
举例:java
const/4 v0, 0x0 //使用了v0本地寄存器,并把值0x0存到v0中 iput-boolean v0, p0, Lcom/disney/WMW/WMWActivity;->isRunning:Z //用iput-boolean这个指令把v0中的值存放到com.disney.WMW.WMWActivity.isRunning这个成员变量中,至关于: //this.isRunning = false;在非static函数中p0表明的是“this”,在这里就是com.disney.WMW.WMWActivity实例
[XXX---arrayandroid
数组:在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F;数组
Lxxx/yyy---objectapp
对象以L做为开头,格式是LpackageName/objectName;(注意必须有个分号跟在最后),例如String对象在smali中为:Ljava/lang/String;函数
Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Typethis
参数与参数之间没有任何分隔符
举例:.net
WMWActivity的内部类 :格式 LpackageName/objectName$subObjectName;。也就是在内部类前加“$”符号code
# annotations .annotation system Ldalvik/annotation/MemberClasses; value = { Lcom/disney/WMW/WMWActivity$MessageHandler;, Lcom/disney/WMW/WMWActivity$FinishActivityArgs; } .end annotation
成员变量分静态与非静态的,格式是:.field public/private [static] [final] varName: <类型> htm
# static fields .field private static final PREFS_INSTALLATION_ID:Ljava/lang/String; = "installationId"
# instance fields .field private _activityPackageName:Ljava/lang/String;
静态变量指令以s开头,非静态变量(instance)以i开头
静态变量的指令:
获取指令:sget、sget-boolean、sget-object等
操做指令: sput、sput-boolean、sput-object等
非静态变量的指令:
获取指令:iget、iget-boolean、iget-object等
操做指令:iput、iput-boolean、iput-object等
提示:
没有“-object”后缀的表示操做的成员变量对象是基本数据类型
带“-object”表示操做的成员变量是对象类型
boolean类型则使用带“-boolean”的指令操做
array类型使用aget和aget-object
sget-object v0, Lcom/disney/WMW/WMWActivity;->PREFS_INSTALLATION_ID:Ljava/lang/String; //获取PREFS_INSTALLATION_ID这个String类型的值 并并放到v0
iget-object v0, p0, Lcom/disney/WMW/WMWActivity;->_view:Lcom/disney/common/WMWView; //v0 将获取到的值放到v0, p0 是该变量所在类的实例 this
const/4 v3, 0x0 sput-object v3, Lcom/disney/WMW/WMWActivity;->globalIapHandler:Lcom/disney/config/GlobalPurchaseHandler; //至关于:this.globalIapHandler = null;(null = 0x0)
.local v0, wait:Landroid/os/Message; const/4 v1, 0x2 iput v1, v0, Landroid/os/Message;->what:I //至关于:wait.what = 0x2;(wait是Message的实例)
两种类型的方法:
invoke-static 调用static函数的
invoke-static {}, Lcom/disney/WMW/UnlockHelper;->unlockCrankypack()Z
{}:是{调用该方法的实例,参数列表}
const-string v0, "fmodex" invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V //至关于 static void System.loadLibrary("fmodex")
* invoke-virtual:用于调用protected或public函数
sget-object v0, Lcom/disney/WMW/WMWActivity;->shareHandler:Landroid/os/Handler;
invoke-virtual {v0, v3}, Landroid/os/Handler;->removeCallbacksAndMessages(Ljava/lang/Object;)V
// v0是shareHandler:Landroid/os/Handler,v3是传递给removeCallbackAndMessage方法的Ljava/lang/Object参数
// {v0 是调用的实例,v3是参数}
* invoke-xxxxx/range:当方法的参数多于5个时(含5个),而是在后面加上“/range”
invoke-static/range {v0 .. v5}, Lcn/game189/sms/SMS;->checkFee(Ljava/lang/String;Landroid/app/Activity;Lcn/game189/sms/SMSListener;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
//这里有点迷惑
### 函数返回值
const/4 v2, 0x0
invoke-virtual {p0, v2}, Lcom/disney/WMW/WMWActivity;->getPreferences(I)Landroid/content/SharedPreferences;
move-result-object v1
v1保存的就是调用getPreferences(int)方法返回的SharedPreferences实例
invoke-virtual {v2}, Ljava/lang/String;->length()I
move-result v2
v2保存的则是调用String.length()返回的整型。
###.locals .locals 0 表示这个函数中最少要用到的本地寄存器的个数 (参考文章第4点讲的挺透彻) ### 条件跳转分支 [引用](http://www.360doc.com/content/14/1011/10/12917046_416004153.shtml) * if-eqz v0, :cond_0 意思是 若是v0等于0则跳转 :cond_0;(eqz:就是equal zero) * if-nez v0, :cond_0 意思是 若是v0不等于0则跳转 :cond_0;(nez:就是inequal zero) * switch:[参考](http://blog.csdn.net/lostinai/article/details/48975661)
.packed-switch 0x0 #case 区域,从0开始,依次递增 :pswitch_0 #case 0 :pswitch_1 #case 1 :pswitch_2 #case 2 :pswitch_3 #case 3 .end packed-switch pswitch_data_0 为case 区域,在 case 区域中,第一条指令“.packed-switch”指定了比较的初始值为0 ,pswitch_0~ pswitch_3分别是比较结果为“case 0 ”到“case 3 ”时要跳转到的地址 ```