smali example

 

 1 package com.example.wang;
 2 
 3 import android.app.Activity;
 4 import android.app.AlertDialog;
 5 import android.content.Context;
 6 import android.os.Bundle;
 7 import android.util.Log;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11 import android.widget.Toast;
12 
13 public class MainActivity extends Activity implements OnClickListener {
14     public static final String TAG = "MY_TAG";
15 
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20 
21         Button startBtn = (Button) findViewById(R.id.start);
22         startBtn.setOnClickListener(this);
23     }
24 
25     public void toToast(String msg) {
26         Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
27     }
28 
29     private static int add(int a, int b) {
30         int sum;
31         sum = a + b;
32         return sum;
33     }
34 
35     public class Student {
36         private String name;
37         private int age;
38 
39         public Student() {
40 
41         }
42 
43         public Student(String name, int age) {
44             this.name = name;
45             this.age = age;
46         }
47 
48         public void printf() {
49             Log.d(TAG, "name:" + name + ", age:" + age);
50         }
51     }
52 
53     @Override
54     public void onClick(View v) {
55         switch (v.getId()) {
56             case R.id.start:
57                 String msg = "begin to start";
58                 toToast(msg);
59                 break;
60             default:
61                 break;
62         }
63     }
64 
65     public class MyPhone {
66         public MyPhone() {
67         }
68 
69         private void showDialog(Context context) {
70             String title = "my title";
71             String message = "show my dialog";
72             AlertDialog.Builder dialog = new AlertDialog.Builder(context)
73                     .setTitle(title).setMessage(message);
74 
75             dialog.show();
76         }
77     }
78 }

 

 //MainActivity.smali
.class public Lcom/example/wang/MainActivity; .super Landroid/app/Activity; .source "MainActivity.java" # interfaces .implements Landroid/view/View$OnClickListener; # annotations .annotation system Ldalvik/annotation/MemberClasses; value = { Lcom/example/wang/MainActivity$MyPhone;, Lcom/example/wang/MainActivity$Student; } .end annotation # static fields .field public static final TAG:Ljava/lang/String; = "MY_TAG" # direct methods .method public constructor <init>()V .locals 0 .prologue .line 13 invoke-direct {p0}, Landroid/app/Activity;-><init>()V return-void .end method .method private static add(II)I .locals 1 .param p0, "a" # I .param p1, "b" # I .prologue .line 31 add-int v0, p0, p1 .line 32 .local v0, "sum":I return v0 .end method # virtual methods .method public onClick(Landroid/view/View;)V .locals 2 .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 63 :goto_0 return-void .line 57 :pswitch_0 const-string v0, "begin to start" .line 58 .local v0, "msg":Ljava/lang/String; invoke-virtual {p0, v0}, Lcom/example/wang/MainActivity;->toToast(Ljava/lang/String;)V goto :goto_0 .line 55 :pswitch_data_0 .packed-switch 0x7f05003c :pswitch_0 .end packed-switch .end method .method protected onCreate(Landroid/os/Bundle;)V .locals 2 .param p1, "savedInstanceState" # Landroid/os/Bundle; .prologue .line 18 invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V .line 19 const v1, 0x7f030018 invoke-virtual {p0, v1}, Lcom/example/wang/MainActivity;->setContentView(I)V .line 21 const v1, 0x7f05003c invoke-virtual {p0, v1}, Lcom/example/wang/MainActivity;->findViewById(I)Landroid/view/View; move-result-object v0 check-cast v0, Landroid/widget/Button; .line 22 .local v0, "startBtn":Landroid/widget/Button; invoke-virtual {v0, p0}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V .line 23 return-void .end method .method public toToast(Ljava/lang/String;)V .locals 1 .param p1, "msg" # Ljava/lang/String; .prologue .line 26 const/4 v0, 0x1 invoke-static {p0, p1, v0}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object v0 invoke-virtual {v0}, Landroid/widget/Toast;->show()V .line 27 return-void .end method

 注解是Java的语言特性,android系统中有两个注解包:dalvik.annotation, android.annotation
MemberClasses即子类成员集合,就是内部类列表。它是编译时自动加上的。

