安卓中常见的字节码指令介绍

news2025/2/24 14:38:00

问题背景

安卓开发过程中,经常要通过看一些java代码对应的字节码,来了解java代码编译后的运行机制,本文将通过一个简单的demo介绍一些基本的字节码指令。

问题分析

比如以下代码:

public class test {
    public static void main(String[] args) {
        int a = 100;
        int b = 100;
        int c = 100;
        a += b + c;
        System.out.println(a);
    }
}

运行结果如下:
运行结果

a += b + c <==> a += (b + c),查看对应的字节码文件如下:

// class version 52.0 (52)
// access flags 0x21
public class test {

  // compiled from: test.java

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 1 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Ltest; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 3 L0
    BIPUSH 100
    ISTORE 1 // 将100存储到局部变量
   L1
    LINENUMBER 4 L1
    BIPUSH 100
    ISTORE 2 // 将100存储到局部变量
   L2
    LINENUMBER 5 L2
    BIPUSH 100
    ISTORE 3 // 将100存储到局部变量
   L3
    LINENUMBER 6 L3
    ILOAD 1 // 从局部变量表中加载 int 类型到操作数栈
    ILOAD 2 // 从局部变量表中加载 int 类型到操作数栈
    ILOAD 3 // 从局部变量表中加载 int 类型到操作数栈
    IADD // 将栈顶两个 int 类型数值相加
    IADD // 将栈顶两个 int 类型数值相加
    ISTORE 1 // 将 int 类型存储到局部变量中,这里就是把结果存储到第一个变量
   L4
    LINENUMBER 7 L4
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ILOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println (I)V
   L5
    LINENUMBER 8 L5
    RETURN
   L6
    LOCALVARIABLE args [Ljava/lang/String; L0 L6 0
    LOCALVARIABLE a I L1 L6 1
    LOCALVARIABLE b I L2 L6 2
    LOCALVARIABLE c I L3 L6 3
    MAXSTACK = 3
    MAXLOCALS = 4
}

问题总结

通过查看java代码对应的字节码,可以比较清楚的看到java代码编译后的执行流程。在安卓开发中,了解字节码知识还是非常有必要的,在关键时刻,我们查看字节码,能够很好的解答一些疑惑,下面是常见的一些字节码指令:

1. 加载和存储指令:

aload:从局部变量表中加载引用类型到操作数栈。

astore:将引用类型存储到局部变量表中。

iload:从局部变量表中加载 int 类型到操作数栈。

istore:将 int 类型存储到局部变量表中。

fload:从局部变量表中加载 float 类型到操作数栈。

fstore:将 float 类型存储到局部变量表中。



2. 算术和逻辑指令:

iadd:将栈顶两个 int 类型数值相加。

isub:将栈顶两个 int 类型数值相减。

imul:将栈顶两个 int 类型数值相乘。

idiv:将栈顶两个 int 类型数值相除。

iand:将栈顶两个 int 类型数值进行按位与操作。

ior:将栈顶两个 int 类型数值进行按位或操作。



3. 类型转换指令:

i2l:将 int 类型转换为 long 类型。

l2i:将 long 类型转换为 int 类型。

f2d:将 float 类型转换为 double 类型。

d2i:将 double 类型转换为 int 类型。



4. 控制流指令:

if_icmpeq:如果两个 int 类型数值相等,则跳转到指定位置。

goto:无条件跳转到指定位置。

tableswitch:根据索引值跳转到不同位置的指令。



5. 方法调用和返回指令:

invokevirtual:调用实例方法。

invokestatic:调用静态方法。

invokeinterface:调用接口方法。

ireturn:从方法中返回 int 类型值。

invokedynamic: 运行时动态解析并绑定方法调用

持续更新,有兴趣的小伙伴可以进一步深入研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/863335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

I 2C 接口控制器理论讲解

IIC系列文章&#xff1a; (1) I 2C 接口控制器理论讲解 (2) I2C接口控制设计与实现 文章目录 一、 IIC协议二、IIC协议解析1.特点2.规定3.器件地址4.存储地址 三、IIC写时序1.单字节写时序2.连续写时序&#xff08;页写时序&#xff09; 四、IIC读时序1.单字节读时序2.连续读时…

Unity3D高级编程:主程手记学习1

第一章 软件架构 Untiy 分层设计 分层后再分治

C++复习笔记——primer第五版

文章目录 一、引用和指针1.引用2.指针2.1利用指针访问对象2.2指针的值或指针所指对象的值的改变 3.赋值和指针4.指向指针的引用 二、String1.初始化String对象的方式2. string对象上的操作3.使用getline读取一整行4.字面值和字符串相加5.使用for循环改变字符串中的字符 三、Vec…

【Linux】HTTP协议——应用层

目录 HTTP协议 HTTP简介 认识URL 一、协议方案名 二、登录信息 三、服务器地址 四、服务器端口号 五、带层次的文件路径 六、查询字符串 七、片段标识符 urlencode和urldecode HTTP协议格式 HTTP请求协议格式 HTTP响应协议格式 HTTP的方法 HTTP的状态码 HTTP常见…

UX与UI设计的区别是什么?看这一篇就够了!

在产品开发和用户体验设计领域&#xff0c;UX&#xff08;用户体验&#xff09;与UI&#xff08;用户界面&#xff09;设计是两个常被提及的概念&#xff0c;其本质都是在解决产品的用户问题&#xff0c;但在实际的工作场景中&#xff0c;它们代表着不同的设计方向与职责。 简…

【MFC】05.MFC六大机制:程序启动机制-笔记

MFC程序开发所谓是非常简单&#xff0c;但是对于我们逆向人员来说&#xff0c;如果想要逆向MFC程序&#xff0c;那么我们就必须了解它背后的机制&#xff0c;这样我们才能够清晰地逆向出MFC程序&#xff0c;今天这篇文章就来带领大家了解MFC的第一大机制&#xff1a;程序启动机…

YOLOv5 、YOLOv8改进 :SimAM:无参数的注意力机制

在本文中&#xff0c;我们提出了一个用于卷积神经网络的概念简单但非常有效的注意模块。与现有的通道关注模块和空间关注模块相比&#xff0c;我们的模块无需向原始网络添加参数&#xff0c;而是在一层中推断特征图的3-D关注权重。具体来说&#xff0c;我们基于一些著名的神经科…

YOLOv5改进系列(20)——添加BiFormer注意力机制(CVPR2023|小目标涨点神器)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2)——添加CBAM注意力机制

