Java代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
sum(5);
compile(10, 20);
}
public Integer sum(int times){
Integer sum = 5;
for (int i = 0; i < times; i++){
sum += i;
}
return sum;
}
public boolean complete(Integer a, Integer b){
if (a >= b){
return true;
} else {
return false;
}
}
Smali代码
调用部分
.method protected onCreate(Bundle)V
.registers 6
.param p1, "savedInstanceState"
.prologue
00000000 invoke-super AppCompatActivity->onCreate(Bundle)V, p0, p1
00000006 const v2, 0x7F04001B # R.layout.activity_my
0000000C invoke-virtual MyActivity->setContentView(I)V, p0, v2
00000012 const v2, 0x7F0C006D # R.id.toolbar
00000018 invoke-virtual MyActivity->findViewById(I)View, p0, v2
0000001E move-result-object v1
00000020 check-cast v1, Toolbar
.local v1, "toolbar":Landroid/support/v7/widget/Toolbar;
00000024 invoke-virtual MyActivity->setSupportActionBar(Toolbar)V, p0, v1
0000002A const v2, 0x7F0C006E # R.id.fab
00000030 invoke-virtual MyActivity->findViewById(I)View, p0, v2
00000036 move-result-object v0
00000038 check-cast v0, FloatingActionButton
.local v0, "fab":Landroid/support/design/widget/FloatingActionButton;
0000003C new-instance v2, MyActivity$1
00000040 invoke-direct MyActivity$1-><init>(MyActivity)V, v2, p0
00000046 invoke-virtual FloatingActionButton->setOnClickListener(View$OnClickListener)V, v0, v2
0000004C const/4 v2, 5
0000004E invoke-virtual MyActivity->sum(I)Integer, p0, v2 # p0是this指针,v2是sum的参数
00000054 const/16 v2, 0x000A # 在上个函数使用完后v2已经无用,被重新赋值
00000058 invoke-static Integer->valueOf(I)Integer, v2 # 原java代码里使用的Integer对象,这里使用valueof方法转换成int型
0000005E move-result-object v2
00000060 const/16 v3, 0x0014
00000064 invoke-static Integer->valueOf(I)Integer, v3
0000006A move-result-object v3
0000006C invoke-virtual MyActivity->complete(Integer, Integer)Z, p0, v2, v3 # 返回值boolean类型,p0是this指针,v2、v3是参数,调用complete方法
00000072 return-void
.end method
for循环
.method public sum(I)Integer
.registers 5
.param p1, "times"
.prologue
00000000 const/4 v2, 5 # 局部变量初始化赋值为5
00000002 invoke-static Integer->valueOf(I)Integer, v2
00000008 move-result-object v1 # 返回值sum
.local v1, "sum":Ljava/lang/Integer;
0000000A const/4 v0, 0 # for循环中的i的初始化赋值为0
:C
.local v0, "i":I
0000000C if-ge v0, p1, :28 # 比较v0是否大于p1,如果大于则跳到标签28处
:10
00000010 invoke-virtual Integer->intValue()I, v1
00000016 move-result v2
00000018 add-int/2addr v2, v0 # sum = sum + i
0000001A invoke-static Integer->valueOf(I)Integer, v2
00000020 move-result-object v1
00000022 add-int/lit8 v0, v0, 0x01 # i++
00000026 goto :C # 跳回标签C处
:28
00000028 return-object v1 # 返回结果
.end method
if判断
.method public complete(Integer, Integer)Z
.registers 5
.param p1, "a"
.param p2, "b"
.prologue
00000000 invoke-virtual Integer->intValue()I, p1
00000006 move-result v0
00000008 invoke-virtual Integer->intValue()I, p2
0000000E move-result v1
00000010 if-lt v0, v1, :18 # 如果v0小于v1则跳转到标签18处
:14
00000014 const/4 v0, 1 # 为返回值赋值为“真”
:16
00000016 return v0 # 返回结果
:18
00000018 const/4 v0, 0 # 为返回值赋值为“假”
0000001A goto :16 # 此处的意思是,上面的上下文会给返回值赋值,执行完成之后,跳到标签16处返回
.end method
switch语句1(有序型)
java代码
public void switchTest1(Integer caseE) {
switch (caseE) {
case 1:
System.out.println("This is " + caseE);
break;
case 2:
System.out.println("This is " + caseE);
break;
case 3:
System.out.println("This is " + caseE);
break;
case 4:
System.out.println("This is " + caseE);
break;
default:
System.out.println("This is default");
break;
}
}
smali代码
.method public switchTest1(Integer)V
.registers 5
.param p1, "caseE"
.prologue
00000000 invoke-virtual Integer->intValue()I, p1
00000006 move-result v0
00000008 packed-switch v0, :E8
:E
0000000E sget-object v0, System->out:PrintStream
00000012 const-string v1, "This is default"
00000016 invoke-virtual PrintStream->println(String)V, v0, v1
:1C
0000001C return-void
:1E
0000001E sget-object v0, System->out:PrintStream
00000022 new-instance v1, StringBuilder
00000026 invoke-direct StringBuilder-><init>()V, v1
0000002C const-string v2, "This is "
00000030 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
00000036 move-result-object v1
00000038 invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1
0000003E move-result-object v1
00000040 invoke-virtual StringBuilder->toString()String, v1
00000046 move-result-object v1
00000048 invoke-virtual PrintStream->println(String)V, v0, v1
0000004E goto :1C
:50
00000050 sget-object v0, System->out:PrintStream
00000054 new-instance v1, StringBuilder
00000058 invoke-direct StringBuilder-><init>()V, v1
0000005E const-string v2, "This is "
00000062 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
00000068 move-result-object v1
0000006A invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1
00000070 move-result-object v1
00000072 invoke-virtual StringBuilder->toString()String, v1
00000078 move-result-object v1
0000007A invoke-virtual PrintStream->println(String)V, v0, v1
00000080 goto :1C
:82
00000082 sget-object v0, System->out:PrintStream
00000086 new-instance v1, StringBuilder
0000008A invoke-direct StringBuilder-><init>()V, v1
00000090 const-string v2, "This is "
00000094 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
0000009A move-result-object v1
0000009C invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1
000000A2 move-result-object v1
000000A4 invoke-virtual StringBuilder->toString()String, v1
000000AA move-result-object v1
000000AC invoke-virtual PrintStream->println(String)V, v0, v1
000000B2 goto :1C
:B4
000000B4 sget-object v0, System->out:PrintStream
000000B8 new-instance v1, StringBuilder
000000BC invoke-direct StringBuilder-><init>()V, v1
000000C2 const-string v2, "This is "
000000C6 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
000000CC move-result-object v1
000000CE invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1
000000D4 move-result-object v1
000000D6 invoke-virtual StringBuilder->toString()String, v1
000000DC move-result-object v1
000000DE invoke-virtual PrintStream->println(String)V, v0, v1
000000E4 goto :1C
:E8
000000E8 .packed-switch 0x1
:1E
:50
:82
:B4
.end packed-switch
.end method
switch语句2(无序型1)
java代码
public void switchTest2(Integer caseE) {
switch (caseE) {
case 10:
System.out.println("This is " + caseE);
break;
case 5:
System.out.println("This is " + caseE);
break;
case 26:
System.out.println("This is " + caseE);
break;
case 58:
System.out.println("This is " + caseE);
break;
default:
System.out.println("This is default");
break;
}
}
smali代码
.method public switchTest2(Integer)V
.registers 5
.param p1, "caseE"
.prologue
00000000 invoke-virtual Integer->intValue()I, p1
00000006 move-result v0
00000008 sparse-switch v0, :E8
:E
0000000E sget-object v0, System->out:PrintStream
00000012 const-string v1, "This is default"
00000016 invoke-virtual PrintStream->println(String)V, v0, v1
:1C
0000001C return-void
:1E
0000001E sget-object v0, System->out:PrintStream
00000022 new-instance v1, StringBuilder
00000026 invoke-direct StringBuilder-><init>()V, v1
0000002C const-string v2, "This is "
00000030 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
00000036 move-result-object v1
00000038 invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1
0000003E move-result-object v1
00000040 invoke-virtual StringBuilder->toString()String, v1
00000046 move-result-object v1
00000048 invoke-virtual PrintStream->println(String)V, v0, v1
0000004E goto :1C
:50
00000050 sget-object v0, System->out:PrintStream
00000054 new-instance v1, StringBuilder
00000058 invoke-direct StringBuilder-><init>()V, v1
0000005E const-string v2, "This is "
00000062 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
00000068 move-result-object v1
0000006A invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1
00000070 move-result-object v1
00000072 invoke-virtual StringBuilder->toString()String, v1
00000078 move-result-object v1
0000007A invoke-virtual PrintStream->println(String)V, v0, v1
00000080 goto :1C
:82
00000082 sget-object v0, System->out:PrintStream
00000086 new-instance v1, StringBuilder
0000008A invoke-direct StringBuilder-><init>()V, v1
00000090 const-string v2, "This is "
00000094 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
0000009A move-result-object v1
0000009C invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1
000000A2 move-result-object v1
000000A4 invoke-virtual StringBuilder->toString()String, v1
000000AA move-result-object v1
000000AC invoke-virtual PrintStream->println(String)V, v0, v1
000000B2 goto :1C
:B4
000000B4 sget-object v0, System->out:PrintStream
000000B8 new-instance v1, StringBuilder
000000BC invoke-direct StringBuilder-><init>()V, v1
000000C2 const-string v2, "This is "
000000C6 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
000000CC move-result-object v1
000000CE invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1
000000D4 move-result-object v1
000000D6 invoke-virtual StringBuilder->toString()String, v1
000000DC move-result-object v1
000000DE invoke-virtual PrintStream->println(String)V, v0, v1
000000E4 goto :1C
:E8
000000E8 .sparse-switch
0x5 -> :50
0xA -> :1E
0x1A -> :82
0x3A -> :B4
.end sparse-switch
.end method
switch语句2(无序型2)
java代码
public void switchTest3(String caseE) {
switch (caseE) {
case "FILE":
System.out.println("This is " + caseE);
break;
case "CMD":
System.out.println("This is " + caseE);
break;
case "INTERNET":
System.out.println("This is " + caseE);
break;
case "PROCESS":
System.out.println("This is " + caseE);
break;
default:
System.out.println("This is default");
break;
}
}
smali代码
.method public switchTest3(String)V
.registers 5
.param p1, "caseE"
.prologue
00000000 const/4 v0, -1
00000002 invoke-virtual String->hashCode()I, p1
00000008 move-result v1
0000000A sparse-switch v1, :140
:10
00000010 packed-switch v0, :164
:16
00000016 sget-object v0, System->out:PrintStream
0000001A const-string v1, "This is default"
0000001E invoke-virtual PrintStream->println(String)V, v0, v1
:24
00000024 return-void
:26
00000026 const-string v1, "FILE"
0000002A invoke-virtual String->equals(Object)Z, p1, v1
00000030 move-result v1
00000032 if-eqz v1, :10
:36
00000036 const/4 v0, 0
00000038 goto :10
:3A
0000003A const-string v1, "CMD"
0000003E invoke-virtual String->equals(Object)Z, p1, v1
00000044 move-result v1
00000046 if-eqz v1, :10
:4A
0000004A const/4 v0, 1
0000004C goto :10
:4E
0000004E const-string v1, "INTERNET"
00000052 invoke-virtual String->equals(Object)Z, p1, v1
00000058 move-result v1
0000005A if-eqz v1, :10
:5E
0000005E const/4 v0, 2
00000060 goto :10
:62
00000062 const-string v1, "PROCESS"
00000066 invoke-virtual String->equals(Object)Z, p1, v1
0000006C move-result v1
0000006E if-eqz v1, :10
:72
00000072 const/4 v0, 3
00000074 goto :10
:76
00000076 sget-object v0, System->out:PrintStream
0000007A new-instance v1, StringBuilder
0000007E invoke-direct StringBuilder-><init>()V, v1
00000084 const-string v2, "This is "
00000088 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
0000008E move-result-object v1
00000090 invoke-virtual StringBuilder->append(String)StringBuilder, v1, p1
00000096 move-result-object v1
00000098 invoke-virtual StringBuilder->toString()String, v1
0000009E move-result-object v1
000000A0 invoke-virtual PrintStream->println(String)V, v0, v1
000000A6 goto :24
:A8
000000A8 sget-object v0, System->out:PrintStream
000000AC new-instance v1, StringBuilder
000000B0 invoke-direct StringBuilder-><init>()V, v1
000000B6 const-string v2, "This is "
000000BA invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
000000C0 move-result-object v1
000000C2 invoke-virtual StringBuilder->append(String)StringBuilder, v1, p1
000000C8 move-result-object v1
000000CA invoke-virtual StringBuilder->toString()String, v1
000000D0 move-result-object v1
000000D2 invoke-virtual PrintStream->println(String)V, v0, v1
000000D8 goto :24
:DA
000000DA sget-object v0, System->out:PrintStream
000000DE new-instance v1, StringBuilder
000000E2 invoke-direct StringBuilder-><init>()V, v1
000000E8 const-string v2, "This is "
000000EC invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
000000F2 move-result-object v1
000000F4 invoke-virtual StringBuilder->append(String)StringBuilder, v1, p1
000000FA move-result-object v1
000000FC invoke-virtual StringBuilder->toString()String, v1
00000102 move-result-object v1
00000104 invoke-virtual PrintStream->println(String)V, v0, v1
0000010A goto :24
:10C
0000010C sget-object v0, System->out:PrintStream
00000110 new-instance v1, StringBuilder
00000114 invoke-direct StringBuilder-><init>()V, v1
0000011A const-string v2, "This is "
0000011E invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2
00000124 move-result-object v1
00000126 invoke-virtual StringBuilder->append(String)StringBuilder, v1, p1
0000012C move-result-object v1
0000012E invoke-virtual StringBuilder->toString()String, v1
00000134 move-result-object v1
00000136 invoke-virtual PrintStream->println(String)V, v0, v1
0000013C goto/16 :24
:140
00000140 .sparse-switch
0x1051A -> :3A
0x20ED7C -> :26
0x1858AA4F -> :62
0x50A5B741 -> :4E
.end sparse-switch
:164
00000164 .packed-switch 0x0
:76
:A8
:DA
:10C
.end packed-switch
.end method