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

浙公网安备 33010602011771号