初识smali

简单的说,smali就是Dalvik VM内部执行的核心代码。

Dvm和Jvm

Dalvik字节码Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。虽然Android上的程序是使用java来开发的,但是Dalvik和标准的java虚拟机JVM还是两回事。Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex(dalvik executable),而JVM则执行的是java字节码。Dalvik VM比JVM速度更快,占用空间更少。

通过Dalvik的字节码我们不能直接看到原来的逻辑代码,这时需要借助如Apktool或dex2jar+jd-gui工具来帮助查看。但是,注意的是最终我们修改APK需要操作的文件是.smali文件,而不是导出来的Java文件重新编译(况且这基本上不可能)。

SMALI语法

smali基本数据类型和java一样,只是符号不同

B—byte
C—char
D—double
F—float
I—int
J—long
S—short
V—void
Z—boolean

[XXX—arrayLxxx 数组的表示方式是:在基本类型前加上前中括 号“[”,例如int数组和float数组分别表示为:[I、[F;

/yyy—object 对象的表示则以L作为开头,格式是LpackageName/objectName;(注意必须有个分号跟在最后),例如String对象在smali中为:Ljava/lang/String;,其中java/lang对应java.lang包,String就是定义在该包中的一个对象。

内部类的表示:LpackageName/objectName$subObjectName;在内部类前面加美元符

函数的定义

二、函数的定义

 函数的定义一般为:

 Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type

 注意参数与参数之间没有任何分隔符,同样举几个例子就容易明白了:

 1. foo ()V

     没错,这就是void foo()。

 2. foo (III)Z

     这个则是boolean foo(int, int, int)。

 3. foo (Z[I[ILjava/lang/String;J)Ljava/lang/String;

     看出来这是String foo (boolean, int[], int[], String, long) 了吗?

未完待续。。。。。。。。。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值