//MainActivity$MyPhone.smali
.class public Lcom/example/wang/MainActivity$MyPhone; .super Ljava/lang/Object; .source "MainActivity.java" # annotations .annotation system Ldalvik/annotation/EnclosingClass; value = Lcom/example/wang/MainActivity; .end annotation .annotation system Ldalvik/annotation/InnerClass; accessFlags = 0x1 name = "MyPhone" .end annotation # instance fields .field final synthetic this$0:Lcom/example/wang/MainActivity; # direct methods .method public constructor <init>(Lcom/example/wang/MainActivity;)V .locals 0 .prologue .line 66 iput-object p1, p0, Lcom/example/wang/MainActivity$MyPhone;->this$0:Lcom/example/wang/MainActivity; invoke-direct {p0}, Ljava/lang/Object;-><init>()V .line 67 return-void .end method .method private showDialog(Landroid/content/Context;)V .locals 4 .param p1, "context" # Landroid/content/Context; .prologue .line 70 const-string v2, "my title" .line 71 .local v2, "title":Ljava/lang/String; const-string v1, "show my dialog" .line 72 .local v1, "message":Ljava/lang/String; new-instance v3, Landroid/app/AlertDialog$Builder; invoke-direct {v3, p1}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V .line 73 invoke-virtual {v3, v2}, Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder; move-result-object v3 invoke-virtual {v3, v1}, Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder; move-result-object v0 .line 75 .local v0, "dialog":Landroid/app/AlertDialog$Builder; invoke-virtual {v0}, Landroid/app/AlertDialog$Builder;->show()Landroid/app/AlertDialog; .line 76 return-void .end method

 # annotations
.annotation system Ldalvik/annotation/EnclosingClass;
    value = Lcom/example/wang/MainActivity;
.end annotation

.annotation system Ldalvik/annotation/InnerClass;
    accessFlags = 0x1
    name = "MyPhone"
.end annotation

EnclosingClass注解表示MainActivity$MyPhone作用于一个类,注解value表明这个类是MainActivity
InnerClass表示它是一个内部类。accessFlags = 0x1是一个访问标志
enum {
    kDexVisibilityBuild     = 0x00,
    kDexVisibilityRuntime   = 0x01,
    kDexVisibilitySystem    = 0x02
}

//MainActivity$Student.smali
.class public Lcom/example/wang/MainActivity$Student; .super Ljava/lang/Object; .source "MainActivity.java" # annotations .annotation system Ldalvik/annotation/EnclosingClass; value = Lcom/example/wang/MainActivity; .end annotation .annotation system Ldalvik/annotation/InnerClass; accessFlags = 0x1 name = "Student" .end annotation # instance fields .field private age:I .field private name:Ljava/lang/String; .field final synthetic this$0:Lcom/example/wang/MainActivity; # direct methods .method public constructor <init>(Lcom/example/wang/MainActivity;)V .locals 0 .prologue .line 39 iput-object p1, p0, Lcom/example/wang/MainActivity$Student;->this$0:Lcom/example/wang/MainActivity; invoke-direct {p0}, Ljava/lang/Object;-><init>()V .line 41 return-void .end method .method public constructor <init>(Lcom/example/wang/MainActivity;Ljava/lang/String;I)V .locals 0 .param p2, "name" # Ljava/lang/String; .param p3, "age" # I .prologue .line 43 iput-object p1, p0, Lcom/example/wang/MainActivity$Student;->this$0:Lcom/example/wang/MainActivity; invoke-direct {p0}, Ljava/lang/Object;-><init>()V .line 44 iput-object p2, p0, Lcom/example/wang/MainActivity$Student;->name:Ljava/lang/String; .line 45 iput p3, p0, Lcom/example/wang/MainActivity$Student;->age:I .line 46 return-void .end method # virtual methods .method public printf()V .locals 3 .prologue .line 49 const-string v0, "MY_TAG" new-instance v1, Ljava/lang/StringBuilder; const-string v2, "name:" invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V iget-object v2, p0, Lcom/example/wang/MainActivity$Student;->name:Ljava/lang/String; invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v1 const-string v2, ", age:" invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v1 iget v2, p0, Lcom/example/wang/MainActivity$Student;->age:I invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v1 invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v1 invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I .line 50 return-void .end method

 

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