临时要看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分钟休息=一个番茄组