打包交换机如何在Android上作为smalto由apktool生成?

我正在尝试使用apktool d对apk进行反向工程,并且它生成的smali包含我不完全理解的packed-switch语句.一种方法包含:

packed-switch v0,:pswitch_data_0

随后在代码中使用以下标签:pswitch_X
其中X是一个数字,在方法的最后:

:pswitch_data_0
.packed-switch 0x7f060395
    :pswitch_4
    :pswitch_5
    :pswitch_1
.end packed-switch

这到底是做什么的?它看起来像要跳转到的地方列表,但在什么条件下?它与0x7f060395有什么关系?

解决方法

正如您所注意到的,开关分为两部分.您列出的第二部分是有效负载伪指令,其中包含所有切换案例.第一部分是打包切换指令,它定义包含要检查的值的寄存器,并使用标签引用有效负载指令.

对于打包交换机,有效负载伪指令中的大小写值是顺序的,只有第一个值实际给出(在本例中为0x7f060395)

具体而言,对于您的示例,当执行packed-switch指令时,它将检查v0寄存器的值与有效负载中的3种情况.如果值为0x7f060395,则跳转到:pswitch_4,如果为0x7f060396,则跳转到:pswitch_5等.

如果寄存器的值与任何情况都不匹配,则执行将继续执行打包切换指令之后的下一条指令(具有寄存器和标签的指令,而不是有效负载伪指令).

稀疏切换指令类似,只是其有效负载指令具有与每种情况相关联的显式值,而不是使用顺序键值.

您可以在dalvik-bytecode文档中找到所有细节.

相关文章

以下为个人理解,如错请评 CE: 凭据加密 (CE) 存储空间, 实际路径/data/user_ce/ DE: 设备加密 (DE) 存...
转载来源:https://blog.csdn.net/yfbdxz/article/details/114702144 用EventLog.writeEvent打的日志(或...
事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION...
又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。 最近进...
Android性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向...
android的开源库是用来在android上显示gif图片的。我在网上查了一下,大家说这个框架写的不错,加载大的...