类信息描述
smali文件的前三行描述的是当前的类信息。
格式:
.class<访问权限>[修饰关键字]<类名>
.super<父类名>
.source<源文件名>
示例代码:
.class public Lcom/qq/unclegy/MainActivity
.super Landroid/app/Activity
.source "MainActivity.java"
注:如果经过代码混淆,则反编译出来的smali代码可能没有源文件的信息。
字段
静态字段
格式
#static fields
.field<访问权限>[修饰关键字]<字段名>:<字段类型>
实例字段
格式
#instance fields
.field<访问权限>[修饰关键字]<字段名>:<字段类型>
方法
直接方法
格式
#direct methods
.method<访问权限>[修饰关键字]<方法原型>
<.locals>
[.parameter]
[.prologue]
[.line]
<代码体>
.end method
虚方法
格式
#virtual methods
.method<访问权限>[修饰关键字]<方法原型>
<.locals>
[.parameter]
[.prologue]
[.line]
<代码体>
.end method
字段含义
字段 | 含义 |
---|---|
<.locals> | 局部变量个数 |
[.parameter] | 方法的参数 |
[.prologue] | 指定了代码的开始处 |
[.line] | .prologue指令在源代码中的行号 |
接口
格式
#interface
.implements<接口名>
注解
格式
#annotations
.annotation[注解属性]<注解类名>
[注解字段=值]
.end annotation
循环语句
for循环
Iterator<对象><对象名>=<方法返回一个对象列表>;
for(<对象><对象名>:<对象列表>){
[处理单个对象的代码体]
}
while循环
Iterator<对象><迭代器>=<方法返回一个迭代器>
while(<迭代器>:hasNext()){
<对象><对象名>=<迭代器>.next();
[处理单个对象的代码体]
}
特点
- 迭代器循环会调用迭代器的hasNext()方法检测循环条件是否满足
- 迭代器循环中调用迭代器的next()方法获得单个对象
- 循环中使用goto指令来控制代码流程
- for形式的迭代器循环展开后即为while形式的迭代器循环