Smali是什么?
简介
Smali支持注解、调试信息、行数信息等基本Java的基本特性,可以说是很接近Java编译在JVM上的中间语言了,一般用来做Android程序的逆向工程
由于Smali是用于Dalvik和Art(Android虚拟机)的反汇编程序实现
APK文件>dex文件>smali文件>修改代码
所以smali语言是Dalvik的反汇编语言
B---byte
C---char
D---double
F---float
I---int
J---long
S---short
V---void
Z---boolean
[XXX---array
Lxxx/yyy---object
这里解析下最后两项,数组的表示方式是:在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F;对象的表示则以L作为开头,格式是LpackageName/objectName;(注意必须有个分号跟在最后),例如String对象在smali中为:Ljava/lang/String;,其中java/lang对应java.lang包,String就是定义在该包中的一个对象。
或许有人问,既然类是用LpackageName/objectName;来表示,那类里面的内部类又如何在smali中引用呢?答案是:LpackageName/objectName$subObjectName;。也就是在内部类前加“$”符号
二、函数的定义
函数的定义一般为:
Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type
参数与参数之间没有任何分隔符:
1. foo ()V
>>>>void foo()。
2. foo (III)Z
>>>>boolean foo(int, int, int)。
3. foo (Z[I[ILjava/lang/String;J)Ljava/lang/String;
>>>>String foo (boolean, int[], int[], String, long)
Smali 格式结构
.class [修饰关键字] .super .source
1 .class public Lcom/disney/WMW/WMWActivity;#是com.disney.WMW这个package下的一个类
2 .super Lcom/disney/common/BaseActivity;#继承自com.disney.common.BaseActivity
3 .source "WMWActivity.java"#这是一个由WMWActivity.java编译得到的smali文件4
5 # interfaces接口信息6 .implements Lcom/burstly/lib/ui/IBurstlyAdListener;#这个WMWActivity实现了一个com.burstly.lib.ui这个package下(一个广告SDK)的IBurstyAdListener接口。
7
8 # annotations内部类9 .annotation system Ldalvik/annotation/MemberClasses;10 value = {#有两个成员内部类11 Lcom/disney/WMW/WMWActivity$MessageHandler;,
12 Lcom/disney/WMW/WMWActivity$FinishActivityArgs;13 }14 .end annotation15
由此可以的出源java文件
class WMWActivity extends BaseActivity implementsIBurstlyAdListener{//... 继承 接口
classMessageHandler {//...
}classFinishActivityArgs{//...
}
}
# static fields静态域
.field private static final PREFS_INSTALLATION_ID:Ljava/lang/String; = "installationId"# instance fields实例域
.fieldprivate _activityPackageName:Ljava/lang/String;
static fields和instance fields均为成员变量
instance field 是对象的变量,每一个这个类的对象都会有一个该instance field
#