NAME=Dalvik HelloWorld afl
FILE=bins/dex/HelloWorld.dex
CMDS=aa; afl
EXPECT=<<EOF
0x100000238    1 20           method.public.constructor.Hello.void__init
0x10000025c    1 34           entry0
0x100000290    1 84           method.public.Hello.void_foo_int
0x1000002f4    1 20           method.public.constructor.World.void__init
0x100000318    1 68           method.public.World.void_foo_int
0x8000000000    1 2            sym.java.io.PrintStream.void_println_String
0x8000000002    1 2            sym.Integer.void__init__int
0x8000000004    1 2            sym.Integer.String_toString
0x8000000006    1 2            sym.Object.void__init
0x8000000008    1 2            sym.StringBuilder.void__init
0x800000000a    1 2            sym.StringBuilder.StringBuilder_append_String
0x800000000c    1 2            sym.StringBuilder.String_toString
EOF
RUN

NAME=Dalvik HelloWorld string xref
FILE=bins/dex/HelloWorld.dex
CMDS=aa; axt @ str.Findus
EXPECT=<<EOF
entry0 0x100000260 [DATA] const-string v1, str.Findus
EOF
RUN

NAME=Dalvik HelloWorld func xref
FILE=bins/dex/HelloWorld.dex
CMDS=aa; axt @ sym.Hello.void__init
EXPECT=<<EOF
entry0 0x10000026e [CALL] invoke-direct {v0}, LHello;-><init>()V
EOF
RUN

NAME=Dalvik HelloWorld func xref to super method
FILE=bins/dex/org.radare.radare2installer.dex
CMDS=aaa; axt @ sym.android.app.Activity.void_onDestroy~invoke-super
EXPECT=<<EOF
method.public.org.radare.radare2installer.ConsoleActivity.void_onDestroy; void onDestroy() 0x100019e50 [CALL] invoke-super {v1}, Landroid/app/Activity;->onDestroy()V
method.public.org.radare.radare2installer.LaunchActivity.void_onDestroy 0x10001a256 [CALL] invoke-super {v1}, Landroid/app/Activity;->onDestroy()V
method.public.org.radare.radare2installer.WebActivity.void_onDestroy; void onDestroy() 0x10001e574 [CALL] invoke-super {v2}, Landroid/app/Activity;->onDestroy()V
EOF
RUN

NAME=Dalvik resolve virtual methods called via invoke-virtual
FILE=apk://bins/dex/org.radare.radare2installer.apk
CMDS=aaa ; axt @ sym.com.ice.tar.TarEntry.String_getUserName
EXPECT=<<EOF
entry0 0x10000c8ba [CALL] invoke-virtual {v1}, Lcom/ice/tar/TarEntry;->getUserName()Ljava/lang/String;
entry0 0x10000c9e6 [CALL] invoke-virtual {v1}, Lcom/ice/tar/TarEntry;->getUserName()Ljava/lang/String;
method.public.com.ice.tar.TarEntry.String_toString 0x10000f04a [CALL] invoke-virtual {v4}, Lcom/ice/tar/TarEntry;->getUserName()Ljava/lang/String;
EOF
RUN

NAME=Dalvik resolve imports called via invoke-virtual
FILE=apk://bins/dex/org.radare.radare2installer.apk
CMDS=aaa ; axt @ sym.java.net.URL.java.io.InputStream_openStream
EXPECT=<<EOF
method.public.javax.activation.URLDataSource.java.io.InputStream_getInputStream 0x100021180 [CALL] invoke-virtual {v0}, Ljava/net/URL;->openStream()Ljava/io/InputStream;
EOF
RUN

