您的位置:首页 > 移动开发 > Android开发

smali语法

2015-10-29 20:45 453 查看
临时要看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分钟休息=一个番茄组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息