diff --git a/examples/AnnotationValues/10.smali b/examples/AnnotationValues/10.smali new file mode 100644 index 00000000..4460a019 --- /dev/null +++ b/examples/AnnotationValues/10.smali @@ -0,0 +1,6 @@ +.class public L10; +.super Ljava/lang/Object; + +.method public static 11()V + return-void +.end method \ No newline at end of file diff --git a/examples/AnnotationValues/AnnotationWithValues.smali b/examples/AnnotationValues/AnnotationWithValues.smali new file mode 100644 index 00000000..417faa5f --- /dev/null +++ b/examples/AnnotationValues/AnnotationWithValues.smali @@ -0,0 +1,67 @@ +.class public abstract interface annotation LAnnotationWithValues; +.super Ljava/lang/Object; +.implements Ljava/lang/annotation/Annotation; + +.method public abstract booleanValue()Z +.end method + +.method public abstract byteValue()B +.end method + +.method public abstract charValue()C +.end method + +.method public abstract shortValue()S +.end method + +.method public abstract intValue()I +.end method + +.method public abstract longValue()J +.end method + +.method public abstract floatValue()F +.end method + +.method public abstract doubleValue()D +.end method + +.method public abstract stringValue()Ljava/lang/String; +.end method + +.method public abstract subAnnotationValue()LSubAnnotation; +.end method + +.method public abstract typeValue()Ljava/lang/Class; +.end method + +.method public abstract methodValue()Ljava/lang/reflect/Method; +.end method + +;dalvik doesn't seem to like field values +;.method public abstract fieldValue()Ljava/lang/reflect/Field; +;.end method + +.method public abstract enumValue()LEnum; +.end method + +.annotation system Ldalvik/annotation/AnnotationDefault; + value = .subannotation LAnnotationWithValues; + booleanValue = false + byteValue = 1t + charValue = '2' + shortValue = 3s + intValue = 4 + longValue = 5l + floatValue = 6.0f + doubleValue = 7.0 + stringValue = "8" + subAnnotationValue = .subannotation LSubAnnotation; + stringValue = "9" + .end subannotation + typeValue = L10; + methodValue = L10;->11()V + enumValue = .enum LEnum;->12:LEnum; + .end subannotation +.end annotation + diff --git a/examples/AnnotationValues/Enum.smali b/examples/AnnotationValues/Enum.smali new file mode 100644 index 00000000..f965d6e8 --- /dev/null +++ b/examples/AnnotationValues/Enum.smali @@ -0,0 +1,52 @@ +.class public final enum LEnum; +.super Ljava/lang/Enum; + +.field private static final synthetic $VALUES:[LEnum; + +.field public static final enum 12:LEnum; + +.method static constructor ()V + .registers 4 + + const/4 v3, 1 + const/4 v2, 0 + new-instance v0, LEnum; + const-string v1, "12" + invoke-direct {v0, v1, v2}, LEnum;->(Ljava/lang/String;I)V + sput-object v0, LEnum;->12:LEnum; + + const/4 v0, 1 + new-array v0, v0, [LEnum; + sget-object v1, LEnum;->12:LEnum; + aput-object v1, v0, v2 + + sput-object v0, LEnum;->$VALUES:[LEnum; + return-void +.end method + +.method private constructor (Ljava/lang/String;I)V + .registers 3 + + invoke-direct {v0, v1, v2}, Ljava/lang/Enum;->(Ljava/lang/String;I)V + return-void +.end method + +.method public static valueOf(Ljava/lang/String;)LEnum; + .registers 2 + + const-class v0, LEnum; + invoke-static {v0, v1}, Ljava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + move-result-object v1 + check-cast v1, LEnum; + return-object v1 +.end method + +.method public static values()[LEnum; + .registers 1 + + sget-object v0, LEnum;->$VALUES:[LEnum; + invoke-virtual {v0}, [LEnum;->clone()Ljava/lang/Object; + move-result-object v0 + check-cast v0, [LEnum; + return-object v0 +.end method \ No newline at end of file diff --git a/examples/AnnotationValues/Main.smali b/examples/AnnotationValues/Main.smali new file mode 100644 index 00000000..82376e0a --- /dev/null +++ b/examples/AnnotationValues/Main.smali @@ -0,0 +1,25 @@ +.class public LMain; +.super Ljava/lang/Object; + +;expected output: +;@AnnotationWithValues(booleanValue=false, byteValue=1, charValue=2, doubleValue=7.0, enumValue=12, floatValue=6.0, intValue=4, longValue=5, methodValue=public static void 10.11(), shortValue=3, stringValue=8, subAnnotationValue=@SubAnnotation(stringValue=9), typeValue=class 10) + + +.method public static main([Ljava/lang/String;)V + .registers 3 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const-class v1, LMain; + const-class v2, LAnnotationWithValues; + + invoke-virtual {v1, v2}, Ljava/lang/Class;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation; + move-result-object v1 + + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V + + return-void +.end method + +.annotation runtime LAnnotationWithValues; +.end annotation diff --git a/examples/AnnotationValues/SubAnnotation.smali b/examples/AnnotationValues/SubAnnotation.smali new file mode 100644 index 00000000..61ef9fd4 --- /dev/null +++ b/examples/AnnotationValues/SubAnnotation.smali @@ -0,0 +1,6 @@ +.class public abstract interface annotation LSubAnnotation; +.super Ljava/lang/Object; +.implements Ljava/lang/annotation/Annotation; + +.method public abstract stringValue()Ljava/lang/String; +.end method \ No newline at end of file diff --git a/examples/Constants.smali b/examples/Constants.smali new file mode 100644 index 00000000..5d9a779b --- /dev/null +++ b/examples/Constants.smali @@ -0,0 +1,97 @@ +.class public org/JesusFreke/HelloWorld2/HelloWorld2 +.super android/app/Activity + +.field private static final stringConstant1 Ljava/lang/String; = "Hello World!" +.field private static final stringConstant2 Ljava/lang/String; = "" +.field private static final stringConstant3 Ljava/lang/String; = "a\b\n\f\r\"\'\\\u1234\u0000\u000a\u000d" + +.field private static final charConstant1 C = 'a' +.field private static final charConstant2 C = '\b' ;backspace +.field private static final charConstant3 C = '\n' +.field private static final charConstant4 C = '\f' ;formfeed +.field private static final charConstant5 C = '\r' +.field private static final charConstant6 C = '\"' +.field private static final charConstant7 C = '\'' +.field private static final charConstant8 C = '\\' +.field private static final charConstant9 C = '\0' +.field private static final charConstant10 C = '\7' +.field private static final charConstant11 C = '\77' +.field private static final charConstant12 C = '\377' + +.field private static final intDecConstant1 I = 0 +.field private static final intDecConstant2 I = 1 +.field private static final intDecConstant3 I = 1000 +.field private static final intDecConstant4 I = 1024 +.field private static final intDecConstant5 I = 2147483647 +.field private static final intDecConstant6 I = -0 +.field private static final intDecConstant7 I = -1 +.field private static final intDecConstant8 I = -1000 +.field private static final intDecConstant9 I = -1024 +.field private static final intDecConstant10 I = -2147483648 + +.field private static final intHexConstant1 I = 0x0 +.field private static final intHexConstant2 I = 0x00 +.field private static final intHexConstant3 I = 0x1 +.field private static final intHexConstant4 I = 0x01 +.field private static final intHexConstant5 I = 0x3E8 ;1000 +.field private static final intHexConstant6 I = 0x400 ;1024 +.field private static final intHexConstant7 I = 0x7fffffff ;2147483647 +.field private static final intHexConstant8 I = 0xFFFFFFFF ;-1 +.field private static final intHexConstant9 I = 0xFFFFFC18 ;-1000 +.field private static final intHexConstant10 I = 0xFFFFFC00 ;-1024 +.field private static final intHexConstant11 I = 0x80000000 ;-2147483648 + +.field private static final longDecConstant1 J = 0L +.field private static final longDecConstant2 J = 1L +.field private static final longDecConstant3 J = 1000L +.field private static final longDecConstant4 J = 1024L +.field private static final longDecConstant5 J = 2147483647L +.field private static final longDecConstant5 J = 2147483648L +.field private static final longDecConstant5 J = 9223372036854775807L +.field private static final longDecConstant6 J = -0L +.field private static final longDecConstant7 J = -1L +.field private static final longDecConstant8 J = -1000L +.field private static final longDecConstant9 J = -1024L +.field private static final longDecConstant10 J = -2147483648L +.field private static final longDecConstant10 J = -2147483649L +.field private static final longDecConstant10 J = -9223372036854775808L + +.field private static final longHexConstant1 J = 0x0L +.field private static final longHexConstant2 J = 0x00L +.field private static final longHexConstant3 J = 0x1L +.field private static final longHexConstant4 J = 0x01L +.field private static final longHexConstant5 J = 0x3E8L ;1000 +.field private static final longHexConstant6 J = 0x400L ;1024 +.field private static final longHexConstant7 J = 0x7fffffffL ;2147483647 +.field private static final longHexConstant7 J = 0x80000000L ;2147483648 +.field private static final longHexConstant7 J = 0x7fffffffffffffffL ;9223372036854775807 +.field private static final longHexConstant8 J = 0xFFFFFFFFFFFFFFFFL ;-1 +.field private static final longHexConstant9 J = 0xFFFFFFFFFFFFFC18L ;-1000 +.field private static final longHexConstant10 J = 0xFFFFFFFFFFFFFC00L ;-1024 +.field private static final longHexConstant11 J = 0xFFFFFFFF80000000L ;-2147483648 +.field private static final longHexConstant11 J = 0xFFFFFFFF7FFFFFFFL ;-2147483649 +.field private static final longHexConstant12 J = 0x8000000000000000L ;-9223372036854775808 + +.method public constructor ()V + .registers 1 + invoke-direct {v0} android/app/Activity.()V + return-void +.end method + +.method public onCreate(Landroid/os/Bundle;)V + .registers 4 + + sget-object v0 java/lang/System.out Ljava/io/PrintStream; + + invoke-super {v2,v3} android/app/Activity.onCreate(Landroid/os/Bundle;)V + + new-instance v0 android/widget/TextView + invoke-direct {v0,v2} android/widget/TextView.(Landroid/content/Context;)V + const-string v1 "Hello World!" + invoke-virtual {v0,v1} android/widget/TextView.setText(Ljava/lang/CharSequence;)V + invoke-virtual {v2,v0} org/JesusFreke/HelloWorld2/HelloWorld2.setContentView(Landroid/view/View;)V + + return-void +.end method + + diff --git a/examples/Enums/Enum.smali b/examples/Enums/Enum.smali new file mode 100644 index 00000000..04c0d0e9 --- /dev/null +++ b/examples/Enums/Enum.smali @@ -0,0 +1,73 @@ +.class public final enum LEnum; +.super Ljava/lang/Enum; + +;This class is an example of how to define an enum. You have +;to do all of the work that java normally takes care of + +.field private static final synthetic $VALUES:[LEnum; + +.field public static final enum VALUE1:LEnum; +.field public static final enum VALUE2:LEnum; + +.method static constructor ()V + .registers 4 + + ;create an instance of this class for the VALUE1 value + new-instance v0, LEnum; + const-string v1, "VALUE1" + const/4 v2, 0 + invoke-direct {v0, v1, v2}, LEnum;->(Ljava/lang/String;I)V + + ;and store it in VALUE1 + sput-object v0, LEnum;->VALUE1:LEnum; + + ;create an instance of this class for the VALUE2 value + new-instance v0, LEnum; + const-string v1, "VALUE2" + const/4 v3, 1 + invoke-direct {v0, v1, v3}, LEnum;->(Ljava/lang/String;I)V + + ;and store it in VALUE2 + sput-object v0, LEnum;->VALUE2:LEnum; + + ;create an array of Enums, for the $VALUES member + const/4 v0, 2 + new-array v0, v0, [LEnum; + + ;add VALUE1 to the array + sget-object v1, LEnum;->VALUE1:LEnum; + aput-object v1, v0, v2 + + ;add VALUE2 to the array + sget-object v1, LEnum;->VALUE2:LEnum; + aput-object v1, v0, v3 + + ;and store the array in $VALUES + sput-object v0, LEnum;->$VALUES:[LEnum; + + return-void +.end method + +.method private constructor (Ljava/lang/String;I)V + .registers 3 + invoke-direct {v0, v1, v2}, Ljava/lang/Enum;->(Ljava/lang/String;I)V + return-void +.end method + +.method public static valueof(Ljava/lang/String;)LEnum; + .registers 2 + const-class v0, LEnum; + invoke-static {v0, v1}, Ljava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + move-result-object v1 + check-cast v1, LEnum; + return-object v1 +.end method + +.method public static values()[LEnum; + .registers 1 + sget-object v0, LEnum;->$VALUES:[LEnum; + invoke-virtual {v0}, [LEnum;->clone()Ljava/lang/Object; + move-result-object v0 + check-cast v0, [LEnum; + return-object v0 +.end method \ No newline at end of file diff --git a/examples/Enums/Main.smali b/examples/Enums/Main.smali new file mode 100644 index 00000000..65354193 --- /dev/null +++ b/examples/Enums/Main.smali @@ -0,0 +1,15 @@ +.class public LMain; +.super Ljava/lang/Object; + + + +.method public static main([Ljava/lang/String;)V + .registers 2 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + sget-object v1, LEnum;->VALUE1:LEnum; + + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V + + return-void +.end method \ No newline at end of file diff --git a/examples/HelloWorld/HelloWorld.smali b/examples/HelloWorld/HelloWorld.smali new file mode 100644 index 00000000..35de7e80 --- /dev/null +++ b/examples/HelloWorld/HelloWorld.smali @@ -0,0 +1,23 @@ +.class public LHelloWorld; + +;Ye olde hello world application +;To assemble and run this on a phone or emulator: +; +;java -jar smali.jar --dex HelloWorld.smali +;zip HelloWorld.zip classes.dex +;adb push HelloWorld.zip /data/local +;adb shell dalvikvm -cp /data/local/HelloWorld.zip HelloWorld + +.super Ljava/lang/Object; + +.method public static main([Ljava/lang/String;)V + .registers 2 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const-string v1, "Hello World!" + + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + return-void +.end method \ No newline at end of file diff --git a/examples/HelloWorld2.smali b/examples/HelloWorld2.smali new file mode 100644 index 00000000..5e0f301f --- /dev/null +++ b/examples/HelloWorld2.smali @@ -0,0 +1,812 @@ +.class public Lorg/JesusFreke/HelloWorld2/HelloWorld2; + +.super Landroid/app/Activity; + +.source "HelloWorld2.smali" + +;two random interfaces with only a single method to implement +.implements Landroid/util/Printer; +.implements Landroid/accounts/AccountMonitorListener; + + + +.method public println(Ljava/lang/String;)V + .registers 2 + + return-void +.end method + + + + +.method public onAccountsUpdated([Ljava/lang/String;)V + .parameter "currentAccounts" + + return-void + .registers 2 +.end method + +.method public static parameterNameTest(IIII)V + .registers 4 + .parameter "test1" + .parameter "test2" + .parameter + .parameter "test4" + + return-void +.end method + + +.field private helloWorld Ljava/lang/String; +.field private static helloWorldStatic Ljava/lang/String; + +.field private static helloWorldStatic2 Ljava/lang/String; = "Static Initializer Hello World!" + +;This class should display the following text to the screen: +; +;Hello World! +;Static Hello World! +;Static Initializer Hello World! +;org/JesusFreke/HelloWorld2/HelloWorld2 +;[Lorg/JesusFreke/HelloWorld2/HelloWorld2; +;[I +;0 +;-8 +;7 +;Format10t with a label +;Format10t with an offset +;Format20t with a label +;Format30t with a label +;Testing Format22x and Format32x +;Testing Format21t +;-32768 +;-2147483648 +;-9223372036854775808 +;-1 +;20 +;1 +;Testing Format22t +;20025 +;286331153 +;Testing Format31c +;5000000000 +;5000000 +;Label12 +;Label13 +;In the exception handler. + + +.method static constructor ()V ;test + .registers 1 + + const-string v0, "Static Hello World!" + sput-object v0, org/JesusFreke/HelloWorld2/HelloWorld2/helloWorldStatic Ljava/lang/String; ;test + + return-void +.end method + +.method public constructor ()V + .registers 2 + invoke-direct {v1}, android/app/Activity/()V + + const-string v0, "Hello World!" + iput-object v0, v1, org/JesusFreke/HelloWorld2/HelloWorld2/helloWorld Ljava/lang/String;;test + + return-void +.end method + + +.method public largeRegisterTest()Ljava/lang/String; + .registers 1235 + + const-string v1, "Testing Format22x and Format32x" + move-object/16 v1234, v1 + + const-string v1, "This shouldn't be displayed!" + move-object/from16 v1, v1234 + + return-object v1 +.end method + +.method public testFormat21t()Ljava/lang/String; + .registers 3 + + const-string v0, "Testing Format21t" + const-string v1, "This shouldn't be displayed!" + + const/4 v2, 0 + + if-eqz v2, HERE: + + return-object v1 + +HERE: + return-object v0 +.end method + + +.method public testFormat21s()Ljava/lang/String; + .registers 2 + + const/16 v0, -32768 + + invoke-static {v0}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v1 + + return-object v1 +.end method + + +.method public testFormat22s()Ljava/lang/String; + .registers 2 + const/16 v0, 25 + + add-int/lit16 v1, v0, 20000 + + invoke-static {v1}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v0 + + return-object v0 +.end method + +.method public testFormat21h()Ljava/lang/String; + .registers 2 + + const/high16 v0, -32768 + + invoke-static {v0}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v1 + + return-object v1 +.end method + + +.method public testFormat21h-wide()Ljava/lang/String; + .registers 3 + + const-wide/high16 v0, -32768 + + invoke-static {v0, v1}, java/lang/Long/toString(J)Ljava/lang/String; + move-result-object v2 + + return-object v2 +.end method + +.method public testFormat23x()Ljava/lang/String; + .registers 7 + + const-wide/16 v0, 1 + const-wide/high16 v2, 1 + + cmp-long v4, v0, v2 + + invoke-static {v4}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v6 + + + return-object v6 +.end method + +.method public testFormat22b()Ljava/lang/String; + .registers 2 + + const/16 v0, -10 + add-int/lit8 v1, v0, 30 + + invoke-static {v1}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v0 + + return-object v0 +.end method + +.method public testFormat22cType()Ljava/lang/String; + .registers 2 + + const-string v0, "test" + + instance-of v1, v0, Ljava/lang/String; + + invoke-static {v1}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v0 + + return-object v0 +.end method + +.method public testFormat22t()Ljava/lang/String; + .registers 3 + + const/16 v1, 1 + const/16 v2, 1 + + if-eq v1, v2, skip: + + const-string v0, "This shouldn't be displayed!" + return-object v0 + +skip: + + const-string v0, "Testing Format22t" + return-object v0 +.end method + + +.method public testFormat31i()Ljava/lang/String; + .registers 3 + + const v0, 305419896 + + const v1, -19088743 + + add-int v2, v0, v1 + + invoke-static {v2}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v0 + + return-object v0 +.end method + +.method public testFormat31c()Ljava/lang/String; + .registers 1 + + const-string/jumbo v0, "Testing Format31c" + + return-object v0 +.end method + + +.method public testFormat51l()Ljava/lang/String; + .registers 2 + + const-wide v0, 5000000000L + invoke-static {v0, v1}, java/lang/Long/toString(J)Ljava/lang/String; + move-result-object v0 + + return-object v0 +.end method + +.method public testArrayFillData()Ljava/lang/String; + .registers 3 + + const v0, 7 + new-array v0, v0, [I + fill-array-data v0, ArrayData: + + const v1, 6 + aget v2, v0, v1 + + invoke-static {v2}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v2 + + return-object v2 + +ArrayData: + + .array-data 4 + 1 + 2 + 3 + 4 5 6 + + ;5000000 + ;0x40T 0x4BT 0x4CT 0x00T + 7.006492321624085e-39f + + .end array-data +.end method + +.method public testPackedSwitch()Ljava/lang/String; + .registers 2 + + const v0, 12 + +switch: + packed-switch v0, PackedSwitch: + +Label10: + const-string v1, "Label10" + return-object v1 + +Label11: + const-string v1, "Label11" + return-object v1 + +Label12: + const-string v1, "Label12" + return-object v1 + +Label13: + const-string v1, "Label13" + return-object v1 + +PackedSwitch: + .packed-switch switch: 10 + Label10: + Label11: + Label12: + Label13: + .end packed-switch + +.end method + + +.method public testSparseSwitch()Ljava/lang/String; + .registers 2 + + const v0, 13 + +switch: + sparse-switch v0, SparseSwitch: + +Label10: + const-string v1, "Label10" + return-object v1 + +Label20: + const-string v1, "Label20" + return-object v1 + +Label15: + const-string v1, "Label15" + return-object v1 + +Label13: + const-string v1, "Label13" + return-object v1 + +Label99: + const-string v1, "Label99" + return-object v1 + +SparseSwitch: + .sparse-switch switch: + 10 -> Label10: + 13 -> Label13: + 15 -> Label15: + 20 -> Label20: + 99 -> Label99: + .end sparse-switch + +.end method + +.method public testTry()Ljava/lang/String; + .registers 2 + + .line 4 + + ;0 + + + const-string v0, "This shouldn't be displayed!" + + .local v0, testVarName Ljava/lang/String; + + .prologue + + + + + ;2 + + tryStart: + new-instance v1, Ljava/lang/Exception; + + .local v1, testVarName2 Ljava/lang/String;, "some weird type" + + .line 2 + + ;4 + + .end local v0 + + invoke-direct {v1}, java/lang/Exception/()V + + ;7 + + throw v1 + + nop + nop + + .restart local v0 + + .line 5 + + ;10 + tryEnd: + + return-object v0 + + .source "blahblah.java" + .line 90 + + ;11 + + + .epilogue + + .catch Ljava/lang/Exception; {tryStart: .. tryEnd:} handler: + + handler: + const-string v0, "In the exception handler." + return-object v0 + +.end method + + + +.method public onCreate(Landroid/os/Bundle;)V + .registers 6 + + .line 1 + + invoke-super {v4,v5}, android/app/Activity/onCreate(Landroid/os/Bundle;)V + + const-string v3, "\n" + + new-instance v0, Landroid/widget/TextView; + invoke-direct {v0,v4}, android/widget/TextView/(Landroid/content/Context;)V + + .line 3 + + iget-object v1, v4, org/JesusFreke/HelloWorld2/HelloWorld2/helloWorld Ljava/lang/String; + + invoke-virtual {v1, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + sget-object v2, org/JesusFreke/HelloWorld2/HelloWorld2/helloWorldStatic Ljava/lang/String; + invoke-virtual {v1, v2}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v1, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + sget-object v2, org/JesusFreke/HelloWorld2/HelloWorld2/helloWorldStatic2 Ljava/lang/String; + invoke-virtual/range {v1 .. v2}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + + invoke-virtual {v1, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + const-class v2, Lorg/JesusFreke/HelloWorld2/HelloWorld2; + invoke-virtual {v2}, java/lang/Class/getName()Ljava/lang/String; + move-result-object v2 + + invoke-virtual/range {v1 .. v2}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + + + invoke-virtual {v1, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + const-class v2, [Lorg/JesusFreke/HelloWorld2/HelloWorld2; + invoke-virtual {v2}, java/lang/Class/getName()Ljava/lang/String; + move-result-object v2 + + invoke-virtual/range {v1 .. v2}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + + + invoke-virtual {v1, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + const-class v2, [I + invoke-virtual {v2}, java/lang/Class/getName()Ljava/lang/String; + move-result-object v2 + + invoke-virtual/range {v1 .. v2}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + move-object v2, v1 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test out Format11n, with various literals + ;with 0 + const/4 v1, 0 + invoke-static {v1}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;with -8 + const/4 v1, -8 + invoke-static {v1}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;with 7 + const/4 v1, 7 + invoke-static {v1}, java/lang/Integer/toString(I)Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + + ;test format10t with a label + goto SKIP: + + const-string v1, "This shouldn't be displayed!" + + SKIP: + const-string v1,"Format10t with a label" + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test format10t with an offset + goto 3 + + const-string v1, "This shouldn't be displayed!" + + const-string v1,"Format10t with an offset" + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + + ;test format20t with a label + goto/16 SKIP2: + + const-string v1, "This shouldn't be displayed!" + + SKIP2: + const-string v1,"Format20t with a label" + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test format30t with a label + goto/32 SKIP3: + + const-string v1, "This shouldn't be displayed!" + + SKIP3: + const-string v1,"Format30t with a label" + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + + ;test format22x and format32x + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/largeRegisterTest()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + + ;test format21t + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat21t()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + + ;test format21s + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat21s()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + + ;test format21h + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat21h()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test format21h + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat21h-wide()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test format23x + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat23x()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + ;test format22b + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat22b()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test format22c-type + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat22cType()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test format22t + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat22t()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test format22s + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat22s()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test format31i + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat31i()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test format31c + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat31c()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test format51l + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat51l()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + ;test array-fill-data + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testArrayFillData()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + ;test packed-switch + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testPackedSwitch()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + ;test sparse-switch + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testSparseSwitch()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + + ;test try-catch block + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testTry()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + + + check-cast v4, Landroid/app/Activity; + + invoke-virtual {v0,v2}, android/widget/TextView/setText(Ljava/lang/CharSequence;)V + + + new-instance v1, Landroid/widget/ScrollView; + invoke-direct {v1,v4}, android/widget/ScrollView/(Landroid/content/Context;)V + + invoke-virtual {v1, v0}, android/widget/ScrollView/addView(Landroid/view/View;)V + + + invoke-virtual {v4,v1}, org/JesusFreke/HelloWorld2/HelloWorld2/setContentView(Landroid/view/View;)V + + return-void +.end method + + diff --git a/examples/Identifiers.smali b/examples/Identifiers.smali new file mode 100644 index 00000000..b3a36cac --- /dev/null +++ b/examples/Identifiers.smali @@ -0,0 +1,39 @@ +.class public org/JesusFreke/HelloWorld2/HelloWorld2 +.super android/app/Activity + +.field private static final final Ljava/lang/String; +.field private static final static I +.field private static final 1234 I +.field private static final 1234-5678 I +.field private static final 1E1000 I +.field private static final 1E-1000 I +.field private static final return I +.field private static final new-instance I +.field private static final I +.field private static final I +.field private static final test$abcd I + + +.method public constructor ()V + .registers 1 + invoke-direct {v0} android/app/Activity.()V + return-void +.end method + +.method public 1E-2000(Landroid/os/Bundle;)V + .registers 4 + + sget-object v0 java/lang/System.out Ljava/io/PrintStream; + + invoke-super {v2,v3} android/app/Activity.onCreate(Landroid/os/Bundle;)V + + new-instance v0 android/widget/TextView + invoke-direct {v0,v2} android/widget/TextView.(Landroid/content/Context;)V + const-string v1 "Hello World!" + invoke-virtual {v0,v1} android/widget/TextView.setText(Ljava/lang/CharSequence;)V + invoke-virtual {v2,v0} org/JesusFreke/HelloWorld2/HelloWorld2.setContentView(Landroid/view/View;)V + + return-void +.end method + + diff --git a/examples/NoFields.smali b/examples/NoFields.smali new file mode 100644 index 00000000..4d045cb9 --- /dev/null +++ b/examples/NoFields.smali @@ -0,0 +1,28 @@ +.class public org/JesusFreke/HelloWorld2/HelloWorld2 +.super android/app/Activity + +.method public constructor ()V + .registers 1 + invoke-direct {v1} android/app/Activity.()V + + return-void +.end method + +.method public onCreate(Landroid/os/Bundle;)V + .registers 5 + + invoke-super {v3,v4} android/app/Activity.onCreate(Landroid/os/Bundle;)V + + const-string v1 "Hello World!" + + new-instance v0 android/widget/TextView + invoke-direct {v0,v3} android/widget/TextView.(Landroid/content/Context;)V + + + invoke-virtual {v0,v1} android/widget/TextView.setText(Ljava/lang/CharSequence;)V + invoke-virtual {v3,v0} org/JesusFreke/HelloWorld2/HelloWorld2.setContentView(Landroid/view/View;)V + + return-void +.end method + + diff --git a/examples/RecursiveAnnotation/Main.smali b/examples/RecursiveAnnotation/Main.smali new file mode 100644 index 00000000..4cf3dcdb --- /dev/null +++ b/examples/RecursiveAnnotation/Main.smali @@ -0,0 +1,24 @@ +.class public LMain; +.super Ljava/lang/Object; + +;expected output (using the dalvik's default stack size) +;@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=java.lang.StackOverflowError)))))))))))))))))))))))))))))) + +.method public static main([Ljava/lang/String;)V + .registers 3 + + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + + const-class v1, LMain; + const-class v2, LRecursiveAnnotation; + + invoke-virtual {v1, v2}, Ljava/lang/Class;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation; + move-result-object v1 + + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V + + return-void +.end method + +.annotation runtime LRecursiveAnnotation; +.end annotation diff --git a/examples/RecursiveAnnotation/RecursiveAnnotation.smali b/examples/RecursiveAnnotation/RecursiveAnnotation.smali new file mode 100644 index 00000000..dbacafa7 --- /dev/null +++ b/examples/RecursiveAnnotation/RecursiveAnnotation.smali @@ -0,0 +1,18 @@ +.class public abstract interface annotation LRecursiveAnnotation; +.super Ljava/lang/Object; +.implements Ljava/lang/annotation/Annotation; + +;this is a recursive annotation that has a default value of itself. +;Trying to print .toString() on an instance of this annotation +;will cause a stack overflow + +.method public abstract value()LRecursiveAnnotation; +.end method + +.annotation system Ldalvik/annotation/AnnotationDefault; + value = .subannotation LRecursiveAnnotation; + value = .subannotation LRecursiveAnnotation; + .end subannotation + .end subannotation +.end annotation +