什么是Smali:
我们用工具反编译一些APP的时候,会看到一个smali文件夹,里面其实就是每个Java类所对应的smali文件。Android虚拟机Dalvik并不是执行java虚拟机JVM编译后生成的class文件,而是执行再重新整合打包后生成的dex文件,dex文件反编译之后就是smali代码,可以说,smali语言是Dalvik的反汇编语言
JAVA和Smali数据类型对比:
JAVA Smali
V void Z boolean B byte S short C char I int J long F float D double 引用类型 L 对象 [ 数组
语法:
.field 定义变量 .method 方法 .parameter 方法参数 .prologue 方法开始 .line 12 此方法位于第12行 invoke-super 调用父函数 const/high16 v0, 0x7fo3 把0x7fo3赋值给v0 invoke-direct 调用函数 return-void 函数返回void .end method 函数结束 new-instance 创建实例 iput-object 对象赋值 iget-object 调用对象 invoke-static 调用静态函数
smali跳转语句 “if-eq vA, vB, :cond_**” 如果vA等于vB则跳转到:cond_** “if-ne vA, vB, :cond_**” 如果vA不等于vB则跳转到:cond_** “if-lt vA, vB, :cond_**” 如果vA小于vB则跳转到:cond_** “if-ge vA, vB, :cond_**” 如果vA大于等于vB则跳转到:cond_** “if-gt vA, vB, :cond_**” 如果vA大于vB则跳转到:cond_** “if-le vA, vB, :cond_**” 如果vA小于等于vB则跳转到:cond_** “if-eqz vA, :cond_**” 如果vA等于0则跳转到:cond_** “if-nez vA, :cond_**” 如果vA不等于0则跳转到:cond_** “if-ltz vA, :cond_**” 如果vA小于0则跳转到:cond_** “if-gez vA, :cond_**” 如果vA大于等于0则跳转到:cond_** “if-gtz vA, :cond_**” 如果vA大于0则跳转到:cond_** “if-lez vA, :cond_**” 如果vA小于等于0则跳转到:cond_**
DEMO:
java代码 private boolean show(){ boolean tempFlag = ((3-2)==1)? true : false; if (tempFlag) { return true; }else{ return false; } } 转换smali代码 .method private show()Z .locals 2 .prologue //方法开始 .line 22 const/4 v0, 0x1 // v0赋值为1 .line 24 .local v0, tempFlag:Z if-eqz v0, :cond_0 // 判断v0是否等于0, 不符合条件向下走, 符合条件执行cond_0分支 .line 25 const/4 v1, 0x1 // 符合条件分支 .line 27 :goto_0 return v1 :cond_0 const/4 v1, 0x0 // cond_0分支 goto :goto_0 .end method
参考:
http://blog.csdn.net/lostinai/article/details/48975661
http://blog.csdn.net/sjim_/article/details/50443860