1、Smali语法解析
.class <访问权限> [修饰关键字] <类名> //指定了当前类名
.super <父类名> //指定了当前类的父类
.soucre <源文件名> //指定了当前类的源文件名
例如:
打开某反编译的smali文件:
该源程序结构如图所示:(包文件不考虑)
接下介绍的是字段(fields):声明字段使用“.field”指令
静态字段(static)在装载程序集就分配内存空间
实例字段(instance)要实例化才能使用,没有实例化不能使用
2、
#static fields
.field <访问权限> [修饰关键字] static 字段:字段类型
#instance fields
.field <访问权限> [修饰关键字] 字段:字段类型
两者区别:后者少了static关键字。
比如以下的实例字段声明:
.field private conn:Landroid/content/ServiceConnection;
表示声明一个私有字段conn;它的类型是“android/content/ServiceConnection;”。(注意分号不能丢)
如果一个类中有方法,那么必然有相关的发编译代码。方法的声明使
3、用“.method”指令,“.end method”表示方法结束。
直接方法(direct)
虚方法(virtual)
#direct methods
.method <访问权限> [修饰关键字] <方法原型>
<.locals> //声明局部变量的个数
[.parameter] //声明参数的个数
[.prologue] //指令的开始处
[.line] //指示在源代码的行数
<代码体>
.end method
虚方法和直接方法相同,只是注释不同。
如果一个类实现了接口,会使用”.implememts”指令。
#interfaces
.implememts <接口名>
如果一个使用了注释,会使用“.annotation”指令。
MemberClasses 注解是编译时自动加上的, MemberClasses 注解是一个“系统注解”,作用是为父类提供一个MemberClasses列表。MemberClasses即子类成员集合,通俗的讲就是一个内部类列表。
注释的格式:
#annotations
.annotation [注释属性] <注释类名>
[注释字段=值]
.end annotation