Smali语法学习
数据类型:基类和引用类型,引用类型是对象和数组,其他都是基类。
在dalvik字节码中,寄存器总是32位可以存放任何类型的值,2个寄存器可以用来存放64位类型(长整形和双精度型)
#
表示注释
# 基类
字符 | 表示含义 |
---|---|
V | 空类型---仅仅可以用来作为返回类型 |
Z | Boolean, 布尔型 |
C | Char字符型 |
B | Byte, 字节型 |
I | Int整型 |
S | Short短整型,16位 |
J | Long长整型,64位 |
F | Float浮点型 |
D | Double,双精度浮点型, 64位 |
# 引用类型
对象:Lpackage/name/ObjectName; L表明一个对象类型,分号表明对象名的结束,等同于java语言中的package.name.ObjectName结构。 例如:"Ljava/lang/String;" => "java.lang.String"
数组:以"["开始,"[I"表示一维整形数组,等同于Java中"int[]","[Ljava/lang/String"等同于Java中"String[]"
# 方法
Lpackage/name/ObjectName;->MethodName(III)Z: Lpackage/name/ObjectName; 是一个类, MethodName明显是一个方法名,(III)Z是方法的签名,‘III’在这个例子中是三个整形参数,Z是表示返回一个布尔类型的返回值
方法的参数一个接一个的列举在右边,中间没有分号
method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; 等同于Java中: String method(int, int[][], int, String, Object[])
# Smali文件解读
.class public Lcom/netease/ntunisdk/SdkNetease; // 类名(SdkNetease),包名(com.netease.ntunisdk)和访问属性(public)
.super Lcom/netease/ntunisdk/base/SdkBase; // 继承自com.netease.ntunisdk.base.SdkBase
.source "SdkNetease.java" // 由"SdkNetease.java"编译得到的smali文件
# interfaces
.implements Lcom/netease/ntunisdk/base/StartupActivity$StartupFinishListener; // 这个SdkNetease实现了一个com.netease.ntunisdk.base这个package下的StartupActivity类内部类StartupFinishListener接口
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lcom/netease/ntunisdk/SdkNetease$payCallback;,
Lcom/netease/ntunisdk/SdkNetease$LoginCallback;,
Lcom/netease/ntunisdk/SdkNetease$AnonymousLoginCallback;
}
.end annotation
// SdkNetease类内含有payCallback,LoginCallback,AnonymousLoginCallback三个内部类
# static fields
.field private static final TAG:Ljava/lang/String; = "UniSDK netease"
// 静态成员变量,访问权限private,变量名TAG, 变量类型:Ljava/lang/String;变量值:""UniSDK netease"
# instance fields
.field private debugMode:Z
// 实例成员变量,访问权限private,变量名debugMode,类型Z(Boolean型)
===== 综合以上信息得到的Java文件 ======
public class SdkNetease extends SdkBase implements StartupActivity.StartupFinishListener {
private static final String TAG = "UniSDK netease";
private Boolean debugMode;
//...
class payCallback {
// TODO
}
//...
class LoginCallback {
// TODO
}
//...
class AnonymousLoginCallback {
// TODO
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
- .method 方法
- .prologue 方法开始
- .line 12 此方法位于第12行
- .end method 函数结束
上次更新: 2022/12/02, 22:04:34