Note that: 需要安卓开发的基础知识.
这个课题,将会拆成几篇,向你讲解一些基本的Smali语法。我会先向你展示一些原样的Java代码。再展示反编译后,对应的Smali代码。通过二者的对比,来一 一的进行定义讲解。
一、类定义:
我们来看一下,android中最基本的类定义,这里以一个基础的MainActivity为样版。
如图所示,我们可以得出以下这些信息:
1、这是一个公有的类。
2、类名叫MainActivity。
3、继承自AppCompatActivity.
接下来,我们来看一下,反编译后,对应的Smali代码是什么样的。
如图所示,我们可以得出以下这些信息:
1、.class表示,这是一个类,后面的public,代表其是公有的,即该类的访问权限。
2、类名, 是以完整包名的形式展示的。
3、.super表示,这是一个父类, 类名同样是,以完整包名的形式展示的。
4、.source表示,该类所在的文件名为MainActivity.java。
5、L,完整包名前的这个修饰符,表示这是一个对象类型。
6、;,分号放于对象类型的结尾,类似于Java的一条语句的结尾,一样是必须的。
从上所述,我们可以得出以下总结:
1、.class <访问权限> <关键修饰字> <类名;>
2、.super <关键修饰字> <父类名;>
3、.source <源文件名>
二、成员变量(类字段)定义:
同样地,让我们先看一下成员变量定义部分的代码。
如图所示,我们可以得出以下这些信息:
1、有一个私有的、类型为String、变量名为stringType的成员变量。
2、有一个保护的、类型为int、变量名为intType的成员变量。
3、有一个公有的、类型为boolean、变量名为booleanType的成员变量。
接下来,我们来看一下,反编译后,对应的Smali代码是什么样的。
如图所示,我们可以得出以下这些信息:
1、注释, 注释由#开头,后面的instance fields, 意为实例的字段,即成员变量字段。
2、.field表示,这是一个字段。 public,代表公有的,booleanType,是变量名。:Z,是变量的类型.
从上所述,我们可以得出以下总结:
1、注释,由#开头,后面跟的instance fields, 是解释下面的内容是什么
2、.field <访问权限> <变量名> <变量类型>
关于变量类型,由Java代码转为Smali的列表,我将放在文章的最底部,以供参考。
三、方法的定义:
同样地,让我们先看一下成员变量定义部分的代码。
如图所示,我们可以得出以下这些信息:
有一个私有的、返回类型为void、方法名为onPrivateMethod的方法。
接下来,我们来看一下,反编译后,对应的Smali代码是什么样的。
如图所示,我们可以得出以下这些信息:
1、.method表示, 这是一个方法。private,访问权限。onPrivateMethod,,方法名。V,返回类型。
参考资料
变量类型的转换
B—byte
C—char
D—double
F—float
I—int
S—short
V—void
J—long
Z—boolean
比较运算符
eq: equals
ne: not equals
lt: less than
gt: bigger than
le: less and equals
ge: bigger and equals
eqz: equals zero
nez: not equals zero
ltz: less than zero
btz: bigger than zero
gez: bigger and equals zero lez: less and equals zero