smali switch

 

 1     @Override
 2     public void onClick(View v) {
 3         switch (v.getId()) {
 4             case R.id.stop:  //0x7f05003d
 5                 Log.d(TAG, "xxstop");
 6                 break;
 7             case R.id.start:   //0x7f05003c
 8                 String msg = "begin to start";
 9                 toToast(msg);
10                 break;
11             case R.id.cancel:  //0x7f05003e
12                 Log.d(TAG, "cancel");
13                 break;
14             default:
15                 break;
16         }
17     }

在switch中,将case语句的选项编译成连续的id,并且每个case以一个lable来标识。

//R$id.smali
# static fields
.field public static final cancel:I = 0x7f05003e
.field public static final start:I = 0x7f05003c
.field public static final stop:I = 0x7f05003d

 

# virtual methods
.method public onClick(Landroid/view/View;)V
    .locals 3
    .param p1, "v"    # Landroid/view/View;

    .prologue
    .line 55
    invoke-virtual {p1}, Landroid/view/View;->getId()I

    move-result v1

    packed-switch v1, :pswitch_data_0

    .line 69
    :goto_0
    return-void

    .line 57
    :pswitch_0
    const-string v1, "MY_TAG"

    const-string v2, "xxstop"

    invoke-static {v1, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    goto :goto_0   #跳到switch语句结束的地方

    .line 60
    :pswitch_1
    const-string v0, "begin to start"

    .line 61
    .local v0, "msg":Ljava/lang/String;
    invoke-virtual {p0, v0}, Lcom/example/wang/MainActivity;->toToast(Ljava/lang/String;)V

    goto :goto_0

    .line 64
    .end local v0    # "msg":Ljava/lang/String;
    :pswitch_2
    const-string v1, "MY_TAG"

    const-string v2, "cancel"

    invoke-static {v1, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    goto :goto_0

    .line 55
    :pswitch_data_0
    .packed-switch    #0x7f05003c
        :pswitch_1    #0x7f05003c  start
        :pswitch_0    #0x7f05003d  stop
        :pswitch_2    #0x7f05003e  cancel
    .end packed-switch
.end method

 

-------------------------------------------------------------------------------

 37     public void doSomething() {
 38         try {
 39             Thread.sleep(1000);
 40         } catch(Exception e) {
 41             e.printStackTrace();
 42         }
 43     }

 

# virtual methods
.method public doSomething()V
    .registers 3

    .prologue
    .line 39
    const-wide/16 v0, 0x3e8  #0x3e8 = 1000

    :try_start_2
    invoke-static {v0, v1}, Ljava/lang/Thread;->sleep(J)V
    :try_end_5
    .catch Ljava/lang/Exception; {:try_start_2 .. :try_end_5} :catch_6  #如果有异常则跳到catch_6

    .line 43
    :goto_5
    return-void

    .line 40
    :catch_6
    move-exception v0

    .line 41
    invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V

    goto :goto_5
.end method

 

posted @ 2015-11-15 15:14  牧 天  阅读(958)  评论(0)    收藏  举报