我正在尝试学习 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_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 是可选的,但哪些可能不存在?
先感谢您。