samli文件_史上超详细的smali文件解读

本文详细介绍了smali文件的构成,包括类名、父类、字段声明、方法声明、接口实现、注解应用以及内部类和监听器的表示方式。通过实例展示了如何将smali代码转换为Java代码,帮助读者理解Dalvik字节码的底层原理。
摘要由CSDN通过智能技术生成

smali文件的头3行

# 指定了当前类的类名,访问权限为public,类名开头的L是遵循Dalvik字节码的相关约定

.class public Lcom/example/administrator/myapplication/Demo;

# super指令指定了当前类的父类,父类为Object

.super Ljava/lang/Object;

//指定了当前类的源文件名。注意:经过混淆的dex文件,反编译出来的smali代码可能没有源文件信息,source可能为空。

.source "Demo.java"

字段的声明:

smali文件的字段的声明使用".field"指令,字段有静态字段和实例字段两种:

静态字段格式: .field 访问权限 static 修饰关键字  字段名  字段类型

.field public static HELLO:Ljava/lang/String;

上面smali代码转为java代码为:

public static String HELLO = "hello";

实例字段格式:.field 访问权限 修饰关键字 字段名  字段类型

.field private button:Landroid/widget/Button;

.field public number:I

上面的smali代码转为java代码为:

private Button button;

public  int number =5;

方法的声明

使用".method"指令,分为直接方法(用private修饰的)和虚方法(用public和protected修饰的),直接方法和虚方法的声明是一样的。在调用函数时,有invoke-direct,invoke-virtual,invoke-static、invoke-super以及invoke-interface等几种不同的指令。还有invoke-XXX/range 指令的,这是参数多于4个的时候调用的指令,比较少见:

.method private static getCount(II)V

.registers 2

.param p0, "x"

.param p1, "y"

.prologue

.line 28

return-void

.end method

第一行为方法的开始处,此处方法的修饰符是static,访问权限是private,方法名是getCount,有两个参数,都是int类型的(I代表int),V代表无返回值。

第二行指定寄存器的大小。

第三行和第四行为方法的参数,每有一个参数,就写一个参数,此处有两个参数。

第五行为 方法的主体部分(.prologue)

第六行指定了该处指令在源代码中的行号,这里是从java源码中底28行开始的

第七行return-void表示无返回值

第八行(.end method)方法结束

上面的smali转为java代码为:

private static void   getCount(int

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值