Note that: 需要安卓开发的基础知识.

这个课题,将会拆成几篇,向你讲解一些基本的Smali语法。我会先向你展示一些原样的Java代码。再展示反编译后,对应的Smali代码。通过二者的对比,来一 一的进行定义讲解。

一、类定义:

我们来看一下,android中最基本的类定义,这里以一个基础的MainActivity为样版。

Android 系统语言变化触发 onConfigurationChanged_Smali


如图所示,我们可以得出以下这些信息:

1、这是一个公有的类。

2、类名叫MainActivity。

3、继承自AppCompatActivity.

接下来,我们来看一下,反编译后,对应的Smali代码是什么样的。

Android 系统语言变化触发 onConfigurationChanged_Smali_02


如图所示,我们可以得出以下这些信息:

1、.class表示,这是一个类,后面的public,代表其是公有的,即该类的访问权限。
2、类名, 是以完整包名的形式展示的。
3、.super表示,这是一个父类, 类名同样是,以完整包名的形式展示的。
4、.source表示,该类所在的文件名为MainActivity.java。
5、L,完整包名前的这个修饰符,表示这是一个对象类型。
6、;,分号放于对象类型的结尾,类似于Java的一条语句的结尾,一样是必须的。

从上所述,我们可以得出以下总结:

1、.class <访问权限> <关键修饰字> <类名;>
2、.super <关键修饰字> <父类名;>
3、.source <源文件名>

二、成员变量(类字段)定义:

同样地,让我们先看一下成员变量定义部分的代码。

Android 系统语言变化触发 onConfigurationChanged_Smali_03


如图所示,我们可以得出以下这些信息:

1、有一个私有的、类型为String、变量名为stringType的成员变量。
2、有一个保护的、类型为int、变量名为intType的成员变量。
3、有一个公有的、类型为boolean、变量名为booleanType的成员变量。

接下来,我们来看一下,反编译后,对应的Smali代码是什么样的。

Android 系统语言变化触发 onConfigurationChanged_成员变量_04

如图所示,我们可以得出以下这些信息:

1、注释, 注释由#开头,后面的instance fields, 意为实例的字段,即成员变量字段。
2、.field表示,这是一个字段。 public,代表公有的,booleanType,是变量名。:Z,是变量的类型.

从上所述,我们可以得出以下总结:

1、注释,由#开头,后面跟的instance fields, 是解释下面的内容是什么
2、.field <访问权限> <变量名> <变量类型>

关于变量类型,由Java代码转为Smali的列表,我将放在文章的最底部,以供参考。

三、方法的定义:

同样地,让我们先看一下成员变量定义部分的代码。

Android 系统语言变化触发 onConfigurationChanged_变量名_05

如图所示,我们可以得出以下这些信息:

有一个私有的、返回类型为void、方法名为onPrivateMethod的方法。

接下来,我们来看一下,反编译后,对应的Smali代码是什么样的。

Android 系统语言变化触发 onConfigurationChanged_成员变量_06

如图所示,我们可以得出以下这些信息:

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