途乐证券-美股突然跳水400点,美联储释放重磅信号

一份重磅数据来袭。 北京时间8月10日晚间&#xff0c;美国劳工部发布的7月CPI通胀数据显现&#xff0c;美国7月CPI同比涨幅从6月的3%加速至3.2%&#xff0c;为2022年6月以来首次加速上升&#xff0c;但低于预期的3.3%。美国总统拜登榜首时间表明&#xff0c;美国在通胀方面取得…

从零开始搭建个人博客网站(hexo框架)

1.工具及环境搭建 1&#xff09;注册GitHub并且新建一个repositories 2&#xff09;下载node.js以及Git 下载链接&#xff1a; 检验安装是否成功&#xff1a; 【注】&#xff1a;MacOS自带Git&#xff0c;可以直接在终端输入git --version进行检验 3&#xff09;新建一个…

Debian/Ubuntu清理硬盘空间

Debian/Ubuntu清理硬盘空间_debian清理磁盘空间_weixin_43606319的博客-CSDN博客 1. 删除残余的配置文件 通常Debian/Ubuntu删除软件包可以用两条命令 sudo apt-get remove <package-name> sudo apt-get purge <package-name> remove将会删除软件包&#xff0…

Linux Day08

内存申请与释放 前面的内存为实际内存&#xff0c;后面的交换空间为虚拟内存 当申请空间小于等于内存时&#xff0c;先使用内存。 当申请空间d大于内存时&#xff0c;使用内存虚拟内存 1、判断依据 申请1个G的空间 #include<stdio.h> #include<stdlib.h> #inc…

【redis 3.2 集群】

目录 一、Redis主从复制 1.概念 2.作用 2.1 数据冗余 2.2 故障恢复 2.3 负载均衡 2.4 高可用 3.缺点 4.流程 4.1 第一步 4.2 第二步 4.3 第三步 4.4 第四步 5.搭建 5.1 主 5.2 从 6.验证 二、Reids哨兵模式 1.概念 2.作用 2.1 监控 2.2 自动故障转移 2.…

Unreal DataTable使用

目的&#xff1a;在多个地方使用同一份结构体配置 C定义结构体 USTRUCT(BlueprintType) struct FXXX : public FTableRowBase {GENERATED_BODY()UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "XXX")float XXX; }注意&#xff1a; 类的元数据加上 Bluep…

如何在docker部署一个python项目

导语&#xff1a; 我之前已经实现了在服务器上直接部署一个文件&#xff0c;但是那种部署方式有个明显的缺陷&#xff1a;我如果需要在其他机器部署该项目时&#xff0c;需要重新配置项目所依赖的环境。因此我们需要一种只需要配置一次环境依赖&#xff0c;就可以在其他机器上随…

KubeSphere 部署 Zookeeper 实战教程

前言 知识点 定级&#xff1a;入门级如何利用 AI 助手辅助运维工作单节点 Zookeeper 安装部署集群模式 Zookeeper 安装部署开源应用选型思想 实战服务器配置(架构 1:1 复刻小规模生产环境&#xff0c;配置略有不同) 主机名IPCPU内存系统盘数据盘用途ks-master-0192.168.9.9…

【类和对象】收尾总结

目录 一、初始化列表 1.格式要求 (1) 初始化列表初始化 ①括号中是初始值 ②括号中是表达式 (2) 初始化列表和函数体混用 2.特点 ①初始化时先走初始化列表&#xff0c;再走函数体 ②拷贝构造函数属于特殊的构造函数&#xff0c;函数内也可以使用初始化列表进行初始化 …

YOLOv5-7.0实例分割+TensorRT部署

一&#xff1a;介绍 将YOLOv5结合分割任务并进行TensorRT部署&#xff0c;是一项既具有挑战性又令人兴奋的任务。分割&#xff08;Segmentation&#xff09;任务要求模型不仅能够检测出目标的存在&#xff0c;还要精确地理解目标的边界和轮廓&#xff0c;为每个像素分配相应的…

使用Git进行项目版本控制

1、什么是Git&#xff1f; GIT&#xff0c;全称是分布式版本控制系统&#xff0c;git通常在编程中会用到&#xff0c;并且git支持分布式部署&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地&#xff0c…

SOLIDWORKS参数化设计表方法

客户痛点&#xff1a;随着人力资源价格的增长&#xff0c;设计人员不足&#xff0c;需要3D建模的数量多&#xff0c;为方便后续的CAM程序。 数据问题&#xff1a;之前是使用二维图纸&#xff0c;标准件/非标准件产品简单&#xff0c;都是单件&#xff0c;图纸发放以二维方式&a…