NAME=Dalvik regs
FILE=
CMDS=<<EOF
e asm.arch=dalvik
ar
EOF
EXPECT=<<EOF
v0 = 0x00000000
v1 = 0x00000000
v2 = 0x00000000
v3 = 0x00000000
v4 = 0x00000000
v5 = 0x00000000
v6 = 0x00000000
v7 = 0x00000000
v8 = 0x00000000
v9 = 0x00000000
v10 = 0x00000000
v11 = 0x00000000
v12 = 0x00000000
v13 = 0x00000000
v14 = 0x00000000
v15 = 0x00000000
v16 = 0x00000000
v17 = 0x00000000
v18 = 0x00000000
v19 = 0x00000000
v20 = 0x00000000
v21 = 0x00000000
v22 = 0x00000000
v23 = 0x00000000
v24 = 0x00000000
v25 = 0x00000000
v26 = 0x00000000
v27 = 0x00000000
v28 = 0x00000000
v29 = 0x00000000
v30 = 0x00000000
v31 = 0x00000000
v32 = 0x00000000
v33 = 0x00000000
v34 = 0x00000000
ip = 0x00000000
sp = 0x00000000
bp = 0x00000000
EOF
RUN

NAME=Resolve also exception paths found after gotos/returns
FILE=apk://bins/dex/ade8bef0ac29fa363fc9afd958af0074478aef650adeb0318517b48bd996d5d5.apk
CMDS=<<EOF
aaa
axg @ 0x800000021c
EOF
EXPECT=<<EOF
- 0x800000021c fcn 0x800000021c sym.android.telephony.TelephonyManager.String_getDeviceId
  - 0x100018936 fcn 0x1000186b0 method.public.static.com.network.android.SmsReceiver.void_a_org.xmlpull.v1.XmlSerializer__java.io.StringWriter__android.content.Context
  - 0x1000186b0 fcn 0x1000186b0 method.public.static.com.network.android.SmsReceiver.void_a_org.xmlpull.v1.XmlSerializer__java.io.StringWriter__android.content.Context
    - 0x100025f78 fcn 0x100025f70 fcn.100025f70
    - 0x100025f70 fcn 0x100025f70 fcn.100025f70
      - 0x10002666c fcn 0x10002653c method.public.static.com.network.android.g.a
      - 0x10002653c fcn 0x10002653c method.public.static.com.network.android.g.a
        - 0x100019cac fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
        - 0x100019c60 fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
          - 0x100019d1c fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
          - 0x100019e00 fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
          - 0x10001c7a0 fcn 0x10001c6f0 method.public.final.com.network.android.a.j.void_run
        - 0x10001ac02 fcn 0x10001abb8 method.public.static.com.network.android.a.c.void_a_android.content.Context__byte____boolean__boolean
        - 0x10001abb8 fcn 0x10001abb8 method.public.static.com.network.android.a.c.void_a_android.content.Context__byte____boolean__boolean
          - 0x10001ab9e fcn 0x10001ab9c method.public.static.com.network.android.a.c.void_a_android.content.Context__byte
          - 0x10001ab9c fcn 0x10001ab9c method.public.static.com.network.android.a.c.void_a_android.content.Context__byte
            - 0x100027fe2 fcn 0x100027fb4 method.public.static.com.network.android.j.boolean_a_android.content.Context__boolean__boolean__short
            - 0x100027fb4 fcn 0x100027fb4 method.public.static.com.network.android.j.boolean_a_android.content.Context__boolean__boolean__short
              - 0x100027e8e fcn 0x100027df0 method.public.static.com.network.android.j.boolean_a_android.content.Context__boolean__boolean
              - 0x100027df0 fcn 0x100027df0 method.public.static.com.network.android.j.boolean_a_android.content.Context__boolean__boolean
                - 0x10001c948 fcn 0x10001c918 method.public.final.com.network.android.a.l.void_run
                - 0x10001c918 fcn 0x10001c918 method.public.final.com.network.android.a.l.void_run
                  - 0x10000ed93 ???
                - 0x10001dcd4 fcn 0x10001dcb0 method.public.static.com.network.android.agent.NetworkApp.void_b_android.content.Context
                - 0x10001dcb0 fcn 0x10001dcb0 method.public.static.com.network.android.agent.NetworkApp.void_b_android.content.Context
                  - 0x10001dc44 fcn 0x10001daf4 method.static.synthetic.com.network.android.agent.NetworkApp.void_a_com.network.android.agent.NetworkApp
                  - 0x10001daf4 fcn 0x10001daf4 method.static.synthetic.com.network.android.agent.NetworkApp.void_a_com.network.android.agent.NetworkApp
                    - 0x10001e918 fcn 0x10001e914 method.public.final.com.network.android.agent.c.void_run
                  - 0x10001ea30 fcn 0x10001ea2c method.public.final.com.network.android.agent.e.void_run
                - 0x10001dd60 fcn 0x10001dcb0 method.public.static.com.network.android.agent.NetworkApp.void_b_android.content.Context
                - 0x10001ddb0 fcn 0x10001dcb0 method.public.static.com.network.android.agent.NetworkApp.void_b_android.content.Context
                - 0x10001ed72 fcn 0x10001eca0 method.protected.final.com.network.android.android.monitor.AppServicePinger.void_onHandleIntent_android.content.Intent
                - 0x1000285e2 fcn 0x1000285d4 method.public.static.com.network.android.j.boolean_c_android.content.Context
                - 0x1000285d4 fcn 0x1000285d4 method.public.static.com.network.android.j.boolean_c_android.content.Context
                  - 0x100028322 fcn 0x1000282fc method.public.static.com.network.android.j.void_b_android.content.Context
                  - 0x1000282fc fcn 0x1000282fc method.public.static.com.network.android.j.void_b_android.content.Context
                    - 0x100028812 fcn 0x1000287f4 method.public.final.com.network.android.l.void_run
                  - 0x100028802 fcn 0x1000287f4 method.public.final.com.network.android.l.void_run
                - 0x100045a44 fcn 0x100045a1c method.public.final.com.network.h.k.void_run
              - 0x10002d7aa fcn 0x10002d714 method.protected.static.com.network.android.monitor.observer.BatteryReceiver.void_a_android.content.Intent__android.content.Context
              - 0x10002d714 fcn 0x10002d714 method.protected.static.com.network.android.monitor.observer.BatteryReceiver.void_a_android.content.Intent__android.content.Context
                - 0x10002d6f8 fcn 0x10002d6c4 method.public.static.com.network.android.monitor.observer.BatteryReceiver.String_a_android.content.Context
                - 0x10002d6c4 fcn 0x10002d6c4 method.public.static.com.network.android.monitor.observer.BatteryReceiver.String_a_android.content.Context
                  - 0x1000188ec fcn 0x1000186b0 method.public.static.com.network.android.SmsReceiver.void_a_org.xmlpull.v1.XmlSerializer__java.io.StringWriter__android.content.Context
                - 0x10002fc8c fcn 0x10002fc84 method.public.final.com.network.android.monitor.observer.s.void_run
            - 0x10002811a fcn 0x100028064 method.public.static.com.network.android.j.boolean_a_android.telephony.TelephonyManager__android.content.Context__boolean__android.net.ConnectivityManager
            - 0x100028064 fcn 0x100028064 method.public.static.com.network.android.j.boolean_a_android.telephony.TelephonyManager__android.content.Context__boolean__android.net.ConnectivityManager
              - 0x10001eb52 fcn 0x10001eac4 method.public.final.com.network.android.agent.g.void_run
              - 0x100027f7a fcn 0x100027df0 method.public.static.com.network.android.j.boolean_a_android.content.Context__boolean__boolean
          - 0x10001c09c fcn 0x10001c074 method.private.static.com.network.android.a.c.void_g_android.content.Context
          - 0x10001c074 fcn 0x10001c074 method.private.static.com.network.android.a.c.void_g_android.content.Context
            - 0x100019eae fcn 0x100019e34 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__int__int
            - 0x100019e34 fcn 0x100019e34 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__int__int
              - 0x10001c440 fcn 0x10001c404 method.public.final.com.network.android.a.f.void_run
              - 0x10001c48a fcn 0x10001c404 method.public.final.com.network.android.a.f.void_run
              - 0x10001ea86 fcn 0x10001ea68 method.public.final.com.network.android.agent.f.void_run
            - 0x100019f70 fcn 0x100019ed8 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__String
            - 0x100019ed8 fcn 0x100019ed8 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__String
              - 0x10001c8d0 fcn 0x10001c7f8 method.public.final.com.network.android.a.k.void_onReceive_android.content.Context__android.content.Intent
            - 0x10001a1a2 fcn 0x100019f98 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__String__int
            - 0x100019f98 fcn 0x100019f98 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__String__int
              - 0x100019d90 fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
              - 0x100019de0 fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
              - 0x10001b088 fcn 0x10001b084 method.public.static.com.network.android.a.c.void_b_android.content.Context__int
              - 0x10001b084 fcn 0x10001b084 method.public.static.com.network.android.a.c.void_b_android.content.Context__int
                - 0x10001c2e2 fcn 0x10001c1c8 method.public.final.com.network.android.a.e.void_run
                - 0x10001c39e fcn 0x10001c1c8 method.public.final.com.network.android.a.e.void_run
                - 0x10001c41c fcn 0x10001c404 method.public.final.com.network.android.a.f.void_run
                - 0x10001c74c fcn 0x10001c6f0 method.public.final.com.network.android.a.j.void_run
              - 0x10001bf4a fcn 0x10001befc method.public.static.com.network.android.a.c.void_e_android.content.Context
              - 0x10001befc fcn 0x10001befc method.public.static.com.network.android.a.c.void_e_android.content.Context
                - 0x10001c9f4 fcn 0x10001c9f0 method.public.final.com.network.android.a.m.void_run
              - 0x10001c6ba fcn 0x10001c6ac method.public.final.com.network.android.a.i.void_run
          - 0x10001c962 fcn 0x10001c918 method.public.final.com.network.android.a.l.void_run
        - 0x10001c248 fcn 0x10001c1c8 method.public.final.com.network.android.a.e.void_run
        - 0x100028408 fcn 0x1000282fc method.public.static.com.network.android.j.void_b_android.content.Context
  - 0x10001a24e fcn 0x100019f98 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__String__int
