mutian@mutian:~/code/test$ cat HelloWorld.java
public class HelloWorld {
static public void main(String[] args) {
System.out.println("Hello world!");
}
}
mutian@mutian:~/code/test$ javac HelloWorld.java
mutian@mutian:~/code/test$ ls
HelloWorld.class HelloWorld.java
mutian@mutian:~/code/test$ dx --dex --output=HelloWorld.jar HelloWorld.class
mutian@mutian:~/code/test$ ls
HelloWorld.class HelloWorld.jar HelloWorld.java oatdump
mutian@mutian:~/code/test$ adb push HelloWorld.jar /data/user/
16 KB/s (752 bytes in 0.044s)
mutian@mutian:~/code/test$ adb shell
root@htc_a50cml_dtul:/ # cd /data/user/
root@htc_a50cml_dtul:/data/user # dalvikvm64 -cp HelloWorld.jar HelloWorld
Hello world!
mutian@mutian:~/code/E56MLDTUL_Stable/out/host/linux-x86/bin$ adb pull /data/dalvik-cache/arm64/data@user@HelloWorld.jar@classes.dex
161 KB/s (12968 bytes in 0.078s)
mutian@mutian:~/code/E56MLDTUL_Stable/out/host/linux-x86/bin$ ./oatdump --oat-file=data@user@HelloWorld.jar@classes.dex
MAGIC:
oat
064
CHECKSUM:
0xec3a08ad
INSTRUCTION SET:
Arm64
INSTRUCTION SET FEATURES:
smp,a53
DEX FILE COUNT:
1
EXECUTABLE OFFSET:
0x00001000
INTERPRETER TO INTERPRETER BRIDGE OFFSET:
0x00000000
INTERPRETER TO COMPILED CODE BRIDGE OFFSET:
0x00000000
JNI DLSYM LOOKUP OFFSET:
0x00000000
QUICK GENERIC JNI TRAMPOLINE OFFSET:
0x00000000
QUICK IMT CONFLICT TRAMPOLINE OFFSET:
0x00000000
QUICK RESOLUTION TRAMPOLINE OFFSET:
0x00000000
QUICK TO INTERPRETER BRIDGE OFFSET:
0x00000000
IMAGE PATCH DELTA:
0 (0x00000000)
IMAGE FILE LOCATION OAT CHECKSUM:
0x78f19603
IMAGE FILE LOCATION OAT BEGIN:
0x70e83000
KEY VALUE STORE:
classpath =
debuggable = false
dex2oat-cmdline = --runtime-arg -classpath --runtime-arg HelloWorld.jar --instruction-set=arm64 --instruction-set-features=smp,a53 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --dex-file=/data/user/HelloWorld.jar --oat-file=/data/dalvik-cache/arm64/data@user@HelloWorld.jar@classes.dex -j4
dex2oat-host = Arm
image-location = /data/dalvik-cache/arm64/system@framework@boot.art
pic = true
SIZE:
4356
OatDexFile:
location: /data/user/HelloWorld.jar
checksum: 0xcf2c0204
0: LHelloWorld; (offset=0x00000508) (type_idx=0) (StatusInitialized) (OatClassAllCompiled)
0: void HelloWorld.<init>() (dex_method_idx=0)
DEX CODE:
0x0000: 7010 0300 0000 | invoke-direct {v0}, void java.lang.Object.<init>() // method@3
0x0003: 0e00 | return-void
OatMethodOffsets (offset=0x0000050c)
code_offset: 0x0000101c
gc_map: (offset=0x00000000)
OatQuickMethodHeader (offset=0x00001000)
mapping_table: (offset=0x00000000)
vmap_table: (offset=0x00000514)
Optimized CodeInfo (size=18, number_of_dex_registers=1, number_of_stack_maps=0, has_inline_info=0, number_of_bytes_for_inline_info=0, number_of_bytes_for_dex_register_map=1, number_of_bytes_for_dex_pc=0, number_of_bytes_for_native_pc=0, number_of_bytes_for_register_mask=0)
DexRegisterLocationCatalog (number_of_entries=0, size_in_bytes=0)
QuickMethodFrameInfo
frame_size_in_bytes: 0
core_spill_mask: 0x40000000 (r30)
fp_spill_mask: 0x00000000
vr_stack_locations:
ins: v0[sp + #8]
method*: v1[sp + #0]
outs: v0[sp + #8]
CODE: (code_offset=0x0000101c size_offset=0x00001018 size=4)...
0x0000101c: d65f03c0 ret
1: void HelloWorld.main(java.lang.String[]) (dex_method_idx=1)
DEX CODE:
0x0000: 6200 0000 | sget-object v0, Ljava/io/PrintStream; java.lang.System.out // field@0
0x0002: 1a01 0100 | const-string v1, "Hello world!" // string@1
0x0004: 6e20 0200 1000 | invoke-virtual {v0, v1}, void java.io.PrintStream.println(java.lang.String) // method@2
0x0007: 0e00 | return-void
OatMethodOffsets (offset=0x00000510)
code_offset: 0x0000103c
gc_map: (offset=0x00000000)
OatQuickMethodHeader (offset=0x00001020)
mapping_table: (offset=0x00000000)
vmap_table: (offset=0x00000526)
Optimized CodeInfo (size=74, number_of_dex_registers=3, number_of_stack_maps=6, has_inline_info=0, number_of_bytes_for_inline_info=0, number_of_bytes_for_dex_register_map=1, number_of_bytes_for_dex_pc=1, number_of_bytes_for_native_pc=1, number_of_bytes_for_register_mask=3)
DexRegisterLocationCatalog (number_of_entries=6, size_in_bytes=6)
entry 0: in register (19)
entry 1: in register (2)
entry 2: in register (1)
entry 3: in register (21)
entry 4: in register (20)
entry 5: in stack (16)
StackMap 0 (dex_pc=0x0, native_pc_offset=0x8, dex_register_map_offset=0xffffffff, inline_info_offset=0xffffffff, register_mask=0x0, stack_mask=0b00000000)
StackMap 1 (dex_pc=0x4, native_pc_offset=0x64, dex_register_map_offset=0x0, inline_info_offset=0xffffffff, register_mask=0x0, stack_mask=0b00000000)
v0: in register (19) [entry 0]
v1: in register (2) [entry 1]
v2: in register (1) [entry 2]
StackMap 2 (dex_pc=0x4, native_pc_offset=0x70, dex_register_map_offset=0x3, inline_info_offset=0xffffffff, register_mask=0x380000, stack_mask=0b00000000)
v0: in register (19) [entry 0]
v1: in register (21) [entry 3]
v2: in register (20) [entry 4]
StackMap 3 (dex_pc=0x0, native_pc_offset=0x8c, dex_register_map_offset=0x6, inline_info_offset=0xffffffff, register_mask=0x0, stack_mask=0b00010000)
v2: in stack (16) [entry 5]
StackMap 4 (dex_pc=0x0, native_pc_offset=0xa4, dex_register_map_offset=0x6, inline_info_offset=0xffffffff, register_mask=0x0, stack_mask=0b00010000)
v2: in stack (16) [entry 5]
StackMap 5 (dex_pc=0x2, native_pc_offset=0xbc, dex_register_map_offset=0xffffffff, inline_info_offset=0xffffffff, register_mask=0x80000, stack_mask=0b00010000)
QuickMethodFrameInfo
frame_size_in_bytes: 80
core_spill_mask: 0x40380000 (r19, r20, r21, r30)
fp_spill_mask: 0x00000000
vr_stack_locations:
locals: v0[sp + #36] v1[sp + #40]
ins: v2[sp + #88]
method*: v3[sp + #0]
outs: v0[sp + #8] v1[sp + #12]
CODE: (code_offset=0x0000103c size_offset=0x00001038 size=200)...
0x0000103c: d1400bf0 sub x16, sp, #0x2000 (8192)
0x00001040: b940021f ldr wzr, [x16]
0x00001044: f81b0fe0 str x0, [sp, #-80]!
0x00001048: a90353f3 stp x19, x20, [sp, #48]
0x0000104c: a9047bf5 stp x21, lr, [sp, #64]
0x00001050: 79400250 ldrh w16, [tr] (state_and_flags)
0x00001054: 35000350 cbnz w16, #+0x68 (addr 0x10bc)
0x00001058: f94003e0 ldr x0, [sp]
0x0000105c: b9400800 ldr w0, [x0, #8]
0x00001060: b9401c00 ldr w0, [x0, #28]
0x00001064: 34000360 cbz w0, #+0x6c (addr 0x10d0)
0x00001068: 11021010 add w16, w0, #0x84 (132)
0x0000106c: 88dffe10 ldar w16, [x16]
0x00001070: 71002a1f cmp w16, #0xa (10)
0x00001074: 540002eb b.lt #+0x5c (addr 0x10d0)
0x00001078: b9430013 ldr w19, [x0, #768]
0x0000107c: f94003e2 ldr x2, [sp]
0x00001080: b9400042 ldr w2, [x2]
0x00001084: b9401442 ldr w2, [x2, #20]
0x00001088: b9401042 ldr w2, [x2, #16]
0x0000108c: 340002e2 cbz w2, #+0x5c (addr 0x10e8)
0x00001090: aa0103f4 mov x20, x1
0x00001094: aa1303e1 mov x1, x19
0x00001098: aa0203f5 mov x21, x2
0x0000109c: b9400020 ldr w0, [x1]
0x000010a0: f941f800 ldr x0, [x0, #1008]
0x000010a4: f940181e ldr lr, [x0, #48]
0x000010a8: d63f03c0 blr lr
0x000010ac: a94353f3 ldp x19, x20, [sp, #48]
0x000010b0: a9447bf5 ldp x21, lr, [sp, #64]
0x000010b4: 910143ff add sp, sp, #0x50 (80)
0x000010b8: d65f03c0 ret
0x000010bc: f9000be1 str x1, [sp, #16]
0x000010c0: f9422e5e ldr lr, [tr, #1112] (pInvokeVirtualTrampolineWithAccessCheck)
0x000010c4: d63f03c0 blr lr
0x000010c8: f9400be1 ldr x1, [sp, #16]
0x000010cc: 17ffffe3 b #-0x74 (addr 0x1058)
0x000010d0: f9000be1 str x1, [sp, #16]
0x000010d4: 52800080 mov w0, #0x4
0x000010d8: f941025e ldr lr, [tr, #512] (pCheckCast)
0x000010dc: d63f03c0 blr lr
0x000010e0: f9400be1 ldr x1, [sp, #16]
0x000010e4: 17ffffe5 b #-0x6c (addr 0x1078)
0x000010e8: f9000be1 str x1, [sp, #16]
0x000010ec: 52800020 mov w0, #0x1
0x000010f0: f9410e5e ldr lr, [tr, #536] (pInitializeType)
0x000010f4: d63f03c0 blr lr
0x000010f8: 2a0003e2 mov w2, w0
0x000010fc: f9400be1 ldr x1, [sp, #16]
0x00001100: 17ffffe4 b #-0x70 (addr 0x1090)