# apktool d App-debug.apk
使用d进行反编译并且储存在App-debug文件里面
反编译后到app-debug文件夹里面看每个类都对应这一个smali文件
smali
在Java字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个寄存器表示
p命名法和v命名法: p命名法通常用于表示函数参数,比如p0、p1等
v命名法用于表示函数内部的变量,比如v0、v1等
数据类型
引用类型
对象类型:
“Lpackage/name/ObjectName;”的形式表示。
其中,L表示这是一个对象类型,“;”标识对象名称的结束,
中间的package/name表示对象的包名,ObjectName表示对象名。
最终这样的形式相当于java源代码中package.name.ObjectName类的完整表示, 比如com.roysue.demo02.MainActivity 类 ,
最 终 表 示 为“Lcom/roysue/demo02/MainActivity;”
if-eqz p1, :cond_0(如果p1寄存器中的内容为0就跳转到:cond_0处)
数组类型:
只需要在类型的前面加上“[”即可
[Ljava/lang/String表示一个String字符串的数组类型
“#”用于注释
#smali的文件头三行描述了类的信息
1 | .class <访问权限> [关键修饰字] <类名>; |
“Lcom/roysue/demo02/ MainActivity;”的表示方式符合字节码的相关约定,即表示MainActivity类。
.super后跟着的是类的父类,与Java中的extends关键词后跟着AppCompatActivity类是一致的。
.source关键词后跟着的是当前类的源文件名。需要注意的是,第三行的.source关键词后的文件名可以通过ProGuard优化器去除掉。
.field关键词后跟着成员变量的访问权限
函数的声明以.method关键词开始,以.end method关键词结束
.locals关键词用于表示函数中非参数的变量的多少
.registers关键词则表示函数中使用寄存器的数量
.param关键词用于声明方法中的参数名,比如:.param p1, “savedInstanceState”表明onCreate()函数的参数名为”savedInstanceState”;
.line参数则保存着相应代码在Java源文件中的行号信息
常量操作指令主要是const相关指令,方法调用指令是以invoke关键词开头的一类指令,通常用于 调 用 外 部 函 数 其基本格式 invoke-kind{vA,vB,vC},mehtod@DDDD
mehtod@DDDD表示函数的引用;vA,vB,vC则表示函数的参数,其定义顺序与调用函数的参数一一 对 应 ;kind 则 代 表 被 调 用 的 类 型 , 主 要 有 static 、 virtual 、super(被调用的函数是静态函数、正常的函数和父类函数等)
签名