其中对象类型由L<包名>/<类名>;(完全限定名称)表示,要注意末尾有个分号,比如String表示为Ljava/lang/String;。
数组类型是[加上元素类型,比如int[]表示为[I。左方括号的个数也就是数组的维数,比如int[][]表示为*[[I*。
二、类的定义sma里文件里存放的一个类,文件开头保存着各种信息。
.class <权限修饰符> <非权限修饰符> <完全限定名称> .super <超类的完全限定名称> .source <源文件名>
例如一个主活动的文件MainActivity:
.class public Lnet/flygon/myapplication/MainActivity; .super Landroid/app/Activity; .source "MainActivity.java"
该类是public,完整名称是net.flygon.myapplication.MainActivity,继承了android.app.Activity,在源码中是MainActivity.java。如果类是abstract或者final的,会在public/private/protected后面表示。
类可以实现接口,如果类实现了接口,那么这三条语句下面会出现.implements <接口的完全限定名称>。比如通常用于回调的匿名类中会出现.implements Landroid/view/View$OnClickListener;。
.field <权限修饰符> <非权限修饰符> <名称>:<类型>
其中非权限修饰符可以为final或者abstract。
四、方法定义.method <权限修饰符> <非权限修饰符> <名称>(<参数类型>)<返回值类型>
...
.end method
五、数据定义
变量赋值对应的反编译代码
举例:
boolean z = true; z = false; byte b = 1; short s = 2; int i = 3; long l = 4; float f = 0.1f; double d = 0.2; String str = "test"; Class c = Object.class;
反编译后:
const/4 v10, 0x1 const/4 v10, 0x0 const/4 v0, 0x1 const/4 v8, 0x2 const/4 v5, 0x3 const-wide/16 v6, 0x4 const v4, 0x3dcccccd # 0.1f const-wide v2, 0x3fc999999999999aL # 0.2 const-string v9, "test" const-class v1, Ljava/lang/Object;六、数据运算
二元运算指令格式为<运算类型>-<数据类型> vx,vy,vz。其中算术运算的type可以为int、long、float、double四种(short、byte按int处理),位运算的只支持int、long。
| 指令 | 运算类型 | 含义 |
|---|---|---|
| 位运算 | ||
| and- vx,vy,vz | 与 | vx = vy & vz |
| or- vx,vy,vz | 异 | vx = vy l vz |
| xor- vx,vy,vz | 异或 | vx = vy ^ vz |
| shl- vx,vy,vz | 左移 | vx = vy << vz |
| shr- vx,vy,vz | 算术右移 | vx = vy >> vz |
| ushr- vx,vy,vz | 逻辑左移 | vx = vy >>> vz |
例:
int a = 5,
b = 2,
c = a + b,
d = a - b,
e = a * b,
f = a / b,
g = a % b,
h = a & b,
i = a | b,
j = a ^ b,
k = a << b,
l = a >> b,
m = a >>> b;
编译:
const/4 v0, 0x5 const/4 v1, 0x2 add-int v2, v0, v1 sub-int v3, v0, v1 mul-int v4, v0, v1 div-int v5, v0, v1 rem-int v6, v0, v1 and-int v7, v0, v1 or-int v8, v0, v1 xor-int v9, v0, v1 shl-int v10, v0, v1 shr-int v11, v0, v1 ushr-int v12, v0, v1七、条件跳转



