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文件解读

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
.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
}

}
  • .method 方法
  • .prologue 方法开始
  • .line 12 此方法位于第12行
  • .end method 函数结束
有用就打赏一下作者吧!