资料来源: https://blog.csdn.net/yoyo _ newbie/article/details/90745115官方吐槽: Smali smali是用可读取Android字节码的字符串表示的语言
修改Smali文件有什么作用? 您可以通过修改使用工具反编译Apk生成的smali文件来重新生成和使用新的Apk。
我怎么得到Smali文件? 通过反编译Java,如xx.Test.java反编译==xx.Test.smali所示,生成smali (可以用apk tool工具进行反编译)
实践分析,创建名为csdn.lgdzfj_newbie.smalianalyzesample的Test.java文件
package csdn.lgdzfj _ newbie.smalianalyzesample; 公共类测试{公共测试(} { super ); 使用apktool反编译生成的Smali文件:
cdnlgdzfj _ newbiesmalianalyzesampletest.smali
. classpubliclcsdn/lgdzfj _ newbie/smalianalyzesample/test; super Ljava/lang/Object; source ' test.Java ' # direct methods.methodpublicconstructorinit () v.locals0* * *.prologue.line5invoke-direct 第一行表示声明公共的class,其className为' csdn.lgdzfj_newbifj )
其中L代表是对象类型
. classpubliclcsdn/lgdzfj _ newbie/smalianalyzesample/test
第二行显示继承的父类为java.lang.Object.class
. super Ljava/lang/Object;
第三行表示此csdn.lgdzfj _ newbie.smalianalyzesample.test.class来自Test.java文件
. source “ Test.java”
需要声明为什么来自哪里的一定是名为Test.java的文件。 不是多余的事吗? 一开始我也是这么想的,但深思熟虑后,我恍然大悟,是不是有内部班级。 请看下面的代码
package csdn.lgdzfj _ newbie.smalianalyzesample; 公共类测试{公共测试(} { super ); }公共静态类show { }编译将生成两个文件
cdnlgdzfj _ newbiesmalianalyzesampletest.smali
. classpubliclcsdn/lgdzfj _ newbie/smalianalyzesample/test; super Ljava/lang/Object; source 'Test.java ' .在此省略其他代码csdnlgdzfj _ newbiesmalianalyzesample test $ show.smali
. classpubliclcsdn/lgdzfj _ newbie/smalianalyzesample/test $ show; super Ljava/lang/Object; source 'Test.java ' .在这里省略其他代码也找不到吗! 内部类Show的. Source的值也是Test.java。
这次的内容到此为止,下面的代码暂时不做说明,进入下一个分析。