EOF
RUN

NAME=Dalvik disassemble single opcode pdfj
FILE=malloc://32
CMDS=<<EOF
e asm.arch=dalvik
wx 0e00
af
pdfj
EOF
EXPECT=<<EOF
{"name":"fcn.00000000","size":2,"addr":0,"ops":[{"offset":0,"esil":"","refptr":false,"fcn_addr":0,"fcn_last":0,"size":2,"opcode":"return-void","disasm":"return-void","bytes":"0e00","family":"cpu","type":"ret","reloc":false,"type_num":5,"type2_num":0,"flags":["fcn.00000000"]}]}
EOF
RUN

NAME=Dalvik disassemble single opcode pdf
FILE=
CMDS=<<EOF
e asm.arch=dalvik
wx 0e00
af
pdf
EOF
EXPECT=<<EOF
/ fcn.00000000();
\           0x00000000      return-void
EOF
RUN

NAME=Dalvik packed-switch
FILE=bins/dex/SwitchOp.dex
CMDS=<<EOF
aa
e asm.comments=false
pd 23 @ method.static.SwitchOp.void_denseSwitch_int
EOF
EXPECT=<<EOF
            ;-- sym.SwitchOp.void_denseSwitch_int:
/ method.static.SwitchOp.void_denseSwitch_int();
|           0x1000001d0      move  v0, v3
|           0x1000001d2      move  v1, v0
|    ,,,,=< 0x1000001d4      packed-switch v1, 0x100000234
|    ||||   0x1000001da      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;
|    ||||   0x1000001de      const-string v2, str.dense_default
|    ||||   0x1000001e2      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
\ ...-----> 0x1000001e8      return-void
  :::`----> 0x1000001ea      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;
  ::: |||   0x1000001ee      const-string v2, str.one
  ::: |||   0x1000001f2      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
  ========< 0x1000001f8      goto  0x1000001e8
  ::: `---> 0x1000001fa      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;
  :::  ||   0x1000001fe      const-string v2, str.two
  :::  ||   0x100000202      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
  `=======< 0x100000208      goto  0x1000001e8
   ::  `--> 0x10000020a      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;
   ::   |   0x10000020e      const-string v2, str.three
   ::   |   0x100000212      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
   `======< 0x100000218      goto  0x1000001e8
    :   `-> 0x10000021a      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;
    :       0x10000021e      const-string v2, str.four
    :       0x100000222      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
    `=====< 0x100000228      goto  0x1000001e8
EOF
RUN

NAME=Dalvik sparse-switch
FILE=bins/dex/SwitchOp.dex
CMDS=<<EOF
aa
e asm.comments=false
pd 19 @ method.static.SwitchOp.void_sparseSwitch_int
EOF
EXPECT=<<EOF
            ;-- sym.SwitchOp.void_sparseSwitch_int:
/ method.static.SwitchOp.void_sparseSwitch_int();
|           0x1000002b8      move  v0, v3
|           0x1000002ba      move  v1, v0
|     ,,,=< 0x1000002bc      sparse-switch v1, 0x10000030c
|     |||   0x1000002c2      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;
|     |||   0x1000002c6      const-string v2, str.sparse_default
|     |||   0x1000002ca      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
\  ...----> 0x1000002d0      return-void
   :::`---> 0x1000002d2      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;
   ::: ||   0x1000002d6      const-string v2, str.ten
   ::: ||   0x1000002da      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
   `======< 0x1000002e0      goto  0x1000002d0
    :: `--> 0x1000002e2      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;
    ::  |   0x1000002e6      const-string v2, str.thousand
    ::  |   0x1000002ea      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
    `=====< 0x1000002f0      goto  0x1000002d0
     :  `-> 0x1000002f2      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;
     :      0x1000002f6      const-string v2, str.many
     :      0x1000002fa      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
     `====< 0x100000300      goto  0x1000002d0
EOF
RUN

NAME=Dalvik sparse-switch enable asm.middle
FILE=bins/dex/SwitchOp.dex
CMDS=<<EOF
aa
e asm.comments=false
e asm.middle=true
pd 19 @ method.static.SwitchOp.void_sparseSwitch_int
EOF
EXPECT=<<EOF
            ;-- sym.SwitchOp.void_sparseSwitch_int:
/ method.static.SwitchOp.void_sparseSwitch_int();
|           0x1000002b8      move  v0, v3
|           0x1000002ba      move  v1, v0
|     ,,,=< 0x1000002bc      sparse-switch v1, 0x10000030c
|     |||   0x1000002c2      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;
|     |||   0x1000002c6      const-string v2, str.sparse_default
|     |||   0x1000002ca      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
\  ...----> 0x1000002d0      return-void                                ; *middle* 1
   :::`---> 0x1000002d2      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;  ; *middle* 3
   ::: ||   0x1000002d6      const-string v2, str.ten                   ; *middle* 3
   ::: ||   0x1000002da      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V  ; *middle* 5
   `======< 0x1000002e0      goto  0x1000002d0                          ; *middle* 1
    :: `--> 0x1000002e2      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;  ; *middle* 3
    ::  |   0x1000002e6      const-string v2, str.thousand              ; *middle* 3
    ::  |   0x1000002ea      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V  ; *middle* 5
    `=====< 0x1000002f0      goto  0x1000002d0                          ; *middle* 1
     :  `-> 0x1000002f2      sget-object v1, Ljava/lang/System;->out Ljava/io/PrintStream;  ; *middle* 3
     :      0x1000002f6      const-string v2, str.many                  ; *middle* 3
     :      0x1000002fa      invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V  ; *middle* 5
     `====< 0x100000300      goto  0x1000002d0                          ; *middle* 1
EOF
RUN
