转载请声明出处:https://blog.csdn.net/YoYo_Newbie/article/details/90745115
官方吐槽:什么是Smali
smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。
修改Smali文件有什么作用?
通过修改使用工具将Apk反编译生成的smali文件,可以重新生成新的Apk进行使用。
怎么得到Smali文件?
通过反编译Java,生成Smali(可以使用apktool工具可进行反编译), 如xx.Test.java 反编译==> xx.Test.smali
实践分析
构建一个包名为csdn.yoyo_newbie.smalianalyzesample的Test.java文件
package csdn.yoyo_newbie.smalianalyzesample;
public class Test {
public Test(){
super();
}
}
使用apktool进行反编译生成的Smali文件:
csdn\yoyo_newbie\smalianalyzesample\Test.smali
.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test;
.super Ljava/lang/Object;
.source "Test.java"
# direct methods
.method public constructor <init>()V
.locals 0
****
.prologue
.line 5
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 6
return-void
.end method
如下,第一行 ,代表声明一个public的class ,它的className为"csdn.yoyo_newbie.smalianalyzesample.Test.class",
其中L代表是对象类型
.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test
第二行,代表它继承的父类为 java.lang.Object.class
.super Ljava/lang/Object;
第三行,代表这个csdn.yoyo_newbie.smalianalyzesample.Test.class来自Test.java个文件
.source “Test.java”
为什么还要声明来自哪里,一定就是Test.java这个文件无疑,不是多此一举吗?一开始我也是这样想的,当我深思后才恍然大悟,不是有内部类吗?请看下面代码
package csdn.yoyo_newbie.smalianalyzesample;
public class Test {
public Test(){
super();
}
public static class Show{
}
}
编译后,会生成2个文件
csdn\yoyo_newbie\smalianalyzesample\Test.smali
.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test;
.super Ljava/lang/Object;
.source "Test.java"
................... 此处省略其他代码
csdn\yoyo_newbie\smalianalyzesample\Test$Show.smali
.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test$Show;
.super Ljava/lang/Object;
.source "Test.java"
................... 此处省略其他代码
有没有发现!内部类Show的.Source的值也是Test.java.
本次内容,就到这里,下面的代码暂时不讲解,将在下一篇分析。