Smali 语法

1、基础

1、变量类型

B—byte
C—char
D—double
F—float
I—int
S—short
V—void
J—long
Z—boolean

2、运算符

Smali 含义 符号
eq equals ==
ne not equals !=
lt less than <
gt bigger than >
le less and equals <=
ge bigger and equals >=
eqz equals zero =0
nez not equals zero !=0
ltz less than zero <0
btz bigger than zero >0
gez bigger and equals zero >=0
lez less and equals zero <=0

3、关键字

// L 代表一个对象类型
//.class 表示一个类,pulic 代表公有 ,后面是全包名
// ; 分号作为语句结尾 
.class public Lcom/zk/demo/MainActivity;
//.super 表示父类
.super Landroid/support/v7/app/AppCompatActivity; 
//.source 代表类所在的文件名
.source "MainActivity.java"
// # 声明
// .implements (实现接口 一般在文件顶部) <实现的接口>
# interfaces
.implements Ljava/lang/Runnable;

// 直属方法 当前类所有的,不可被覆写的方法 一般是 私有/静态方法、及静态构造方法
# direct methods
// 虚方法 当前类实现,但是可以被 子类覆写的方法,多为 public/protect/inteface 的方法
# virtual methods

//代码所属行数
. line
// 局部变量 寄存器申请数
.locals N 
// 方法的形参 非静态参数 p0 代指this ; p1 代指第一个形参 ,静态函数 p0 代指第一个参数
// .param [形参变量][形参名][形参类型]
.param p1, "msg"    # Ljava/lang/String;
//方法开始位置
.prologue
// 结束位置
.end field / mehod / annotation
//创建实例 new-instance v1, Lcom/example/zhaokai/demo/Test;
new-instance
// 获取 变量
sget-object
// 赋值
iput-object

4、字段

// # 后面跟声明 标识接下来的类型 <static 静态> 、<instance 实例>
# instance fields
.field private isPayTest:Z
# static fields

// .field 表示后面跟的是字段类型,结合上面语句代表 当前字段
//REQUEST_CODE 是个私有静态的int类型
// : 前面是字段名称,后面则是字段类型 ,= 后面则是字段的赋值
// 格式 .field <访问权限> <静态> <不可更改> <变量名> : <变量类型> = <赋值>  
.field private static final REQUEST_CODE:I = 0x186b4      

5、方法

//.method [方法权限]{[abstract/static/final] [varargs] }[方法名](形参类型 形参类型)[返回值类型]
.method protected setMsg(Ljava/lang/String;Ljava/lang/String;)V
    //方法内局部变量数(不包含形参)
    .locals 1
    .param p1, "msg"    # Ljava/lang/String;
    // 形参 可变形参 用数组标识 #[Ljava/lang/String;
    // 行数
    .line 31
    //…… 执行方法
    .line 32
    return-void 
    //无返回值 returen-object 返回指定值
//方法结束
.end method

6、局部变量

//本地寄存器(local register,非参寄存器)用v开头数字结尾的符号来表示,如v0、v1、v2、…,
// locals 1  对应一个本地寄存  v0
//参数寄存器(parameter register)用p开头数字结尾的符号来表示,如p0、p1、p2、…,p0 默认为this

7、赋值获取

sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
//获取参数值 变量名,对象类型 -> 获取方法 : 获取对象类型
iput-boolean v0, p0, Lcom/example/zhaokai/demo/Test;->isTest:Z
//给参数赋值
sget/sput: static 对已标识的静态字段执行已确定的对象静态字段运算
iget/iput: instance 对已标识的字段执行已确定的对象实例字段运算
aget/aput: array 在给定数组的已标识索引处执行已确定的数组运算

sget-类型 [wide/boolean/object/byte/char/short]

8、方法执行

//返回值
move-result-object v3
//调用指定的方法。所得结果(如果有的话)可能与紧跟其后的相应 move-result* 变体指令一起存储。

invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
//使用 invoke-virtual 调用正常的虚方法(该方法不是 private、static 或 final,也不是构造函数)

invoke-direct {v0, v1}, Lcom/example/zhaokai/demo/Test;->print(Ljava/lang/String;)Ljava/lang/String;
//invoke-direct 用于调用非 static 直接方法(也就是说,本质上不可覆盖的实例方法,
// 即 private 实例方法或构造函数)

invoke-static {v2}, Lcom/example/zhaokai/demo/Test;->setVERSION(Ljava/lang/String;)V
//invoke-static 用于调用 static 方法(该方法始终被视为直接方法)。

invoke-interface {v0}, Ljava/lang/Runnable;->run()V
//invoke-interface 用于调用 interface 方法,也就是说,在具体类未知的对象上,使用引用 interface 的 method_id。

invoke-super {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v0
//invoke-super 来调用在该接口上定义的该方法的最具体、未被覆盖版

9、常用语句

//日志输出
const-string v2, "push"
.local v2, "tag":Ljava/lang/String;
invoke-static {v2, p1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

10、smali 文件结构

// 当前类名:.class public Lcom/kwai/game/ddz/MainActivity;
// 父类:.super Lcom/unity3d/player/UnityPlayerActivity;
// 文件名:.source "MainActivity.java"
# static fields
//静态字段  finish 会赋值、其他则只声明

# instance fields
//实例字段

# direct methods
.method static constructor <clinit>()V
//静态构造函数<静态代码块><静态初始化>

.method public constructor <init>()V
//实例构造函数

//其他方法
# virtual methods
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,131评论 0 13
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,160评论 1 44
  • 一、阅读<<你的生命有什么可能>> 为自己而活,而不是因为他人评价而活 什么都不想,尽全力将眼前的事做好,做到极致...
    思远同学阅读 128评论 0 0
  • 感恩今天的经历,让我看见自己,看见自己的恐惧,看见自己的现状,同时谢谢我自己,看见之后没有陷入恐惧,担心,稍微...
    妮妮Gloria阅读 255评论 0 2
  • <好教练> 从事武道教育这一行久了,就会听到一些议论,说这个※不好,那个※不好,哈哈。 其实从教育的出发点来讲。 ...
    信教练阅读 307评论 0 0