annotate paraspace/dexfile.py @ 8:59dd10bf60f2

Parse annotation items
author Thinker K.F. Li <thinker@codemud.net>
date Tue, 24 May 2011 14:55:18 +0800
parents 1d776ec496e5
children 9a49826b26d4
rev   line source
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1 class _DEX_header(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2 magic = None # 0x00, 8 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
3 checksum = None # 0x08, 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
4 signature = None # 0x0c, 20 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
5 fileSize = None # 0x20, 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
6 headerSize = None # 0x24
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
7 endianTag = None # 0x28
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
8 linkSize = None # 0x2c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
9 linkOff = None # 0x30
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
10 mapOff = None # 0x34
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
11 stringIdsSize = None # 0x38
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
12 stringIdsOff = None # 0x3c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
13 typeIdsSize = None # 0x40
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
14 typeIdsOff = None # 0x44
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
15 protoIdsSize = None # 0x48
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
16 protoIdsOff = None # 0x4c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
17 fieldIdsSize = None # 0x50
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
18 fieldIdsOff = None # 0x54
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
19 methodIdsSize = None # 0x58
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
20 methodIdsOff = None # 0x5c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
21 classDefsSize = None # 0x60
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
22 classDefsOff = None # 0x64
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
23 dataSize = None # 0x68
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
24 dataOff = None # 0x6c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
25
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
26 header_fields = \
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
27 'magic checksum signature fileSize headerSize endianTag ' \
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
28 'linkSize linkOff mapOff stringIdsSize stringIdsOff typeIdsSize ' \
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
29 'typeIdsOff protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
30 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
31 'dataSize dataOff'.split()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
32
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
33 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
34 self.magic = data[:8]
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
35 self.checksum = data[8: 0x0c]
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
36 self.signature = data[0x0c: 0x20]
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
37
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
38 idx = 0x20
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
39 fields = 'fileSize headerSize endianTag linkSize linkOff mapOff ' \
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
40 'stringIdsSize stringIdsOff typeIdsSize typeIdsOff ' \
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
41 'protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
42 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
43 'dataSize dataOff'.split()
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
44 for field in fields:
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
45 d = data[idx: idx + 4]
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
46 value = _to_uint(d)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
47 setattr(self, field, value)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
48 idx = idx + 4
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
49 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
50 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
51 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
52
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
53
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
54 class man_off(object):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
55 off = None
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
56
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
57 def __init__(self, off):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
58 self.off = off
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
59 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
60
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
61 def __call__(self, sz=0):
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
62 off = self.off
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
63 self.off = off + sz
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
64 return off
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
65 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
66
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
67
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
68 def _to_uint(data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
69 v = 0
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
70 sh = 0
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
71 for c in data:
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
72 v = v + (ord(c) << sh)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
73 sh = sh + 8
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
74 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
75 return v
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
76
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
77
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
78 def _to_int(data):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
79 v = _to_uint(data)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
80 sz = len(data)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
81 if sz and ((1 << (sz * 8 - 1)) & v):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
82 v = -((1 << (sz * 8)) - v)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
83 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
84 return v
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
85
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
86
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
87 def _uleb128(data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
88 sh = 0
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
89 v = 0
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
90 for c in data:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
91 cv = ord(c)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
92 v = v + ((cv & 0x7f) << sh)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
93 sh = sh + 7
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
94
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
95 if cv <= 0x7f:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
96 break
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
97 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
98
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
99 nbytes = sh / 7
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
100 return v, nbytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
101
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
102
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
103 def _leb128(data):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
104 v, sh = _uleb128(data)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
105 if v & (1 << (sh * 7 - 1)):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
106 v = -((1 << (sh * 7)) - v)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
107 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
108 return v, sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
109
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
110
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
111 class _DEX_MapItem(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
112 type = None # 2 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
113 unused = None # 2 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
114 size = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
115 offset = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
116
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
117 data_size = 12
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
118 types = {
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
119 0x0000: 'kDexTypeHeaderItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
120 0x0001: 'kDexTypeStringIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
121 0x0002: 'kDexTypeTypeIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
122 0x0003: 'kDexTypeProtoIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
123 0x0004: 'kDexTypeFieldIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
124 0x0005: 'kDexTypeMethodIdItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
125 0x0006: 'kDexTypeClassDefItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
126 0x1000: 'kDexTypeMapList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
127 0x1001: 'kDexTypeTypeList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
128 0x1002: 'kDexTypeAnnotationSetRefList',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
129 0x1003: 'kDexTypeAnnotationSetItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
130 0x2000: 'kDexTypeClassDataItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
131 0x2001: 'kDexTypeCodeItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
132 0x2002: 'kDexTypeStringDataItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
133 0x2003: 'kDexTypeDebugInfoItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
134 0x2004: 'kDexTypeAnnotationItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
135 0x2005: 'kDexTypeEncodedArrayItem',
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
136 0x2006: 'kDexTypeAnnotationsDirectoryItem'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
137 }
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
138
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
139 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
140 self.type = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
141 self.size = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
142 self.offset = _to_uint(data[8:12])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
143 pass
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
144
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
145 @classmethod
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
146 def find_type_name(self, type_name):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
147 type_value = [v
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
148 for v, name in _DEX_MapItem.types.items()
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
149 if name == type_name][0]
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
150 return type_value
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
151 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
152
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
153
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
154 class _DEX_TypeId(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
155 descriptorIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
156
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
157 data_size = 4
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
158
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
159 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
160 self.descriptorIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
161 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
162 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
163
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
164
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
165 class _DEX_ProtoId(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
166 shortyIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
167 returnTypeIdx = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
168 parametersOff = None # 4 bytes
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
169
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
170 data_size = 12
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
171
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
172 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
173 self.shortyIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
174 self.returnTypeIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
175 self.parametersOff = _to_uint(data[8:12])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
176 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
177 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
178
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
179
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
180 class _DEX_FieldId(object):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
181 classIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
182 typeIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
183 nameIdx = None # 4 bytes
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
184
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
185 data_size = 8
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
186
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
187 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
188 self.classIdx = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
189 self.typeIdx = _to_uint(data[2:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
190 self.nameIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
191 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
192 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
193
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
194
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
195 class _DEX_MethodId(object):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
196 classIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
197 protoIdx = None # 2 bytes
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
198 nameIdx = None # 4 bytes
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
199
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
200 data_size = 8
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
201
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
202 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
203 self.classIdx = _to_uint(data[:2])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
204 self.protoIdx = _to_uint(data[2:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
205 self.nameIdx = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
206 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
207 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
208
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
209
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
210 class _DEX_ClassDef(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
211 classIdx = None # 0x00
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
212 accessFlags = None # 0x04
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
213 superclassIdx = None # 0x08
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
214 interfacesOff = None # 0x0c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
215 sourceFileIdx = None # 0x10
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
216 annotationsOff = None # 0x14
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
217 classDataOff = None # 0x18
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
218 staticValuesOff = None # 0x1c
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
219
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
220 data_size = 0x20
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
221
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
222 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
223 self.classIdx = _to_uint(data[:4])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
224 self.accessFlags = _to_uint(data[4:8])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
225 self.superclassIdx = _to_uint(data[8:0xc])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
226 self.interfacesOff = _to_uint(data[0xc:0x10])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
227 self.sourceFileIdx = _to_uint(data[0x10:0x14])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
228 self.annotationsOff = _to_uint(data[0x14:0x18])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
229 self.classDataOff = _to_uint(data[0x18:0x1c])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
230 self.staticValuesOff = _to_uint(data[0x1c:0x20])
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
231 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
232 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
233
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
234
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
235 class _DEX_ClassDataHeader(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
236 staticFieldsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
237 instanceFieldsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
238 directMethodsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
239 virtualMethodsSize = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
240
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
241 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
242
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
243 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
244 self.staticFieldsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
245 sz = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
246 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
247 self.instanceFieldsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
248 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
249 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
250 self.directMethodsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
251 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
252 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
253 self.virtualMethodsSize, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
254 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
255
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
256 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
257 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
258 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
259
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
260
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
261 class _DEX_Field(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
262 fieldIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
263 accessFlags = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
264
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
265 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
266
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
267 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
268 self.fieldIdx, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
269 sz = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
270 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
271 self.accessFlags, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
272 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
273
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
274 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
275 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
276 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
277
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
278
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
279 class _DEX_Method(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
280 methodIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
281 accessFlags = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
282 codeOff = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
283
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
284 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
285
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
286 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
287 self.methodIdx, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
288 sz = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
289 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
290
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
291 self.accessFlags, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
292 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
293 off = off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
294
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
295 self.codeOff, sh = _uleb128(data[off:off + 10])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
296 sz = sz + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
297
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
298 self.data_size = sz
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
299 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
300 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
301
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
302 class _DEX_ClassData(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
303 header = None # DexClassDataHeader
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
304 staticFields = None # DexField*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
305 instanceFields = None # DexField*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
306 directMethods = None # DexMethod*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
307 virtualMethods = None # DexMethod*
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
308
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
309 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
310
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
311 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
312 header = _DEX_ClassDataHeader()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
313 header.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
314 self.header = header
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
315
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
316 cur_off = [off + header.data_size]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
317
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
318 def parse_field():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
319 field = _DEX_Field()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
320 off = cur_off[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
321 field.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
322 cur_off[0] = cur_off[0] + field.data_size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
323
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
324 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
325 # field index depends previous one to reduce size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
326 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
327 field.fieldIdx = field.fieldIdx + idx[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
328 idx[0] = field.fieldIdx
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
329
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
330 return field
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
331
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
332 def parse_method():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
333 method = _DEX_Method()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
334 off = cur_off[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
335 method.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
336 cur_off[0] = cur_off[0] + method.data_size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
337
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
338 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
339 # method index depends previous one to reduce size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
340 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
341 method.methodIdx = method.methodIdx + idx[0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
342 idx[0] = method.methodIdx
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
343
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
344 return method
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
345
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
346 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
347 self.staticFields = [parse_field()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
348 for i in range(header.staticFieldsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
349 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
350 self.instanceFields = [parse_field()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
351 for i in range(header.instanceFieldsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
352 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
353 self.directMethods = [parse_method()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
354 for i in range(header.directMethodsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
355 idx = [0]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
356 self.virtualMethods = [parse_method()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
357 for i in range(header.virtualMethodsSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
358
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
359 self.data_size = cur_off[0] - off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
360 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
361 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
362
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
363
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
364 class _DEX_TypeItem(object):
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
365 typeIdx = None # 2 bytes
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
366
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
367 data_size = 2
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
368
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
369 def parse(self, data, off):
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
370 self.typeIdx = _to_uint(data[off:off + 2])
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
371 pass
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
372 pass
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
373
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
374
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
375 class _DEX_TypeList(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
376 typeItems = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
377
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
378 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
379
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
380 def parse(self, data, off):
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
381 moff = man_off(off)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
382
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
383 size = _to_uint(data[moff(4):moff()])
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
384
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
385 def parse_type_item():
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
386 item = _DEX_TypeItem()
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
387 item.parse(data, moff())
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
388 moff(item.data_size)
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
389 return item
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
390
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
391 typeItems = [parse_type_item()
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
392 for i in range(size)]
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
393
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
394 self.typeItems = typeItems
6
917f0a9b9d06 Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents: 5
diff changeset
395 self.data_size = moff() - off
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
396 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
397 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
398
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
399
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
400 class _DEX_TypeLists(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
401 typeLists = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
402
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
403 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
404
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
405 def parse(self, num, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
406 def parse():
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
407 off = (cur_off[0] + 3) & ~0x3 # type list must aligned for 4 bytes
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
408 typeList = _DEX_TypeList()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
409 typeList.parse(data, off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
410 cur_off[0] = off + typeList.data_size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
411
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
412 return typeList
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
413
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
414 cur_off = [off]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
415 typeLists = [parse() for i in range(num)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
416
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
417 self.typeLists = typeLists
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
418 self.data_size = cur_off[0] - off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
419 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
420 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
421
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
422
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
423 class _DEX_Try(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
424 startAddr = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
425 insnCount = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
426 handlerOff = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
427
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
428 data_size = 8
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
429
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
430 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
431 cur_off = off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
432 self.startAddr = _to_uint(data[cur_off:cur_off + 4])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
433 cur_off = cur_off + 4
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
434 self.insnCount = _to_uint(data[cur_off:cur_off + 2])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
435 cur_off = cur_off + 2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
436 self.handlerOff = _to_uint(data[cur_off:cur_off + 2])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
437 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
438 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
439
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
440
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
441 class _DEX_CatchHandler(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
442 typeIdx = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
443 address = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
444
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
445 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
446
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
447 def parse(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
448 cur_off = off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
449 self.typeIdx, sh = _uleb128(data[cur_off:cur_off + 5])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
450 cur_off = cur_off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
451 self.address, sh = _uleb128(data[cur_off:cur_off + 5])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
452 cur_off = cur_off + sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
453
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
454 self.data_size = cur_off - off
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
455 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
456
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
457 def parse1(self, data, off):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
458 self.address, sh = _uleb128(data[off:off + 5])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
459
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
460 self.data_size = sh
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
461 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
462 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
463
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
464
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
465 class _DEX_Catch(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
466 catchesAll = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
467 handlers = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
468
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
469 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
470
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
471 def parse(self, data, off):
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
472 moff = man_off(off)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
473
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
474 count, sh = _leb128(data[moff():moff() + 5])
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
475 moff(sh)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
476
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
477 if count > 0:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
478 self.catchesAll = False
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
479 else:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
480 self.catchesAll = True
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
481 count = -count
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
482 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
483
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
484 def parse_handler():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
485 handler = _DEX_CatchHandler()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
486 handler.parse(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
487 moff(handler.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
488 return handler
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
489
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
490 self.handlers = [parse_handler() for i in range(count)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
491
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
492 if self.catchesAll:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
493 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
494 # Additional handler for catching all
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
495 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
496 handler = _DEX_CatchHandler()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
497 handler.parse1(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
498 moff(handler.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
499 self.handlers.append(handler)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
500 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
501
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
502 self.data_size = moff() - off
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
503 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
504 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
505
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
506
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
507 class _DEX_Code(object):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
508 registersSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
509 insSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
510 outsSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
511 triesSize = None # 2 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
512 debugInfoOff = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
513 insnsSize = None # 4 bytes
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
514 insns = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
515 try_items = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
516 catch_handler_items = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
517
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
518 data_size = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
519
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
520 def parse(self, data, off):
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
521 moff = man_off(off)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
522
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
523 self.registersSize = _to_uint(data[moff(2):moff()])
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
524 self.insSize = _to_uint(data[moff(2):moff()])
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
525 self.outsSize = _to_uint(data[moff(2):moff()])
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
526 self.triesSize = _to_uint(data[moff(2):moff()])
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
527 self.debugInfoOff = _to_uint(data[moff(4):moff()])
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
528 self.insnsSize = _to_uint(data[moff(4):moff()])
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
529
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
530 moff(self.insnsSize * 2) # skip insns
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
531
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
532 if self.triesSize > 0:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
533 def parse_try_item():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
534 try_item = _DEX_Try()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
535 try_item.parse(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
536 moff(try_item.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
537 return try_item
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
538
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
539 moff.off = (moff.off + 3) & ~0x3 # align tries to 4 bytes
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
540 self.try_items = [parse_try_item() for i in range(self.triesSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
541
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
542 def parse_catch_handler():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
543 catch = _DEX_Catch()
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
544 catch.parse(data, moff())
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
545 moff(catch.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
546 return catch
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
547
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
548 #
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
549 # No tries, no catch handlers
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
550 #
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
551 handlersSize, sh = _uleb128(data[moff():moff() + 5])
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
552 moff(sh)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
553 self.catch_handler_items = [parse_catch_handler()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
554 for i in range(handlersSize)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
555 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
556
5
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
557 moff.off = (moff() + 3) & ~0x3 # round code item to 4 bytes
97b7006ced5f Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents: 4
diff changeset
558 self.data_size = moff() - off
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
559 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
560 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
561
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
562
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
563 ## \brief File offset to Annotation item.
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
564 #
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
565 # This type is not in libdex of Dalvik. We add this class to tracking
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
566 # information for layout algorithm.
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
567 #
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
568 class _DEX_AnnotationRefItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
569 annotationOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
570
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
571 data_size = 4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
572
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
573 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
574 self.annotationOff = _to_uint(data[off:off + 4])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
575 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
576 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
577
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
578 class _DEX_AnnotationSetItem(object):
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
579 # size = None # 4 bytes
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
580 annotations = None # 4 * size bytes
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
581
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
582 data_size = None
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
583
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
584 def parse(self, data, off):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
585 moff = man_off(off)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
586
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
587 size = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
588
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
589 def parse_annotation_ref():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
590 ref = _DEX_AnnotationRefItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
591 ref.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
592 moff(ref.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
593 return ref
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
594
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
595 self.annotations = [parse_annotation_ref()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
596 for i in range(size)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
597
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
598 self.data_size = moff() - off
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
599 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
600 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
601
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
602
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
603 class _DEX_FieldAnnotationsItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
604 fieldIdx = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
605 annotationsOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
606
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
607 data_size = 8
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
608
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
609 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
610 moff = man_off(off)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
611
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
612 self.fieldIdx = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
613 self.annotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
614 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
615 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
616
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
617
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
618 class _DEX_MethodAnnotationsItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
619 methodIdx = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
620 annotationsOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
621
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
622 data_size = 8
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
623
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
624 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
625 moff = man_off(off)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
626
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
627 self.methodIdx = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
628 self.annotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
629 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
630 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
631
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
632
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
633 class _DEX_ParameterAnnotationsItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
634 methodIdx = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
635 annotationsOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
636
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
637 data_size = 8
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
638
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
639 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
640 moff = man_off(off)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
641
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
642 self.methodIdx = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
643 self.annotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
644 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
645 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
646
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
647
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
648 class _DEX_AnnotationsDirectoryItem(object):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
649 classAnnotationsOff = None # 4 bytes
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
650 fieldAnnotationsItems = None
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
651 methodAnnotationsItems = None
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
652 parameterAnnotationsItems = None
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
653
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
654 data_size = None
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
655
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
656 def parse(self, data, off):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
657 moff = man_off(off)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
658
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
659 self.classAnnotationsOff = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
660 fieldsSize = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
661 methodsSize = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
662 parametersSize = _to_uint(data[moff(4):moff()])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
663
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
664 def parse_fieldAnnotationsItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
665 item = _DEX_FieldAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
666 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
667 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
668 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
669
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
670 def parse_methodAnnotationsItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
671 item = _DEX_MethodAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
672 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
673 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
674 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
675
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
676 def parse_parameterAnnotationsItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
677 item = _DEX_ParameterAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
678 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
679 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
680 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
681
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
682 self.fieldAnnotationsItems = [parse_fieldAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
683 for i in range(fieldsSize)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
684 self.methodAnnotationsItems = [parse_methodAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
685 for i in range(methodsSize)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
686 self.parameterAnnotationsItems = [parse_parameterAnnotationsItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
687 for i in range(parametersSize)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
688
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
689 self.data_size = moff() - off
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
690 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
691 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
692
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
693
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
694 ##
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
695 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
696 # \see createAnnotationMember() in dalvik/vm/reflect/Annotation.c
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
697 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
698 class _DEX_AnnotationMember(object):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
699 nameIdx = None # optional
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
700 valueType = None # 1 byte
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
701 value = None
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
702
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
703 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
704 # Constants from DexFile.h
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
705 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
706 kDexAnnotationByte = 0x00
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
707 kDexAnnotationShort = 0x02
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
708 kDexAnnotationChar = 0x03
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
709 kDexAnnotationInt = 0x04
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
710 kDexAnnotationLong = 0x06
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
711 kDexAnnotationFloat = 0x10
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
712 kDexAnnotationDouble = 0x11
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
713 kDexAnnotationString = 0x17
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
714 kDexAnnotationType = 0x18
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
715 kDexAnnotationField = 0x19
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
716 kDexAnnotationMethod = 0x1a
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
717 kDexAnnotationEnum = 0x1b
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
718 kDexAnnotationArray = 0x1c
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
719 kDexAnnotationAnnotation = 0x1d
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
720 kDexAnnotationNull = 0x1e
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
721 kDexAnnotationBoolean = 0x1f
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
722
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
723 kDexAnnotationValueTypeMask = 0x1f
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
724 kDexAnnotationValueArgShift = 5
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
725
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
726 data_size = None
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
727
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
728 def parse(self, data, off):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
729 self.nameIdx, sh = _uleb128(data[off:off + 5])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
730
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
731 self.parse_noname(data, off + sh)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
732
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
733 self.data_size = self.data_size + sh
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
734 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
735
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
736 def parse_noname(self, data, off):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
737 moff = man_off(off)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
738
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
739 valueType = _to_uint(data[moff(1):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
740 self.valueType = valueType
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
741 width = valueType >> self.kDexAnnotationValueArgShift
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
742
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
743 vtype = valueType & self.kDexAnnotationValueTypeMask
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
744
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
745 if vtype == self.kDexAnnotationByte:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
746 self.value = _to_int(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
747 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
748 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
749 elif vtype == self.kDexAnnotationShort:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
750 self.value = _to_int(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
751 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
752 elif vtype == self.kDexAnnotationChar:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
753 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
754 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
755 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
756 elif vtype == self.kDexAnnotationInt:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
757 self.value = _to_int(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
758 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
759 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
760 elif vtype == self.kDexAnnotationLong:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
761 self.value = _to_int(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
762 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
763 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
764 elif vtype == self.kDexAnnotationFloat:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
765 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
766 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
767 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
768 elif vtype == self.kDexAnnotationDouble:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
769 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
770 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
771 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
772 elif vtype == self.kDexAnnotationBoolean:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
773 self.value = width != 0
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
774 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
775 elif vtype == self.kDexAnnotationString: # string index
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
776 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
777 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
778 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
779 elif vtype == self.kDexAnnotationType: # TypeId index
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
780 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
781 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
782 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
783 elif vtype == self.kDexAnnotationMethod: # MethodId index
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
784 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
785 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
786 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
787 elif vtype == self.kDexAnnotationField:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
788 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
789 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
790 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
791 elif vtype == self.kDexAnnotationEnum: # FieldId index
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
792 self.value = _to_uint(data[moff(width):moff()])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
793 moff(1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
794 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
795 elif vtype == self.kDexAnnotationArray:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
796 size, sh = _uleb128(data[moff():moff() + 5])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
797 moff(sh)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
798
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
799 def parse_array_elm():
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
800 elm = _DEX_AnnotationMember()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
801 elm.parse_noname(data, moff())
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
802 moff(elm.data_size)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
803 return elm
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
804
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
805 self.value = [parse_array_elm()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
806 for i in range(size)]
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
807 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
808 elif vtype == self.kDexAnnotationAnnotation:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
809 annoitem = _DEX_AnnotationItem()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
810 annoitem.parse_novisibility(data, moff())
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
811 moff(annoitem.data_size)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
812 self.value = annoitem
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
813 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
814 elif vtype == self.kDexAnnotationNull:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
815 self.value = 0
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
816 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
817 else:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
818 raise ValueError, \
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
819 'Bad annotation element value byte 0x02x' % (valueType)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
820
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
821 self.data_size = moff() - off
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
822 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
823 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
824
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
825
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
826 ## \brief Annotation item
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
827 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
828 # \see processEncodedAnnotation() in dalvik/vm/reflect/Annotation.c
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
829 #
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
830 class _DEX_AnnotationItem(object):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
831 visibility = None # 1 byte (optional)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
832 typeIdx = None
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
833 members = None
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
834
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
835 kDexVisibilityBuild = 0x00
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
836 kDexVisibilityRuntime = 0x01
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
837 kDexVisibilitySystem = 0x02
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
838
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
839 data_size = None
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
840
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
841 def parse(self, data, off):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
842 self.visibility = _to_uint(data[off:off + 1])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
843
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
844 self.parse_novisibility(data, off + 1)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
845
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
846 self.data_size = self.data_size + 1
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
847 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
848
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
849 def parse_novisibility(self, data, off):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
850 moff = man_off(off)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
851
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
852 self.typeIdx, sh = _uleb128(data[moff():moff() + 5])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
853 moff(sh)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
854 size, sh = _uleb128(data[moff():moff() + 5])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
855 moff(sh)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
856
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
857 def parse_AnnotationMemmber():
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
858 member = _DEX_AnnotationMember()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
859 member.parse(data, moff())
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
860 moff(member.data_size)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
861 return member
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
862
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
863 self.members = [parse_AnnotationMemmber()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
864 for i in range(size)]
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
865
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
866 self.data_size = moff() - off
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
867 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
868 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
869
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
870
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
871 class DEXFile(object):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
872 _data = None
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
873 _header = None
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
874 _maps = None
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
875 _strings = None
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
876 _typeIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
877 _protoIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
878 _fieldIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
879 _methodIds = None
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
880 _classDefs = None
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
881 _classDatas = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
882 _typeLists = None
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
883 _codeItems = None
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
884 _annotationSetItems = None
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
885 _annotationsDirectoryItems = None
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
886 _annotationItems = None
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
887
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
888 def __init__(self):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
889 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
890
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
891 def open(self, filename):
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
892 fo = file(filename, 'r')
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
893 data = fo.read()
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
894
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
895 self.parse(data)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
896 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
897
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
898 def _parse_maps(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
899 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
900 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
901 off = header.mapOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
902
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
903 num = _to_uint(data[off:off + 4])
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
904 off = off + 4
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
905
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
906 maps = []
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
907 for i in range(num):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
908 item_data = data[off:off + _DEX_MapItem.data_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
909 item = _DEX_MapItem()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
910 item.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
911 maps.append(item)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
912 off = off + _DEX_MapItem.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
913 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
914
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
915 self._maps = maps
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
916 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
917
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
918 def find_map_item(self, type_value):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
919 maps = self._maps
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
920 try:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
921 codeItem_map = [map for map in maps if map.type == type_value][0]
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
922 except IndexError:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
923 return None
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
924
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
925 return codeItem_map
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
926
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
927 def find_map_item_name(self, type_name):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
928 type_value = _DEX_MapItem.find_type_name(type_name)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
929 map = self.find_map_item(type_value)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
930 return map
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
931
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
932 def _parse_strings(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
933 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
934 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
935 strings = []
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
936
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
937 num = header.stringIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
938 off = header.stringIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
939 for i in range(num):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
940 str_start_off = _to_uint(data[off:off + 4])
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
941 str_stop_off = data.index('\x00', str_start_off)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
942 string = data[str_start_off:str_stop_off]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
943
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
944 sz, sh = _uleb128(string)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
945 string = string[sh:]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
946 strings.append(string)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
947 off = off + 4
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
948 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
949
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
950 self._strings = strings
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
951 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
952
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
953 def _parse_typeIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
954 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
955 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
956
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
957 num = header.typeIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
958 off = header.typeIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
959
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
960 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
961 type_id = _DEX_TypeId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
962 type_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
963 return type_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
964
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
965 item_size = _DEX_TypeId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
966 item_offs = range(off, off + item_size * num, item_size)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
967 item_datas = [data[item_off:item_off + item_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
968 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
969 typeIds = [parse(item_data) for item_data in item_datas]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
970
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
971 self._typeIds = typeIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
972 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
973
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
974 def _parse_protoIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
975 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
976 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
977
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
978 num = header.protoIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
979 off = header.protoIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
980
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
981 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
982 proto_id = _DEX_ProtoId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
983 proto_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
984 return proto_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
985
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
986 item_size = _DEX_ProtoId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
987 item_offs = range(off, off + item_size * num, item_size)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
988 item_datas = [data[item_off:item_off + item_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
989 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
990 protoIds = [parse(item_data) for item_data in item_datas]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
991
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
992 self._protoIds = protoIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
993 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
994
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
995 def _parse_fieldIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
996 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
997 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
998
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
999 num = header.fieldIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1000 off = header.fieldIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1001
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1002 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1003 field_id = _DEX_FieldId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1004 field_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1005 return field_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1006
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1007 item_size = _DEX_FieldId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1008 item_offs = range(off, off + item_size * num, item_size)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1009 item_datas = [data[item_off:item_off + item_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1010 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1011 fieldIds = [parse(item_data) for item_data in item_datas]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1012
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1013 self._fieldIds = fieldIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1014 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1015
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1016 def _parse_methodIds(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1017 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1018 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1019
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1020 num = header.methodIdsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1021 off = header.methodIdsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1022
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1023 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1024 method_id = _DEX_MethodId()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1025 method_id.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1026 return method_id
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1027
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1028 item_size = _DEX_MethodId.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1029 item_offs = range(off, off + item_size * num, item_size)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1030 item_datas = [data[item_off:item_off + item_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1031 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1032 methodIds = [parse(item_data) for item_data in item_datas]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1033
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1034 self._methodIds = methodIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1035 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1036
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1037 def _parse_classDefs(self):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1038 data = self._data
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1039 header = self._header
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1040
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1041 num = header.classDefsSize
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1042 off = header.classDefsOff
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1043
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1044 def parse(item_data):
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1045 class_def = _DEX_ClassDef()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1046 class_def.parse(item_data)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1047 return class_def
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1048
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1049 item_size = _DEX_ClassDef.data_size
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1050 item_offs = range(off, off + item_size * num, item_size)
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1051 item_datas = [data[item_off:item_off + item_size]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1052 for item_off in item_offs]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1053 classDefs = [parse(item_data) for item_data in item_datas]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1054
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1055 self._classDefs = classDefs
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1056 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1057
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1058 def _parse_classDatas(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1059 header = self._header
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1060 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1061
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1062 class_data_map = self.find_map_item_name('kDexTypeClassDataItem')
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1063
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1064 moff = man_off(class_data_map.offset)
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1065
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1066 def parse_class_data():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1067 class_data = _DEX_ClassData()
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1068 class_data.parse(data, moff())
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1069 moff(class_data.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1070 return class_data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1071 class_datas = [parse_class_data() for i in range(class_data_map.size)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1072
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1073 self._classDatas = class_datas
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1074 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1075
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1076 def _parse_typeLists(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1077 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1078
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1079 typeList_map = self.find_map_item_name('kDexTypeTypeList')
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1080 num_typeLists = typeList_map.size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1081
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1082 typeLists = _DEX_TypeLists()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1083 typeLists.parse(num_typeLists, data, typeList_map.offset)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1084
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1085 self._typeLists = typeLists
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1086 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1087
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1088 def _parse_codeItems(self):
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1089 data = self._data
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1090
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1091 codeItem_map = self.find_map_item_name('kDexTypeCodeItem')
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1092 if codeItem_map is None:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1093 return
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1094 num_codeItems = codeItem_map.size
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1095
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1096 moff = man_off(codeItem_map.offset)
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1097
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1098 def parse_code():
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1099 code = _DEX_Code()
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1100 code.parse(data, moff())
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1101 moff(code.data_size)
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1102 return code
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1103
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1104 codeItems = [parse_code() for i in range(num_codeItems)]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1105
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1106 self._codeItems = codeItems
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1107 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1108
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1109 def _parse_annotationSetItems(self):
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1110 data = self._data
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1111
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1112 annoset_map = self.find_map_item_name('kDexTypeAnnotationSetItem')
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1113 if annoset_map is None:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1114 return
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1115
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1116 moff = man_off(annoset_map.offset)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1117
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1118 def parse_annotationSetItem():
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1119 item = _DEX_AnnotationSetItem()
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1120 item.parse(data, moff())
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1121 moff(item.data_size)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1122 return item
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1123
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1124 self._annotationSetItems = [parse_annotationSetItem()
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1125 for i in range(annoset_map.size)]
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1126 pass
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1127
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1128 def _parse_annotationsDirectoryItems(self):
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1129 data = self._data
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1130
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1131 annodir_map = \
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1132 self.find_map_item_name('kDexTypeAnnotationsDirectoryItem')
7
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1133 if annodir_map is None:
1d776ec496e5 Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents: 6
diff changeset
1134 return
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1135
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1136 moff = man_off(annodir_map.offset)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1137
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1138 def parse_annotationDirItem():
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1139 item = _DEX_AnnotationsDirectoryItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1140 item.parse(data, moff())
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1141 moff(item.data_size)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1142 return item
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1143
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1144 self._annotationsDirectoryItems = [parse_annotationDirItem()
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1145 for i in range(annodir_map.size)]
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1146 pass
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1147
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1148 def _parse_annotationItems(self):
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1149 data = self._data
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1150
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1151 annoitem_map = self.find_map_item_name('kDexTypeAnnotationItem')
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1152 if annoitem_map is None:
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1153 return
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1154
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1155 moff = man_off(annoitem_map.offset)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1156
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1157 def parse_annotationItem():
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1158 item = _DEX_AnnotationItem()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1159 item.parse(data, moff())
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1160 moff(item.data_size)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1161 return item
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1162
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1163 self._annotationItems = [parse_annotationItem()
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1164 for i in range(annoitem_map.size)]
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1165 pass
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1166
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1167 def parse(self, data):
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1168 self._data = data
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1169 header = _DEX_header()
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1170 header.parse(data)
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1171 self._header = header
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1172
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1173 self._parse_maps()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1174 self._parse_strings()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1175 self._parse_typeIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1176 self._parse_protoIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1177 self._parse_fieldIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1178 self._parse_methodIds()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1179 self._parse_classDefs()
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1180 self._parse_classDatas()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1181 self._parse_typeLists()
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1182 self._parse_codeItems()
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1183 self._parse_annotationSetItems()
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1184 self._parse_annotationsDirectoryItems()
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1185 self._parse_annotationItems()
0
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1186 pass
31050a971b52 Project ParaSpace
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1187 pass
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1188
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1189 if __name__ == '__main__':
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1190 dex = DEXFile()
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1191 dex.open('test.dex')
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1192
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1193 print 'Header'
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1194 h = dex._header
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1195 for attr in h.header_fields:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1196 print '\t%s: %s' % (attr, repr(getattr(h, attr)))
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1197 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1198
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1199 print
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1200 print 'Define Classes'
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1201 strings = dex._strings
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1202 classDefs = dex._classDefs
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1203 typeIds = dex._typeIds
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1204 for classDef in classDefs:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1205 typeId = typeIds[classDef.classIdx]
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1206 descriptor = strings[typeId.descriptorIdx]
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1207 data_off = classDef.classDataOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1208 print '\t%s @0x%x' % (descriptor, data_off)
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1209 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1210
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1211 print
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1212 print 'Reference Classes'
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1213 for typeId in typeIds:
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1214 descriptor = strings[typeId.descriptorIdx]
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1215 print '\t%s' % (descriptor)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1216 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1217
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1218 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1219 print 'Class data'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1220 methodIds = dex._methodIds
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1221 classDatas = dex._classDatas
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1222 for classData in classDatas:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1223 print '\tclass'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1224 for method in classData.directMethods:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1225 code_off = method.codeOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1226 methodId = methodIds[method.methodIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1227 name = strings[methodId.nameIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1228 print '\t\t%s@0x%x' % (name, code_off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1229 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1230 for method in classData.virtualMethods:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1231 code_off = method.codeOff
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1232 methodId = methodIds[method.methodIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1233 name = strings[methodId.nameIdx]
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1234 print '\t\t%s@0x%x' % (name, code_off)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1235 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1236 pass
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1237
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1238 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1239 print 'TypeLists size is %d bytes' % (dex._typeLists.data_size)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1240
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1241 bytes = sum([code.data_size for code in dex._codeItems])
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1242 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1243 print 'CodeItems size is %d bytes' % (bytes)
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1244
3
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1245 bytes = sum([annoset.data_size for annoset in dex._annotationSetItems])
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1246 print
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1247 print 'AnnotationSetItems size is %d bytes' % (bytes)
a78db169b0c8 parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents: 2
diff changeset
1248
4
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1249 bytes = sum([annodir.data_size
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1250 for annodir in dex._annotationsDirectoryItems])
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1251 print
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1252 print 'AnnotationsDirtoryItems size is %d bytes' % (bytes)
b0766f1984bb parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents: 3
diff changeset
1253
8
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1254 bytes = sum([annoitem.data_size
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1255 for annoitem in dex._annotationItems])
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1256 print
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1257 print 'AnnotationItems size is %d bytes' % (bytes)
59dd10bf60f2 Parse annotation items
Thinker K.F. Li <thinker@codemud.net>
parents: 7
diff changeset
1258
2
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1259 print
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1260 print 'Data maps'
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1261 maps = dex._maps
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1262 for map in maps:
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1263 print '\t0x%04x(%s) size=%d offset=0x%08x' % (map.type,
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1264 map.types[map.type],
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1265 map.size,
add64d56b0e2 Parse code items
Thinker K.F. Li <thinker@codemud.net>
parents: 1
diff changeset
1266 map.offset)
1
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1267 pass
05346b632adb Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents: 0
diff changeset
1268 pass