首页 > 其他 > 详细

Smail学习笔录

时间:2016-02-22 17:05:44      阅读:265      评论:0      收藏:0      [点我收藏+]

一、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。

  1. class WMWActivity extends BaseActivity implements IBurstlyAdListener{
  2.     //...
  3.     class MessageHandler {
  4.         //...
  5.     }
  6.     class FinishActivityArgs{
  7.         //...
  8.     }
  9. }

值得注意的地方: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方法)。本地寄存器没有限制,理论上是可以任意使用的,下面例子:

  1. const/4 v0, 0x0
  2. iput-boolean v0, p0, Lcom/disney/WMW/WMWActivity;->isRunning:Z

上面的两句中,使用了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则不是,根据这个区别来获取这些不同的成员变量是也有不同的指令。一般来说,获取的指令有:

 

Smail学习笔录

原文:http://www.cnblogs.com/shizxq/p/5207521.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!