- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习 smali,但有一些问题无法通过谷歌搜索找到。
1)我创建了一个简单的测试用例来更好地解释自己
const-string v1, "Start"
:try_start_0
const-string v1, "Try Block"
invoke-static {v1}, Lcom/example/test/Main;->print(Ljava/lang/String;)V
:try_end_0
.catchall {:try_start_0 .. :try_end_0} :catchall_0
.catch 语句:两个参数是否意味着从该标签到该标签并捕获它(两个标签之间的代码),或者是否意味着从 :try_start_0 开始执行 try 直到到达 :try_end_0 (允许goto 跳转来执行不在两个标签内的代码)?
try 的标签是否始终采用 try_start_%d 格式,或者可以是任何标签?
2)另一种情况
packed-switch v0, :pswitch_data_0
const-string v1, "Default Case"
invoke-static {v1}, Lcom/example/test/Main;->print(Ljava/lang/String;)V
:goto_0
const-string v1, "The End"
invoke-static {v1}, Lcom/example/test/Main;->print(Ljava/lang/String;)V
return-void
:pswitch_0
const-string v1, "Case 1"
invoke-static {v1}, Lcom/example/test/Main;->print(Ljava/lang/String;)V
goto :goto_0
:pswitch_data_0
.packed-switch 0x1
:pswitch_0
.end packed-switch
switch 语句:是否要求 switch 语句位于 switch 数据和 switch 调用之间?标签的命名也是固定的还是只是为了方便?
3)如果标签可以不同,baksmali会生成具有不同标签的smali代码吗?
4)反编译 dex 时不总是显示的可选行有哪些?
我知道 .parameter 和 .line 是可选的,但是可能不存在的是什么?
提前谢谢您。
最佳答案
1)
前两个标签(示例中的 try_start_0 和 try_end_0)定义了 try block 涵盖的代码范围。如果所覆盖的代码中发生异常,则执行立即跳转到第三个标签(catchall_0)。标签的名称并不重要,它可以是任何有效的标识符。
还有.catch指令,与它是一样的,只不过它只处理特定类型的异常(类似于java的catch语句)。
一段代码可以被多个catch语句覆盖,最多1个catch all语句。 .catch 语句的位置并不重要,但是,覆盖相同代码的 catch 语句的相对顺序很重要。例如,如果您有
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :handler1
.catch Ljava/lang/RuntimeException; {:try_start_0 .. :try_end_0} :handler2
第二个 catch 语句永远不会被使用。如果在所覆盖的代码中抛出 RuntimeException,则始终会使用第一个 catch,因为 RuntimeException 是一个异常。
但是,如果它们的顺序相反,它将像您期望的那样工作 - RuntimeException 处理程序用于 RuntimeException,而 Exception 处理程序用于任何其他类型的异常。
最后,与 java 不同,.catch 语句中的代码范围不需要严格嵌套。例如,拥有类似的东西是完全合法的
:a
const-string v1, "Start"
:b
const-string v1, "Try Block"
:c
invoke-static {v1}, Lcom/example/test/Main;->print(Ljava/lang/String;)V
:d
.catch Ljava/lang/RuntimeException; {:a .. :c} :d
.catch Ljava/lang/Exception; {:b .. :d} :d
你还可以有一些非常奇怪的结构,就像这样。
.method public static main([Ljava/lang/String;)V
.registers 3
:second_handler
:first_try_start
new-instance v0, Ljava/lang/RuntimeException;
invoke-direct {v0}, Ljava/lang/RuntimeException;-><init>()V
throw v0
:first_try_end
.catch Ljava/lang/Exception; {:first_try_start .. :first_try_end} :first_handler
:first_handler
:second_try_start
new-instance v0, Ljava/lang/RuntimeException;
invoke-direct {v0}, Ljava/lang/RuntimeException;-><init>()V
throw v0
:second_try_end
.catch Ljava/lang/Exception; {:second_try_start .. :second_try_end} :second_handler
.end method
上述两个示例都不会从编译的 java 代码生成,但字节码本身允许这样做。
2) switch 语句可以位于与 switch 语句或 switch 数据相关的任何位置。这里的标签名称也是任意的。
3) Baksmali 可以通过两种方式之一生成标签。默认方式是使用标签的通用“类型”,并附加标签的字节码地址。如果指定 -s/--sequential-labels 选项,则它不使用字节码地址,而是为每个标签类型保留一个计数器,并在每次生成该类型的标签时递增该计数器。
4)通常是调试信息的一部分。 .parameter、.line、.prologue、.epilogue、.source、.local、.restart local、.end local...我认为大约涵盖了它。
关于dalvik - DalvikVM如何处理switch并尝试smali代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14100992/
使用 this link我能够使用正则表达式 (?!dalvikvm\b)\b\w+ 创建一个过滤器来过滤带有标签 dalvikvm 的消息,但我尝试了几种变体的正则表达式,例如 (?!dalvikv
出于某种原因,这个类做了太多工作并且滞后,这是我的应用程序上下文中的一个主要问题。当用户单击 map 上的某个位置时,它应该会快速获取该位置的地址,但不幸的是我暂停了 logCat dalvikvm,
我如何从带有输入的 .jar 文件开始使用 dalvikvm。类似的东西: dalvikvm -cp /path to jar/test.jar "hello" test.jar 的主要方法就是将这个
我有一种情况,我的 Android 应用程序无法及时执行软实时任务,因为调用垃圾收集器需要几毫秒。给予 GC 的几毫秒时间不足以错过一些重要的截止日期,这些小任务需要从 IO 设备读取数据。 本来想引
我正在努力寻找内存泄漏。我想第一步是通过查看 dalvikvm 看看我是否有一个,但我并不真正了解它是好是坏。这是我的 dalvikvm 日志的快照: 有人能简单说一下上面看到的内容吗?什么是危险信号
我在任何地方都找不到它们的记录。那么这个 Logcat 错误消息中的值是什么意思: 06-28 14:59:53.172: E/dalvikvm(32679): 32679(...) stat: (e
当我在手机上启动我的应用程序时,我从日志中收到了很多以下错误: E/dalvikvm( 2052): No free temp registers E/dalvikvm( 2052): Jit: ab
我正在尝试了解 Android 如何启动应用程序。问题是 Zygote 如何(以及为什么) fork 一个新的 Dalvik VM?我不明白为什么不能在同一个 Dalvik VM 中运行多个应用程序。
序言 我正在尝试使用 dex 文件的 Smali/Baksmali 汇编器/反汇编器来了解 DalvikVM 指令。 问题 来自这个java文件 package gd; class Hello {
所以我一直在研究如何使用 dalvikvm 在 Android 设备上运行 java 代码。我可以使用命令 dalvikvm -cp RunTest.dex RunTest 成功运行编译为 .dex
我正在尝试在终端中使用 dalvikvm 启动已安装的应用程序。如果我尝试这样做是行不通的: dalvikvm -cp /system/app/Calculator.apk com.android.c
我正在尝试来自 https://android.googlesource.com/platform/dalvik/+/gingerbread/docs/hello-world.html 的 Hello
当我触摸操作栏按钮时,我的 Android 应用程序出现锁定。我什至没有收到 ANR 对话。 我看到的唯一 LogCat 错误是: 02-01 14:59:15.328 30107-30170/com
我想知道 Handlers 在 Android/DalvikVM 中是如何处理的。我正在为 Android 编写一个应用程序,在一个类中我有一个 Handler 方法可以从另一个类接收消息。 Hand
这个问题是我的 earlier question 的后续问题. 这是来自该问题的相同示例。 import android.os.SystemClock; /** * Command that sen
我有一个非常简单的命令行 Java 应用程序,我希望将其移植到 Android 平台。该应用程序所做的是访问 Internet 上的网页并通过 System.out.println 打印一些输出。 来
我需要在 Android 上运行 java 应用程序的命令行版本(是的,我知道这并不简单)。 我尝试使用 Dalvikvm 启动它,它实际上启动了,但后来我的代码失败了,因为它开始使用 android
一般来说,Android 在 Dalvik Vm 中将每个应用程序作为一个单独的进程运行。我从 Doc 得到这个.但我不明白去Android的Dalvik VM的主要原因是什么。它比Java VM有什
我已经释放了每个对象,回收了 onDestroy() 方法中的所有位图: private void unbindDrawables(View view) { if (view.get
我需要在 Android 上运行 java 应用程序的命令行版本(是的,我知道这并不简单)。 我正在尝试使用 Dalvikvm 启动它,它确实启动了,但稍后我的代码失败了,因为它开始使用 androi
我是一名优秀的程序员,十分优秀!