smali switch语法
smali中onClick方法,其中包含的switch语句:
.method public onClick(Landroid/view/View;)V
.locals 1
.prologue
invoke-virtual {p1}, Landroid/view/View;->getId()I
move-result v0
packed-switch v0, :pswitch_data_0
:goto_0
:pswitch_0
return-void
:pswitch_9 // case 判读
... // 逻辑实现
goto :goto_0 // return出方法
:pswitch_8
...
goto :goto_0
nop
// switch case 定义
:pswitch_data_0
.packed-switch 0x7f0d0092
:pswitch_8
:pswitch_0
:pswitch_0
:pswitch_a
:pswitch_0
:pswitch_0
:pswitch_1
:pswitch_9
:pswitch_2
:pswitch_3
:pswitch_0
:pswitch_4
:pswitch_5
:pswitch_0
:pswitch_6
:pswitch_7
.end packed-switch
.end method
packed-switch 0x7f0d0092
:pswitch_8
表示case 的判断从id=0x7f0d0092 开始,对应的case为pswitch_8
return语句
onClick方法中 pswitch_0表示 方法return
id idNumber case 对应关系
view注册OnClickListener的代码就不贴了,
这是整理的id idNumber case 对应关系
id idNumber case
tv_cover_girl 0x7f0d0092 pswitch_8
linear_path_select 0x7f0d0095 pswitch_a
tv_watermark 0x7f0d0098 pswitch_1
tv_hints 0x7f0d0099 pswitch_9
tv_comment_us 0x7f0d009a pswitch_2
tv_follow_us 0x7f0d009b pswitch_3
tv_share 0x7f0d009d pswitch_4
tv_feedback 0x7f0d009e pswitch_5
tv_terms_of_use 0x7f0d00a0 pswitch_6
tv_privacy_policy 0x7f0d00a1 pswitch_7
对比idNumber 和 代码片段1中的switch case 定义 ,可以发现规律:
case是根据被注册view的id升序排列,当idNumber和上一个不连续时,和上一个差多少,会添加几行的:pswitch_0
。
将idNumber转换成十进制会比较好算差。
这样便能成功添加case控制语句。
但问题是如果差的多了会添加很多行:pswitch_0
,比如我的业务就添了167
行。
这个规则我找了大半天才找出来的,找出来后那种快感,真是***,分享出来,希望能帮大家填个小坑。
Smali语法可参考: