一、Smail的数据类型:B---byteC---charD---doubleF---floatI---intJ---longS---shortV---voidZ---boolean[XXX---arrayLxxx/yyy---object
这里解析下最后两项,数组的表示方式是:在基本类型前加上中括号“[”,例如int数组和float数组分别表示为:[I、[F;对象的表示则以L作为开头,格式是:LPackageName/objectName;(注意必须有个分号跟在后面),例如String对象在Smail中为:LJava/lang/String,其中Java/lang对应Java.lang.String就是定义在该包下的一个对象。
二、函数的定义:
函数的定义一般为:
Func-Name(Para-Type1Para-Type2Para-Type3Para...)Return-type
注意参数与参数之间没有任何分隔符:
1. foo ()V 表示 void foo();
2. foo(III)Z表示boolean foo(int,int,int);
3.foo(Z[I[ILjava/lang/String;J)L/java/lang/string; 表示:String foo(boolean,int[],int[],String,long)
三、Smail文件的具体介绍
1.Smail中的继承、接口、包信息首先看看开头的几行:
1] .class public Lcom/disney/WMW/WMWActivity;
2] .super Lcom/disney/common/BaseActivity;
3] .source "WMWActivity.java"
4]
5] # interfaces
6] .implements Lcom/burstly/lib/ui/IBurstlyAdListener;
7]
8] # annotations
9] .annotation system Ldalvik/annotation/MemberClasses;
10] value = {
11] Lcom/disney/WMW/WMWActivity$MessageHandler;,
12] Lcom/disney/WMW/WMWActivity$FinishActivityArgs;
13] }
14] .end annotation
1-3行定义的是基本信息:这是个由WMWActivity.java编译得到的smali文件(第3行)
它是com.disney.WMW这个package下的一个类,继承自com.disney.common.BaseActivity
5-6行定义的接口信息:这个类实现了一个com.burstly.lib.ui这个package下的BustyAdLsitener接口
8-14行定义的则是内部类:它有两个成员内部类----Messagehandler和FinishActivityArgs。
值得注意的地方:Dalvik VM与JVM的最大区别之一就是Dalvik VM是基于寄存器。基于寄存器就是Smail里的所有操作都必须经过寄存器来进行;本地寄存器用V开头数字结尾的符号来表示,例如V0、V1、V2....参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2...特别注意的是,p0不一定是函数的第一个参数,在非static的函数中,p0代指“this”,p1表示函数的第一个参数,p2代表函数的第二个参数,而在static函数中的p0才对应第一参数(因为Java的static方法中没有this方法)。本地寄存器没有限制,理论上是可以任意使用的,下面例子:
上面的两句中,使用了V0寄存器,并把值0x0存到v0中,然后第二句用iput-boolan这个指令v0中的值存放到com.disney.WMWActivity.isRunning这个成员变量中,即相当于;this.isRunnning = false;在这里就是com.disney.WVMActivity实例。关于这两句话的具体指令和含暂可不用理会
2.Smail中的成员变量
下面学习有关成员变量的内容:
1 ] # static fields
2 ] .field private static final PREFS_INSTALLATION_ID
java/lang/String; = "installationId"
3 ] //...
4 ]
6 ] # instance fields
7 ] .field private _activityPackageName
java/lang/String;
8 ] //...
上面定义的static fields和instance fields均为成员变量,格式是:field public/private[static][final] varName<类型>.然而static fields和 instance fields还是有区别的,当然区别很明显,那就是static fields 是static的,而instance则不是,根据这个区别来获取这些不同的成员变量是也有不同的指令。一般来说,获取的指令有:
原文:http://www.cnblogs.com/shizxq/p/5207521.html