文件基本格式
普通类、抽象类、接口、内部类,在反编译出来的smali代码中都是以单独的smali文件存放。每个smali 文件头3行描述基本信息
.class <访问权限> [修饰关键字] <类名>
.super <父类名>
.source <源文件名>
打开 MainActivity.smali 文件
.class public Lcom/example/demo/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"
第一行“.class” 指定当前的类名 ,类名表示类似于 jni 技术的类
第二行“.super” 指定父类
第三行“.source” 指定当前类的源文件名,混淆后可能没有值
如果类实现过接口
# interfaces
.implements Landroid/view/View$OnClickListener;
属性
-
静态属性
# static fields .field <访问权限> static [修饰关键字] <字段名>:<字段类型>
"#"开头为注释,“.field” 后面的访问权限为public、private、protected之一,修饰关键字为 final... ,字段名与字段类型使用冒号“:”分隔,类似swift的变量声明语法
var str:String = "hello"
具体示例
# static fields
.field private static final TAG:Ljava/lang/String; = "Activity"
-
实例属性
# instance fields .field <访问权限> static [修饰关键字] <字段名>:<字段类型>
与静态属性相比少了static 关键字
方法
# direct methods
.method <访问权限> [修饰关键字] <方法原型>
<.locals>
[.parameter]
[.prologue]
[.line]
<代码体>
.end method
“.locals” 表示局部变量的个数
“.parameter” 方法的参数,肯存在多条
“.prologue” 代码的开始处,混淆的代码可能去掉改条
“.line” 知道在源代码中的行号
虚方法在起始的注释为“virtual methods”
-
静态方法
.method public static getString()Ljava/lang/String; .locals 1 .prologue .line 58 const-string v0, "" return-object v0 .end method
内部类
文件名 ”[外部类名]$[内部类名].smali“
匿名内部类 ”[外部类名]$[数字].smali“