smali语法

临时要看Android的smali文件,就边看边记录着吧

1.
在网上看了一些smali语法的说明,发现跟我反编译出现的smali语法不太一样,猜测是不同反编译器反编译出来的会有所不同,也可能是不同Android版本的smali语法本身就不一样,反正不管了,有时间再去研究这个,先说下我用Android版本和反编译工具

android 17 (android sdk 4.2.2-576024)
dex2jar-2.0

2.
介绍下这个apk反编译工具–dex2jar,dex2jar 是一个能操作Android的dalvik(.dex)文件格式和Java的(.class)的工具集合,他包含了以下这些功能(不完全,还有不少没用过),对了,支持 windows 和 liunx(含mac) 环境

  • dex to jar
  • dex to smali
  • jar to dex
  • jar to smali
  • apk to smali

3.
dex2jar就到这里,smali语法还是挺好玩的,比如下面这个

.method public close()V
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/IOException;
        }
    .end annotation
# ...
    return-void
.end method

注:smali代码中,# 表示注释。

上面这段smali代码写成Java代码是这样的

public void close() throws java.io.IOException {
    // ...
}

好玩吧,annotation包含的代码段是申明一个异常-Ldalvik/annotation/Throws,表示该方法将会抛出一个异常,具体的异常类型在annotation代码块里写明。方法对外抛出异常时,smali代码中,annotation总是在第一行就会申明的。

当然,从上面smali代码里,还可以看出更多的信息,比如一个方法是用

.method
# ...
.end method

表示的,都是成对出现,还有

.method public close()V

close表示方法名,public表示作用域,最后面跟着的大V,表示该方法的返回值为无类型,即无返回值,大V表示Java中的 void 类型

注:Java中的关键字void也是一种类型,表示无类型,只能用于方法返回值类型。

下面简单列下smali中的类型符号及其与Java的类型对应(只列出原始类型)

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

以上是原始类型符号,复杂类型(对象类型)的表示符号也很好认识,当然,在上面smali代码里也能找到例子,比如第四行:

Ljava/io/IOException;

这就是一个Java对象类型

java.io.IOException

smali中,对象类型用

Lpackage/class;

表示,其中 package是包名,点号符用斜杆符替换,L表示类型名称开始标记,;(半角分号)表示类型名称结束标记,也挺清朗的啊。

……

可参考 Sam的博客:http://blog.isming.me/2015/01/14/android-decompile-smali/
……

对了,同时发现一个时间管理的好方法,叫番茄工作法,有兴趣的可以尝试一下。

精简番茄如下:

25分钟+5分钟休息=一个番茄
4个番茄+20分钟休息=一个番茄组


版权声明:本文为Excing原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。