• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ART_RUNTIME_DEX_FILE_H_
18 #define ART_RUNTIME_DEX_FILE_H_
19 
20 #include <memory>
21 #include <string>
22 #include <unordered_map>
23 #include <vector>
24 
25 #include "base/logging.h"
26 #include "base/mutex.h"  // For Locks::mutator_lock_.
27 #include "base/value_object.h"
28 #include "globals.h"
29 #include "invoke_type.h"
30 #include "jni.h"
31 #include "jvalue.h"
32 #include "mirror/object_array.h"
33 #include "modifiers.h"
34 #include "utf.h"
35 
36 namespace art {
37 
38 // TODO: remove dependencies on mirror classes, primarily by moving
39 // EncodedStaticFieldValueIterator to its own file.
40 namespace mirror {
41   class ClassLoader;
42   class DexCache;
43 }  // namespace mirror
44 class ArtField;
45 class ArtMethod;
46 class ClassLinker;
47 template <class Key, class Value, class EmptyFn, class HashFn, class Pred, class Alloc>
48 class HashMap;
49 class MemMap;
50 class OatDexFile;
51 class Signature;
52 template<class T> class Handle;
53 class StringPiece;
54 class TypeLookupTable;
55 class ZipArchive;
56 
57 // TODO: move all of the macro functionality into the DexCache class.
58 class DexFile {
59  public:
60   // First Dex format version supporting default methods.
61   static const uint32_t kDefaultMethodsVersion = 37;
62   // First Dex format version enforcing class definition ordering rules.
63   static const uint32_t kClassDefinitionOrderEnforcedVersion = 37;
64 
65   static const uint8_t kDexMagic[];
66   static constexpr size_t kNumDexVersions = 2;
67   static constexpr size_t kDexVersionLen = 4;
68   static const uint8_t kDexMagicVersions[kNumDexVersions][kDexVersionLen];
69 
70   static constexpr size_t kSha1DigestSize = 20;
71   static constexpr uint32_t kDexEndianConstant = 0x12345678;
72 
73   // name of the DexFile entry within a zip archive
74   static const char* kClassesDex;
75 
76   // The value of an invalid index.
77   static const uint32_t kDexNoIndex = 0xFFFFFFFF;
78 
79   // The value of an invalid index.
80   static const uint16_t kDexNoIndex16 = 0xFFFF;
81 
82   // The separator character in MultiDex locations.
83   static constexpr char kMultiDexSeparator = ':';
84 
85   // A string version of the previous. This is a define so that we can merge string literals in the
86   // preprocessor.
87   #define kMultiDexSeparatorString ":"
88 
89   // Raw header_item.
90   struct Header {
91     uint8_t magic_[8];
92     uint32_t checksum_;  // See also location_checksum_
93     uint8_t signature_[kSha1DigestSize];
94     uint32_t file_size_;  // size of entire file
95     uint32_t header_size_;  // offset to start of next section
96     uint32_t endian_tag_;
97     uint32_t link_size_;  // unused
98     uint32_t link_off_;  // unused
99     uint32_t map_off_;  // unused
100     uint32_t string_ids_size_;  // number of StringIds
101     uint32_t string_ids_off_;  // file offset of StringIds array
102     uint32_t type_ids_size_;  // number of TypeIds, we don't support more than 65535
103     uint32_t type_ids_off_;  // file offset of TypeIds array
104     uint32_t proto_ids_size_;  // number of ProtoIds, we don't support more than 65535
105     uint32_t proto_ids_off_;  // file offset of ProtoIds array
106     uint32_t field_ids_size_;  // number of FieldIds
107     uint32_t field_ids_off_;  // file offset of FieldIds array
108     uint32_t method_ids_size_;  // number of MethodIds
109     uint32_t method_ids_off_;  // file offset of MethodIds array
110     uint32_t class_defs_size_;  // number of ClassDefs
111     uint32_t class_defs_off_;  // file offset of ClassDef array
112     uint32_t data_size_;  // unused
113     uint32_t data_off_;  // unused
114 
115     // Decode the dex magic version
116     uint32_t GetVersion() const;
117 
118    private:
119     DISALLOW_COPY_AND_ASSIGN(Header);
120   };
121 
122   // Map item type codes.
123   enum {
124     kDexTypeHeaderItem               = 0x0000,
125     kDexTypeStringIdItem             = 0x0001,
126     kDexTypeTypeIdItem               = 0x0002,
127     kDexTypeProtoIdItem              = 0x0003,
128     kDexTypeFieldIdItem              = 0x0004,
129     kDexTypeMethodIdItem             = 0x0005,
130     kDexTypeClassDefItem             = 0x0006,
131     kDexTypeMapList                  = 0x1000,
132     kDexTypeTypeList                 = 0x1001,
133     kDexTypeAnnotationSetRefList     = 0x1002,
134     kDexTypeAnnotationSetItem        = 0x1003,
135     kDexTypeClassDataItem            = 0x2000,
136     kDexTypeCodeItem                 = 0x2001,
137     kDexTypeStringDataItem           = 0x2002,
138     kDexTypeDebugInfoItem            = 0x2003,
139     kDexTypeAnnotationItem           = 0x2004,
140     kDexTypeEncodedArrayItem         = 0x2005,
141     kDexTypeAnnotationsDirectoryItem = 0x2006,
142   };
143 
144   struct MapItem {
145     uint16_t type_;
146     uint16_t unused_;
147     uint32_t size_;
148     uint32_t offset_;
149 
150    private:
151     DISALLOW_COPY_AND_ASSIGN(MapItem);
152   };
153 
154   struct MapList {
155     uint32_t size_;
156     MapItem list_[1];
157 
158    private:
159     DISALLOW_COPY_AND_ASSIGN(MapList);
160   };
161 
162   // Raw string_id_item.
163   struct StringId {
164     uint32_t string_data_off_;  // offset in bytes from the base address
165 
166    private:
167     DISALLOW_COPY_AND_ASSIGN(StringId);
168   };
169 
170   // Raw type_id_item.
171   struct TypeId {
172     uint32_t descriptor_idx_;  // index into string_ids
173 
174    private:
175     DISALLOW_COPY_AND_ASSIGN(TypeId);
176   };
177 
178   // Raw field_id_item.
179   struct FieldId {
180     uint16_t class_idx_;  // index into type_ids_ array for defining class
181     uint16_t type_idx_;  // index into type_ids_ array for field type
182     uint32_t name_idx_;  // index into string_ids_ array for field name
183 
184    private:
185     DISALLOW_COPY_AND_ASSIGN(FieldId);
186   };
187 
188   // Raw method_id_item.
189   struct MethodId {
190     uint16_t class_idx_;  // index into type_ids_ array for defining class
191     uint16_t proto_idx_;  // index into proto_ids_ array for method prototype
192     uint32_t name_idx_;  // index into string_ids_ array for method name
193 
194    private:
195     DISALLOW_COPY_AND_ASSIGN(MethodId);
196   };
197 
198   // Raw proto_id_item.
199   struct ProtoId {
200     uint32_t shorty_idx_;  // index into string_ids array for shorty descriptor
201     uint16_t return_type_idx_;  // index into type_ids array for return type
202     uint16_t pad_;             // padding = 0
203     uint32_t parameters_off_;  // file offset to type_list for parameter types
204 
205    private:
206     DISALLOW_COPY_AND_ASSIGN(ProtoId);
207   };
208 
209   // Raw class_def_item.
210   struct ClassDef {
211     uint16_t class_idx_;  // index into type_ids_ array for this class
212     uint16_t pad1_;  // padding = 0
213     uint32_t access_flags_;
214     uint16_t superclass_idx_;  // index into type_ids_ array for superclass
215     uint16_t pad2_;  // padding = 0
216     uint32_t interfaces_off_;  // file offset to TypeList
217     uint32_t source_file_idx_;  // index into string_ids_ for source file name
218     uint32_t annotations_off_;  // file offset to annotations_directory_item
219     uint32_t class_data_off_;  // file offset to class_data_item
220     uint32_t static_values_off_;  // file offset to EncodedArray
221 
222     // Returns the valid access flags, that is, Java modifier bits relevant to the ClassDef type
223     // (class or interface). These are all in the lower 16b and do not contain runtime flags.
GetJavaAccessFlagsClassDef224     uint32_t GetJavaAccessFlags() const {
225       // Make sure that none of our runtime-only flags are set.
226       static_assert((kAccValidClassFlags & kAccJavaFlagsMask) == kAccValidClassFlags,
227                     "Valid class flags not a subset of Java flags");
228       static_assert((kAccValidInterfaceFlags & kAccJavaFlagsMask) == kAccValidInterfaceFlags,
229                     "Valid interface flags not a subset of Java flags");
230 
231       if ((access_flags_ & kAccInterface) != 0) {
232         // Interface.
233         return access_flags_ & kAccValidInterfaceFlags;
234       } else {
235         // Class.
236         return access_flags_ & kAccValidClassFlags;
237       }
238     }
239 
240    private:
241     DISALLOW_COPY_AND_ASSIGN(ClassDef);
242   };
243 
244   // Raw type_item.
245   struct TypeItem {
246     uint16_t type_idx_;  // index into type_ids section
247 
248    private:
249     DISALLOW_COPY_AND_ASSIGN(TypeItem);
250   };
251 
252   // Raw type_list.
253   class TypeList {
254    public:
Size()255     uint32_t Size() const {
256       return size_;
257     }
258 
GetTypeItem(uint32_t idx)259     const TypeItem& GetTypeItem(uint32_t idx) const {
260       DCHECK_LT(idx, this->size_);
261       return this->list_[idx];
262     }
263 
264     // Size in bytes of the part of the list that is common.
GetHeaderSize()265     static constexpr size_t GetHeaderSize() {
266       return 4U;
267     }
268 
269     // Size in bytes of the whole type list including all the stored elements.
GetListSize(size_t count)270     static constexpr size_t GetListSize(size_t count) {
271       return GetHeaderSize() + sizeof(TypeItem) * count;
272     }
273 
274    private:
275     uint32_t size_;  // size of the list, in entries
276     TypeItem list_[1];  // elements of the list
277     DISALLOW_COPY_AND_ASSIGN(TypeList);
278   };
279 
280   // Raw code_item.
281   struct CodeItem {
282     uint16_t registers_size_;            // the number of registers used by this code
283                                          //   (locals + parameters)
284     uint16_t ins_size_;                  // the number of words of incoming arguments to the method
285                                          //   that this code is for
286     uint16_t outs_size_;                 // the number of words of outgoing argument space required
287                                          //   by this code for method invocation
288     uint16_t tries_size_;                // the number of try_items for this instance. If non-zero,
289                                          //   then these appear as the tries array just after the
290                                          //   insns in this instance.
291     uint32_t debug_info_off_;            // file offset to debug info stream
292     uint32_t insns_size_in_code_units_;  // size of the insns array, in 2 byte code units
293     uint16_t insns_[1];                  // actual array of bytecode.
294 
295    private:
296     DISALLOW_COPY_AND_ASSIGN(CodeItem);
297   };
298 
299   // Raw try_item.
300   struct TryItem {
301     uint32_t start_addr_;
302     uint16_t insn_count_;
303     uint16_t handler_off_;
304 
305    private:
306     DISALLOW_COPY_AND_ASSIGN(TryItem);
307   };
308 
309   // Annotation constants.
310   enum {
311     kDexVisibilityBuild         = 0x00,     /* annotation visibility */
312     kDexVisibilityRuntime       = 0x01,
313     kDexVisibilitySystem        = 0x02,
314 
315     kDexAnnotationByte          = 0x00,
316     kDexAnnotationShort         = 0x02,
317     kDexAnnotationChar          = 0x03,
318     kDexAnnotationInt           = 0x04,
319     kDexAnnotationLong          = 0x06,
320     kDexAnnotationFloat         = 0x10,
321     kDexAnnotationDouble        = 0x11,
322     kDexAnnotationString        = 0x17,
323     kDexAnnotationType          = 0x18,
324     kDexAnnotationField         = 0x19,
325     kDexAnnotationMethod        = 0x1a,
326     kDexAnnotationEnum          = 0x1b,
327     kDexAnnotationArray         = 0x1c,
328     kDexAnnotationAnnotation    = 0x1d,
329     kDexAnnotationNull          = 0x1e,
330     kDexAnnotationBoolean       = 0x1f,
331 
332     kDexAnnotationValueTypeMask = 0x1f,     /* low 5 bits */
333     kDexAnnotationValueArgShift = 5,
334   };
335 
336   struct AnnotationsDirectoryItem {
337     uint32_t class_annotations_off_;
338     uint32_t fields_size_;
339     uint32_t methods_size_;
340     uint32_t parameters_size_;
341 
342    private:
343     DISALLOW_COPY_AND_ASSIGN(AnnotationsDirectoryItem);
344   };
345 
346   struct FieldAnnotationsItem {
347     uint32_t field_idx_;
348     uint32_t annotations_off_;
349 
350    private:
351     DISALLOW_COPY_AND_ASSIGN(FieldAnnotationsItem);
352   };
353 
354   struct MethodAnnotationsItem {
355     uint32_t method_idx_;
356     uint32_t annotations_off_;
357 
358    private:
359     DISALLOW_COPY_AND_ASSIGN(MethodAnnotationsItem);
360   };
361 
362   struct ParameterAnnotationsItem {
363     uint32_t method_idx_;
364     uint32_t annotations_off_;
365 
366    private:
367     DISALLOW_COPY_AND_ASSIGN(ParameterAnnotationsItem);
368   };
369 
370   struct AnnotationSetRefItem {
371     uint32_t annotations_off_;
372 
373    private:
374     DISALLOW_COPY_AND_ASSIGN(AnnotationSetRefItem);
375   };
376 
377   struct AnnotationSetRefList {
378     uint32_t size_;
379     AnnotationSetRefItem list_[1];
380 
381    private:
382     DISALLOW_COPY_AND_ASSIGN(AnnotationSetRefList);
383   };
384 
385   struct AnnotationSetItem {
386     uint32_t size_;
387     uint32_t entries_[1];
388 
389    private:
390     DISALLOW_COPY_AND_ASSIGN(AnnotationSetItem);
391   };
392 
393   struct AnnotationItem {
394     uint8_t visibility_;
395     uint8_t annotation_[1];
396 
397    private:
398     DISALLOW_COPY_AND_ASSIGN(AnnotationItem);
399   };
400 
401   struct AnnotationValue {
402     JValue value_;
403     uint8_t type_;
404   };
405 
406   enum AnnotationResultStyle {  // private
407     kAllObjects,
408     kPrimitivesOrObjects,
409     kAllRaw
410   };
411 
412   // Returns the checksum of a file for comparison with GetLocationChecksum().
413   // For .dex files, this is the header checksum.
414   // For zip files, this is the classes.dex zip entry CRC32 checksum.
415   // Return true if the checksum could be found, false otherwise.
416   static bool GetChecksum(const char* filename, uint32_t* checksum, std::string* error_msg);
417 
418   // Opens .dex files found in the container, guessing the container format based on file extension.
419   static bool Open(const char* filename, const char* location, std::string* error_msg,
420                    std::vector<std::unique_ptr<const DexFile>>* dex_files);
421 
422   // Checks whether the given file has the dex magic, or is a zip file with a classes.dex entry.
423   // If this function returns false, Open will not succeed. The inverse is not true, however.
424   static bool MaybeDex(const char* filename);
425 
426   // Opens .dex file, backed by existing memory
427   static std::unique_ptr<const DexFile> Open(const uint8_t* base, size_t size,
428                                              const std::string& location,
429                                              uint32_t location_checksum,
430                                              const OatDexFile* oat_dex_file,
431                                              bool verify,
432                                              std::string* error_msg);
433 
434   // Open all classesXXX.dex files from a zip archive.
435   static bool OpenFromZip(const ZipArchive& zip_archive, const std::string& location,
436                           std::string* error_msg,
437                           std::vector<std::unique_ptr<const DexFile>>* dex_files);
438 
439   // Closes a .dex file.
440   virtual ~DexFile();
441 
GetLocation()442   const std::string& GetLocation() const {
443     return location_;
444   }
445 
446   // For normal dex files, location and base location coincide. If a dex file is part of a multidex
447   // archive, the base location is the name of the originating jar/apk, stripped of any internal
448   // classes*.dex path.
GetBaseLocation(const char * location)449   static std::string GetBaseLocation(const char* location) {
450     const char* pos = strrchr(location, kMultiDexSeparator);
451     if (pos == nullptr) {
452       return location;
453     } else {
454       return std::string(location, pos - location);
455     }
456   }
457 
GetBaseLocation(const std::string & location)458   static std::string GetBaseLocation(const std::string& location) {
459     return GetBaseLocation(location.c_str());
460   }
461 
462   // Returns the ':classes*.dex' part of the dex location. Returns an empty
463   // string if there is no multidex suffix for the given location.
464   // The kMultiDexSeparator is included in the returned suffix.
GetMultiDexSuffix(const std::string & location)465   static std::string GetMultiDexSuffix(const std::string& location) {
466     size_t pos = location.rfind(kMultiDexSeparator);
467     if (pos == std::string::npos) {
468       return "";
469     } else {
470       return location.substr(pos);
471     }
472   }
473 
GetBaseLocation()474   std::string GetBaseLocation() const {
475     return GetBaseLocation(location_);
476   }
477 
478   // For DexFiles directly from .dex files, this is the checksum from the DexFile::Header.
479   // For DexFiles opened from a zip files, this will be the ZipEntry CRC32 of classes.dex.
GetLocationChecksum()480   uint32_t GetLocationChecksum() const {
481     return location_checksum_;
482   }
483 
GetHeader()484   const Header& GetHeader() const {
485     DCHECK(header_ != nullptr) << GetLocation();
486     return *header_;
487   }
488 
489   // Decode the dex magic version
GetVersion()490   uint32_t GetVersion() const {
491     return GetHeader().GetVersion();
492   }
493 
494   // Returns true if the byte string points to the magic value.
495   static bool IsMagicValid(const uint8_t* magic);
496 
497   // Returns true if the byte string after the magic is the correct value.
498   static bool IsVersionValid(const uint8_t* magic);
499 
500   // Returns the number of string identifiers in the .dex file.
NumStringIds()501   size_t NumStringIds() const {
502     DCHECK(header_ != nullptr) << GetLocation();
503     return header_->string_ids_size_;
504   }
505 
506   // Returns the StringId at the specified index.
GetStringId(uint32_t idx)507   const StringId& GetStringId(uint32_t idx) const {
508     DCHECK_LT(idx, NumStringIds()) << GetLocation();
509     return string_ids_[idx];
510   }
511 
GetIndexForStringId(const StringId & string_id)512   uint32_t GetIndexForStringId(const StringId& string_id) const {
513     CHECK_GE(&string_id, string_ids_) << GetLocation();
514     CHECK_LT(&string_id, string_ids_ + header_->string_ids_size_) << GetLocation();
515     return &string_id - string_ids_;
516   }
517 
518   int32_t GetStringLength(const StringId& string_id) const;
519 
520   // Returns a pointer to the UTF-8 string data referred to by the given string_id as well as the
521   // length of the string when decoded as a UTF-16 string. Note the UTF-16 length is not the same
522   // as the string length of the string data.
523   const char* GetStringDataAndUtf16Length(const StringId& string_id, uint32_t* utf16_length) const;
524 
GetStringData(const StringId & string_id)525   const char* GetStringData(const StringId& string_id) const {
526     uint32_t ignored;
527     return GetStringDataAndUtf16Length(string_id, &ignored);
528   }
529 
530   // Index version of GetStringDataAndUtf16Length.
StringDataAndUtf16LengthByIdx(uint32_t idx,uint32_t * utf16_length)531   const char* StringDataAndUtf16LengthByIdx(uint32_t idx, uint32_t* utf16_length) const {
532     if (idx == kDexNoIndex) {
533       *utf16_length = 0;
534       return nullptr;
535     }
536     const StringId& string_id = GetStringId(idx);
537     return GetStringDataAndUtf16Length(string_id, utf16_length);
538   }
539 
StringDataByIdx(uint32_t idx)540   const char* StringDataByIdx(uint32_t idx) const {
541     uint32_t unicode_length;
542     return StringDataAndUtf16LengthByIdx(idx, &unicode_length);
543   }
544 
545   // Looks up a string id for a given modified utf8 string.
546   const StringId* FindStringId(const char* string) const;
547 
548   const TypeId* FindTypeId(const char* string) const;
549 
550   // Looks up a string id for a given utf16 string.
551   const StringId* FindStringId(const uint16_t* string, size_t length) const;
552 
553   // Returns the number of type identifiers in the .dex file.
NumTypeIds()554   uint32_t NumTypeIds() const {
555     DCHECK(header_ != nullptr) << GetLocation();
556     return header_->type_ids_size_;
557   }
558 
559   // Returns the TypeId at the specified index.
GetTypeId(uint32_t idx)560   const TypeId& GetTypeId(uint32_t idx) const {
561     DCHECK_LT(idx, NumTypeIds()) << GetLocation();
562     return type_ids_[idx];
563   }
564 
GetIndexForTypeId(const TypeId & type_id)565   uint16_t GetIndexForTypeId(const TypeId& type_id) const {
566     CHECK_GE(&type_id, type_ids_) << GetLocation();
567     CHECK_LT(&type_id, type_ids_ + header_->type_ids_size_) << GetLocation();
568     size_t result = &type_id - type_ids_;
569     DCHECK_LT(result, 65536U) << GetLocation();
570     return static_cast<uint16_t>(result);
571   }
572 
573   // Get the descriptor string associated with a given type index.
StringByTypeIdx(uint32_t idx,uint32_t * unicode_length)574   const char* StringByTypeIdx(uint32_t idx, uint32_t* unicode_length) const {
575     const TypeId& type_id = GetTypeId(idx);
576     return StringDataAndUtf16LengthByIdx(type_id.descriptor_idx_, unicode_length);
577   }
578 
StringByTypeIdx(uint32_t idx)579   const char* StringByTypeIdx(uint32_t idx) const {
580     const TypeId& type_id = GetTypeId(idx);
581     return StringDataByIdx(type_id.descriptor_idx_);
582   }
583 
584   // Returns the type descriptor string of a type id.
GetTypeDescriptor(const TypeId & type_id)585   const char* GetTypeDescriptor(const TypeId& type_id) const {
586     return StringDataByIdx(type_id.descriptor_idx_);
587   }
588 
589   // Looks up a type for the given string index
590   const TypeId* FindTypeId(uint32_t string_idx) const;
591 
592   // Returns the number of field identifiers in the .dex file.
NumFieldIds()593   size_t NumFieldIds() const {
594     DCHECK(header_ != nullptr) << GetLocation();
595     return header_->field_ids_size_;
596   }
597 
598   // Returns the FieldId at the specified index.
GetFieldId(uint32_t idx)599   const FieldId& GetFieldId(uint32_t idx) const {
600     DCHECK_LT(idx, NumFieldIds()) << GetLocation();
601     return field_ids_[idx];
602   }
603 
GetIndexForFieldId(const FieldId & field_id)604   uint32_t GetIndexForFieldId(const FieldId& field_id) const {
605     CHECK_GE(&field_id, field_ids_) << GetLocation();
606     CHECK_LT(&field_id, field_ids_ + header_->field_ids_size_) << GetLocation();
607     return &field_id - field_ids_;
608   }
609 
610   // Looks up a field by its declaring class, name and type
611   const FieldId* FindFieldId(const DexFile::TypeId& declaring_klass,
612                              const DexFile::StringId& name,
613                              const DexFile::TypeId& type) const;
614 
615   // Returns the declaring class descriptor string of a field id.
GetFieldDeclaringClassDescriptor(const FieldId & field_id)616   const char* GetFieldDeclaringClassDescriptor(const FieldId& field_id) const {
617     const DexFile::TypeId& type_id = GetTypeId(field_id.class_idx_);
618     return GetTypeDescriptor(type_id);
619   }
620 
621   // Returns the class descriptor string of a field id.
GetFieldTypeDescriptor(const FieldId & field_id)622   const char* GetFieldTypeDescriptor(const FieldId& field_id) const {
623     const DexFile::TypeId& type_id = GetTypeId(field_id.type_idx_);
624     return GetTypeDescriptor(type_id);
625   }
626 
627   // Returns the name of a field id.
GetFieldName(const FieldId & field_id)628   const char* GetFieldName(const FieldId& field_id) const {
629     return StringDataByIdx(field_id.name_idx_);
630   }
631 
632   // Returns the number of method identifiers in the .dex file.
NumMethodIds()633   size_t NumMethodIds() const {
634     DCHECK(header_ != nullptr) << GetLocation();
635     return header_->method_ids_size_;
636   }
637 
638   // Returns the MethodId at the specified index.
GetMethodId(uint32_t idx)639   const MethodId& GetMethodId(uint32_t idx) const {
640     DCHECK_LT(idx, NumMethodIds()) << GetLocation();
641     return method_ids_[idx];
642   }
643 
GetIndexForMethodId(const MethodId & method_id)644   uint32_t GetIndexForMethodId(const MethodId& method_id) const {
645     CHECK_GE(&method_id, method_ids_) << GetLocation();
646     CHECK_LT(&method_id, method_ids_ + header_->method_ids_size_) << GetLocation();
647     return &method_id - method_ids_;
648   }
649 
650   // Looks up a method by its declaring class, name and proto_id
651   const MethodId* FindMethodId(const DexFile::TypeId& declaring_klass,
652                                const DexFile::StringId& name,
653                                const DexFile::ProtoId& signature) const;
654 
655   // Returns the declaring class descriptor string of a method id.
GetMethodDeclaringClassDescriptor(const MethodId & method_id)656   const char* GetMethodDeclaringClassDescriptor(const MethodId& method_id) const {
657     const DexFile::TypeId& type_id = GetTypeId(method_id.class_idx_);
658     return GetTypeDescriptor(type_id);
659   }
660 
661   // Returns the prototype of a method id.
GetMethodPrototype(const MethodId & method_id)662   const ProtoId& GetMethodPrototype(const MethodId& method_id) const {
663     return GetProtoId(method_id.proto_idx_);
664   }
665 
666   // Returns a representation of the signature of a method id.
667   const Signature GetMethodSignature(const MethodId& method_id) const;
668 
669   // Returns the name of a method id.
GetMethodName(const MethodId & method_id)670   const char* GetMethodName(const MethodId& method_id) const {
671     return StringDataByIdx(method_id.name_idx_);
672   }
673 
674   // Returns the shorty of a method by its index.
GetMethodShorty(uint32_t idx)675   const char* GetMethodShorty(uint32_t idx) const {
676     return StringDataByIdx(GetProtoId(GetMethodId(idx).proto_idx_).shorty_idx_);
677   }
678 
679   // Returns the shorty of a method id.
GetMethodShorty(const MethodId & method_id)680   const char* GetMethodShorty(const MethodId& method_id) const {
681     return StringDataByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_);
682   }
GetMethodShorty(const MethodId & method_id,uint32_t * length)683   const char* GetMethodShorty(const MethodId& method_id, uint32_t* length) const {
684     // Using the UTF16 length is safe here as shorties are guaranteed to be ASCII characters.
685     return StringDataAndUtf16LengthByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_, length);
686   }
687   // Returns the number of class definitions in the .dex file.
NumClassDefs()688   uint32_t NumClassDefs() const {
689     DCHECK(header_ != nullptr) << GetLocation();
690     return header_->class_defs_size_;
691   }
692 
693   // Returns the ClassDef at the specified index.
GetClassDef(uint16_t idx)694   const ClassDef& GetClassDef(uint16_t idx) const {
695     DCHECK_LT(idx, NumClassDefs()) << GetLocation();
696     return class_defs_[idx];
697   }
698 
GetIndexForClassDef(const ClassDef & class_def)699   uint16_t GetIndexForClassDef(const ClassDef& class_def) const {
700     CHECK_GE(&class_def, class_defs_) << GetLocation();
701     CHECK_LT(&class_def, class_defs_ + header_->class_defs_size_) << GetLocation();
702     return &class_def - class_defs_;
703   }
704 
705   // Returns the class descriptor string of a class definition.
GetClassDescriptor(const ClassDef & class_def)706   const char* GetClassDescriptor(const ClassDef& class_def) const {
707     return StringByTypeIdx(class_def.class_idx_);
708   }
709 
710   // Looks up a class definition by its class descriptor. Hash must be
711   // ComputeModifiedUtf8Hash(descriptor).
712   const ClassDef* FindClassDef(const char* descriptor, size_t hash) const;
713 
714   // Looks up a class definition by its type index.
715   const ClassDef* FindClassDef(uint16_t type_idx) const;
716 
GetInterfacesList(const ClassDef & class_def)717   const TypeList* GetInterfacesList(const ClassDef& class_def) const {
718     if (class_def.interfaces_off_ == 0) {
719         return nullptr;
720     } else {
721       const uint8_t* addr = begin_ + class_def.interfaces_off_;
722       return reinterpret_cast<const TypeList*>(addr);
723     }
724   }
725 
726   // Returns a pointer to the raw memory mapped class_data_item
GetClassData(const ClassDef & class_def)727   const uint8_t* GetClassData(const ClassDef& class_def) const {
728     if (class_def.class_data_off_ == 0) {
729       return nullptr;
730     } else {
731       return begin_ + class_def.class_data_off_;
732     }
733   }
734 
735   //
GetCodeItem(const uint32_t code_off)736   const CodeItem* GetCodeItem(const uint32_t code_off) const {
737     DCHECK_LT(code_off, size_) << "Code item offset larger then maximum allowed offset";
738     if (code_off == 0) {
739       return nullptr;  // native or abstract method
740     } else {
741       const uint8_t* addr = begin_ + code_off;
742       return reinterpret_cast<const CodeItem*>(addr);
743     }
744   }
745 
GetReturnTypeDescriptor(const ProtoId & proto_id)746   const char* GetReturnTypeDescriptor(const ProtoId& proto_id) const {
747     return StringByTypeIdx(proto_id.return_type_idx_);
748   }
749 
750   // Returns the number of prototype identifiers in the .dex file.
NumProtoIds()751   size_t NumProtoIds() const {
752     DCHECK(header_ != nullptr) << GetLocation();
753     return header_->proto_ids_size_;
754   }
755 
756   // Returns the ProtoId at the specified index.
GetProtoId(uint32_t idx)757   const ProtoId& GetProtoId(uint32_t idx) const {
758     DCHECK_LT(idx, NumProtoIds()) << GetLocation();
759     return proto_ids_[idx];
760   }
761 
GetIndexForProtoId(const ProtoId & proto_id)762   uint16_t GetIndexForProtoId(const ProtoId& proto_id) const {
763     CHECK_GE(&proto_id, proto_ids_) << GetLocation();
764     CHECK_LT(&proto_id, proto_ids_ + header_->proto_ids_size_) << GetLocation();
765     return &proto_id - proto_ids_;
766   }
767 
768   // Looks up a proto id for a given return type and signature type list
769   const ProtoId* FindProtoId(uint16_t return_type_idx,
770                              const uint16_t* signature_type_idxs, uint32_t signature_length) const;
FindProtoId(uint16_t return_type_idx,const std::vector<uint16_t> & signature_type_idxs)771   const ProtoId* FindProtoId(uint16_t return_type_idx,
772                              const std::vector<uint16_t>& signature_type_idxs) const {
773     return FindProtoId(return_type_idx, &signature_type_idxs[0], signature_type_idxs.size());
774   }
775 
776   // Given a signature place the type ids into the given vector, returns true on success
777   bool CreateTypeList(const StringPiece& signature, uint16_t* return_type_idx,
778                       std::vector<uint16_t>* param_type_idxs) const;
779 
780   // Create a Signature from the given string signature or return Signature::NoSignature if not
781   // possible.
782   const Signature CreateSignature(const StringPiece& signature) const;
783 
784   // Returns the short form method descriptor for the given prototype.
GetShorty(uint32_t proto_idx)785   const char* GetShorty(uint32_t proto_idx) const {
786     const ProtoId& proto_id = GetProtoId(proto_idx);
787     return StringDataByIdx(proto_id.shorty_idx_);
788   }
789 
GetProtoParameters(const ProtoId & proto_id)790   const TypeList* GetProtoParameters(const ProtoId& proto_id) const {
791     if (proto_id.parameters_off_ == 0) {
792       return nullptr;
793     } else {
794       const uint8_t* addr = begin_ + proto_id.parameters_off_;
795       return reinterpret_cast<const TypeList*>(addr);
796     }
797   }
798 
GetEncodedStaticFieldValuesArray(const ClassDef & class_def)799   const uint8_t* GetEncodedStaticFieldValuesArray(const ClassDef& class_def) const {
800     if (class_def.static_values_off_ == 0) {
801       return 0;
802     } else {
803       return begin_ + class_def.static_values_off_;
804     }
805   }
806 
807   static const TryItem* GetTryItems(const CodeItem& code_item, uint32_t offset);
808 
809   // Get the base of the encoded data for the given DexCode.
GetCatchHandlerData(const CodeItem & code_item,uint32_t offset)810   static const uint8_t* GetCatchHandlerData(const CodeItem& code_item, uint32_t offset) {
811     const uint8_t* handler_data =
812         reinterpret_cast<const uint8_t*>(GetTryItems(code_item, code_item.tries_size_));
813     return handler_data + offset;
814   }
815 
816   // Find which try region is associated with the given address (ie dex pc). Returns -1 if none.
817   static int32_t FindTryItem(const CodeItem &code_item, uint32_t address);
818 
819   // Find the handler offset associated with the given address (ie dex pc). Returns -1 if none.
820   static int32_t FindCatchHandlerOffset(const CodeItem &code_item, uint32_t address);
821 
822   // Get the pointer to the start of the debugging data
GetDebugInfoStream(const CodeItem * code_item)823   const uint8_t* GetDebugInfoStream(const CodeItem* code_item) const {
824     // Check that the offset is in bounds.
825     // Note that although the specification says that 0 should be used if there
826     // is no debug information, some applications incorrectly use 0xFFFFFFFF.
827     if (code_item->debug_info_off_ == 0 || code_item->debug_info_off_ >= size_) {
828       return nullptr;
829     } else {
830       return begin_ + code_item->debug_info_off_;
831     }
832   }
833 
834   struct PositionInfo {
PositionInfoPositionInfo835     PositionInfo()
836         : address_(0),
837           line_(0),
838           source_file_(nullptr),
839           prologue_end_(false),
840           epilogue_begin_(false) {
841     }
842 
843     uint32_t address_;  // In 16-bit code units.
844     uint32_t line_;  // Source code line number starting at 1.
845     const char* source_file_;  // nullptr if the file from ClassDef still applies.
846     bool prologue_end_;
847     bool epilogue_begin_;
848   };
849 
850   // Callback for "new position table entry".
851   // Returning true causes the decoder to stop early.
852   typedef bool (*DexDebugNewPositionCb)(void* context, const PositionInfo& entry);
853 
854   struct LocalInfo {
LocalInfoLocalInfo855     LocalInfo()
856         : name_(nullptr),
857           descriptor_(nullptr),
858           signature_(nullptr),
859           start_address_(0),
860           end_address_(0),
861           reg_(0),
862           is_live_(false) {
863     }
864 
865     const char* name_;  // E.g., list.  It can be nullptr if unknown.
866     const char* descriptor_;  // E.g., Ljava/util/LinkedList;
867     const char* signature_;  // E.g., java.util.LinkedList<java.lang.Integer>
868     uint32_t start_address_;  // PC location where the local is first defined.
869     uint32_t end_address_;  // PC location where the local is no longer defined.
870     uint16_t reg_;  // Dex register which stores the values.
871     bool is_live_;  // Is the local defined and live.
872   };
873 
874   // Callback for "new locals table entry".
875   typedef void (*DexDebugNewLocalCb)(void* context, const LocalInfo& entry);
876 
877   static bool LineNumForPcCb(void* context, const PositionInfo& entry);
878 
GetAnnotationsDirectory(const ClassDef & class_def)879   const AnnotationsDirectoryItem* GetAnnotationsDirectory(const ClassDef& class_def) const {
880     if (class_def.annotations_off_ == 0) {
881       return nullptr;
882     } else {
883       return reinterpret_cast<const AnnotationsDirectoryItem*>(begin_ + class_def.annotations_off_);
884     }
885   }
886 
GetClassAnnotationSet(const AnnotationsDirectoryItem * anno_dir)887   const AnnotationSetItem* GetClassAnnotationSet(const AnnotationsDirectoryItem* anno_dir) const {
888     if (anno_dir->class_annotations_off_ == 0) {
889       return nullptr;
890     } else {
891       return reinterpret_cast<const AnnotationSetItem*>(begin_ + anno_dir->class_annotations_off_);
892     }
893   }
894 
GetFieldAnnotations(const AnnotationsDirectoryItem * anno_dir)895   const FieldAnnotationsItem* GetFieldAnnotations(const AnnotationsDirectoryItem* anno_dir) const {
896     if (anno_dir->fields_size_ == 0) {
897       return nullptr;
898     } else {
899       return reinterpret_cast<const FieldAnnotationsItem*>(&anno_dir[1]);
900     }
901   }
902 
GetMethodAnnotations(const AnnotationsDirectoryItem * anno_dir)903   const MethodAnnotationsItem* GetMethodAnnotations(const AnnotationsDirectoryItem* anno_dir)
904       const {
905     if (anno_dir->methods_size_ == 0) {
906       return nullptr;
907     } else {
908       // Skip past the header and field annotations.
909       const uint8_t* addr = reinterpret_cast<const uint8_t*>(&anno_dir[1]);
910       addr += anno_dir->fields_size_ * sizeof(FieldAnnotationsItem);
911       return reinterpret_cast<const MethodAnnotationsItem*>(addr);
912     }
913   }
914 
GetParameterAnnotations(const AnnotationsDirectoryItem * anno_dir)915   const ParameterAnnotationsItem* GetParameterAnnotations(const AnnotationsDirectoryItem* anno_dir)
916       const {
917     if (anno_dir->parameters_size_ == 0) {
918       return nullptr;
919     } else {
920       // Skip past the header, field annotations, and method annotations.
921       const uint8_t* addr = reinterpret_cast<const uint8_t*>(&anno_dir[1]);
922       addr += anno_dir->fields_size_ * sizeof(FieldAnnotationsItem);
923       addr += anno_dir->methods_size_ * sizeof(MethodAnnotationsItem);
924       return reinterpret_cast<const ParameterAnnotationsItem*>(addr);
925     }
926   }
927 
GetFieldAnnotationSetItem(const FieldAnnotationsItem & anno_item)928   const AnnotationSetItem* GetFieldAnnotationSetItem(const FieldAnnotationsItem& anno_item) const {
929     uint32_t offset = anno_item.annotations_off_;
930     if (offset == 0) {
931       return nullptr;
932     } else {
933       return reinterpret_cast<const AnnotationSetItem*>(begin_ + offset);
934     }
935   }
936 
GetMethodAnnotationSetItem(const MethodAnnotationsItem & anno_item)937   const AnnotationSetItem* GetMethodAnnotationSetItem(const MethodAnnotationsItem& anno_item)
938       const {
939     uint32_t offset = anno_item.annotations_off_;
940     if (offset == 0) {
941       return nullptr;
942     } else {
943       return reinterpret_cast<const AnnotationSetItem*>(begin_ + offset);
944     }
945   }
946 
GetParameterAnnotationSetRefList(const ParameterAnnotationsItem * anno_item)947   const AnnotationSetRefList* GetParameterAnnotationSetRefList(
948       const ParameterAnnotationsItem* anno_item) const {
949     uint32_t offset = anno_item->annotations_off_;
950     if (offset == 0) {
951       return nullptr;
952     }
953     return reinterpret_cast<const AnnotationSetRefList*>(begin_ + offset);
954   }
955 
GetAnnotationItem(const AnnotationSetItem * set_item,uint32_t index)956   const AnnotationItem* GetAnnotationItem(const AnnotationSetItem* set_item, uint32_t index) const {
957     DCHECK_LE(index, set_item->size_);
958     uint32_t offset = set_item->entries_[index];
959     if (offset == 0) {
960       return nullptr;
961     } else {
962       return reinterpret_cast<const AnnotationItem*>(begin_ + offset);
963     }
964   }
965 
GetSetRefItemItem(const AnnotationSetRefItem * anno_item)966   const AnnotationSetItem* GetSetRefItemItem(const AnnotationSetRefItem* anno_item) const {
967     uint32_t offset = anno_item->annotations_off_;
968     if (offset == 0) {
969       return nullptr;
970     }
971     return reinterpret_cast<const AnnotationSetItem*>(begin_ + offset);
972   }
973 
974   const AnnotationSetItem* FindAnnotationSetForField(ArtField* field) const
975       SHARED_REQUIRES(Locks::mutator_lock_);
976   mirror::Object* GetAnnotationForField(ArtField* field, Handle<mirror::Class> annotation_class)
977       const SHARED_REQUIRES(Locks::mutator_lock_);
978   mirror::ObjectArray<mirror::Object>* GetAnnotationsForField(ArtField* field) const
979       SHARED_REQUIRES(Locks::mutator_lock_);
980   mirror::ObjectArray<mirror::String>* GetSignatureAnnotationForField(ArtField* field) const
981       SHARED_REQUIRES(Locks::mutator_lock_);
982   bool IsFieldAnnotationPresent(ArtField* field, Handle<mirror::Class> annotation_class) const
983       SHARED_REQUIRES(Locks::mutator_lock_);
984 
985   const AnnotationSetItem* FindAnnotationSetForMethod(ArtMethod* method) const
986       SHARED_REQUIRES(Locks::mutator_lock_);
987   const ParameterAnnotationsItem* FindAnnotationsItemForMethod(ArtMethod* method) const
988       SHARED_REQUIRES(Locks::mutator_lock_);
989   mirror::Object* GetAnnotationDefaultValue(ArtMethod* method) const
990       SHARED_REQUIRES(Locks::mutator_lock_);
991   mirror::Object* GetAnnotationForMethod(ArtMethod* method, Handle<mirror::Class> annotation_class)
992       const SHARED_REQUIRES(Locks::mutator_lock_);
993   mirror::ObjectArray<mirror::Object>* GetAnnotationsForMethod(ArtMethod* method) const
994       SHARED_REQUIRES(Locks::mutator_lock_);
995   mirror::ObjectArray<mirror::Class>* GetExceptionTypesForMethod(ArtMethod* method) const
996       SHARED_REQUIRES(Locks::mutator_lock_);
997   mirror::ObjectArray<mirror::Object>* GetParameterAnnotations(ArtMethod* method) const
998       SHARED_REQUIRES(Locks::mutator_lock_);
999   mirror::ObjectArray<mirror::String>* GetSignatureAnnotationForMethod(ArtMethod* method) const
1000       SHARED_REQUIRES(Locks::mutator_lock_);
1001   bool IsMethodAnnotationPresent(ArtMethod* method, Handle<mirror::Class> annotation_class) const
1002       SHARED_REQUIRES(Locks::mutator_lock_);
1003 
1004   const AnnotationSetItem* FindAnnotationSetForClass(Handle<mirror::Class> klass) const
1005       SHARED_REQUIRES(Locks::mutator_lock_);
1006   mirror::Object* GetAnnotationForClass(Handle<mirror::Class> klass,
1007                                         Handle<mirror::Class> annotation_class) const
1008       SHARED_REQUIRES(Locks::mutator_lock_);
1009   mirror::ObjectArray<mirror::Object>* GetAnnotationsForClass(Handle<mirror::Class> klass) const
1010       SHARED_REQUIRES(Locks::mutator_lock_);
1011   mirror::ObjectArray<mirror::Class>* GetDeclaredClasses(Handle<mirror::Class> klass) const
1012       SHARED_REQUIRES(Locks::mutator_lock_);
1013   mirror::Class* GetDeclaringClass(Handle<mirror::Class> klass) const
1014       SHARED_REQUIRES(Locks::mutator_lock_);
1015   mirror::Class* GetEnclosingClass(Handle<mirror::Class> klass) const
1016       SHARED_REQUIRES(Locks::mutator_lock_);
1017   mirror::Object* GetEnclosingMethod(Handle<mirror::Class> klass) const
1018       SHARED_REQUIRES(Locks::mutator_lock_);
1019   bool GetInnerClass(Handle<mirror::Class> klass, mirror::String** name) const
1020       SHARED_REQUIRES(Locks::mutator_lock_);
1021   bool GetInnerClassFlags(Handle<mirror::Class> klass, uint32_t* flags) const
1022       SHARED_REQUIRES(Locks::mutator_lock_);
1023   mirror::ObjectArray<mirror::String>* GetSignatureAnnotationForClass(Handle<mirror::Class> klass)
1024       const SHARED_REQUIRES(Locks::mutator_lock_);
1025   bool IsClassAnnotationPresent(Handle<mirror::Class> klass, Handle<mirror::Class> annotation_class)
1026       const SHARED_REQUIRES(Locks::mutator_lock_);
1027 
1028   mirror::Object* CreateAnnotationMember(Handle<mirror::Class> klass,
1029                                          Handle<mirror::Class> annotation_class,
1030                                          const uint8_t** annotation) const
1031       SHARED_REQUIRES(Locks::mutator_lock_);
1032   const AnnotationItem* GetAnnotationItemFromAnnotationSet(Handle<mirror::Class> klass,
1033                                                            const AnnotationSetItem* annotation_set,
1034                                                            uint32_t visibility,
1035                                                            Handle<mirror::Class> annotation_class)
1036       const SHARED_REQUIRES(Locks::mutator_lock_);
1037   mirror::Object* GetAnnotationObjectFromAnnotationSet(Handle<mirror::Class> klass,
1038                                                        const AnnotationSetItem* annotation_set,
1039                                                        uint32_t visibility,
1040                                                        Handle<mirror::Class> annotation_class) const
1041       SHARED_REQUIRES(Locks::mutator_lock_);
1042   mirror::Object* GetAnnotationValue(Handle<mirror::Class> klass,
1043                                      const AnnotationItem* annotation_item,
1044                                      const char* annotation_name,
1045                                      Handle<mirror::Class> array_class,
1046                                      uint32_t expected_type) const
1047       SHARED_REQUIRES(Locks::mutator_lock_);
1048   mirror::ObjectArray<mirror::String>* GetSignatureValue(Handle<mirror::Class> klass,
1049                                                          const AnnotationSetItem* annotation_set)
1050       const SHARED_REQUIRES(Locks::mutator_lock_);
1051   mirror::ObjectArray<mirror::Class>* GetThrowsValue(Handle<mirror::Class> klass,
1052                                                      const AnnotationSetItem* annotation_set) const
1053       SHARED_REQUIRES(Locks::mutator_lock_);
1054   mirror::ObjectArray<mirror::Object>* ProcessAnnotationSet(Handle<mirror::Class> klass,
1055                                                             const AnnotationSetItem* annotation_set,
1056                                                             uint32_t visibility) const
1057       SHARED_REQUIRES(Locks::mutator_lock_);
1058   mirror::ObjectArray<mirror::Object>* ProcessAnnotationSetRefList(Handle<mirror::Class> klass,
1059       const AnnotationSetRefList* set_ref_list, uint32_t size) const
1060       SHARED_REQUIRES(Locks::mutator_lock_);
1061   bool ProcessAnnotationValue(Handle<mirror::Class> klass, const uint8_t** annotation_ptr,
1062                               AnnotationValue* annotation_value, Handle<mirror::Class> return_class,
1063                               DexFile::AnnotationResultStyle result_style) const
1064       SHARED_REQUIRES(Locks::mutator_lock_);
1065   mirror::Object* ProcessEncodedAnnotation(Handle<mirror::Class> klass,
1066                                            const uint8_t** annotation) const
1067       SHARED_REQUIRES(Locks::mutator_lock_);
1068   const AnnotationItem* SearchAnnotationSet(const AnnotationSetItem* annotation_set,
1069                                             const char* descriptor, uint32_t visibility) const
1070       SHARED_REQUIRES(Locks::mutator_lock_);
1071   const uint8_t* SearchEncodedAnnotation(const uint8_t* annotation, const char* name) const
1072       SHARED_REQUIRES(Locks::mutator_lock_);
1073   bool SkipAnnotationValue(const uint8_t** annotation_ptr) const
1074       SHARED_REQUIRES(Locks::mutator_lock_);
1075 
1076   // Debug info opcodes and constants
1077   enum {
1078     DBG_END_SEQUENCE         = 0x00,
1079     DBG_ADVANCE_PC           = 0x01,
1080     DBG_ADVANCE_LINE         = 0x02,
1081     DBG_START_LOCAL          = 0x03,
1082     DBG_START_LOCAL_EXTENDED = 0x04,
1083     DBG_END_LOCAL            = 0x05,
1084     DBG_RESTART_LOCAL        = 0x06,
1085     DBG_SET_PROLOGUE_END     = 0x07,
1086     DBG_SET_EPILOGUE_BEGIN   = 0x08,
1087     DBG_SET_FILE             = 0x09,
1088     DBG_FIRST_SPECIAL        = 0x0a,
1089     DBG_LINE_BASE            = -4,
1090     DBG_LINE_RANGE           = 15,
1091   };
1092 
1093   struct LineNumFromPcContext {
LineNumFromPcContextLineNumFromPcContext1094     LineNumFromPcContext(uint32_t address, uint32_t line_num)
1095         : address_(address), line_num_(line_num) {}
1096     uint32_t address_;
1097     uint32_t line_num_;
1098    private:
1099     DISALLOW_COPY_AND_ASSIGN(LineNumFromPcContext);
1100   };
1101 
1102   // Determine the source file line number based on the program counter.
1103   // "pc" is an offset, in 16-bit units, from the start of the method's code.
1104   //
1105   // Returns -1 if no match was found (possibly because the source files were
1106   // compiled without "-g", so no line number information is present).
1107   // Returns -2 for native methods (as expected in exception traces).
1108   //
1109   // This is used by runtime; therefore use art::Method not art::DexFile::Method.
1110   int32_t GetLineNumFromPC(ArtMethod* method, uint32_t rel_pc) const
1111       SHARED_REQUIRES(Locks::mutator_lock_);
1112 
1113   // Returns false if there is no debugging information or if it cannot be decoded.
1114   bool DecodeDebugLocalInfo(const CodeItem* code_item, bool is_static, uint32_t method_idx,
1115                             DexDebugNewLocalCb local_cb, void* context) const;
1116 
1117   // Returns false if there is no debugging information or if it cannot be decoded.
1118   bool DecodeDebugPositionInfo(const CodeItem* code_item, DexDebugNewPositionCb position_cb,
1119                                void* context) const;
1120 
GetSourceFile(const ClassDef & class_def)1121   const char* GetSourceFile(const ClassDef& class_def) const {
1122     if (class_def.source_file_idx_ == 0xffffffff) {
1123       return nullptr;
1124     } else {
1125       return StringDataByIdx(class_def.source_file_idx_);
1126     }
1127   }
1128 
1129   int GetPermissions() const;
1130 
1131   bool IsReadOnly() const;
1132 
1133   bool EnableWrite() const;
1134 
1135   bool DisableWrite() const;
1136 
Begin()1137   const uint8_t* Begin() const {
1138     return begin_;
1139   }
1140 
Size()1141   size_t Size() const {
1142     return size_;
1143   }
1144 
1145   // Return the name of the index-th classes.dex in a multidex zip file. This is classes.dex for
1146   // index == 0, and classes{index + 1}.dex else.
1147   static std::string GetMultiDexClassesDexName(size_t index);
1148 
1149   // Return the (possibly synthetic) dex location for a multidex entry. This is dex_location for
1150   // index == 0, and dex_location + multi-dex-separator + GetMultiDexClassesDexName(index) else.
1151   static std::string GetMultiDexLocation(size_t index, const char* dex_location);
1152 
1153   // Returns the canonical form of the given dex location.
1154   //
1155   // There are different flavors of "dex locations" as follows:
1156   // the file name of a dex file:
1157   //     The actual file path that the dex file has on disk.
1158   // dex_location:
1159   //     This acts as a key for the class linker to know which dex file to load.
1160   //     It may correspond to either an old odex file or a particular dex file
1161   //     inside an oat file. In the first case it will also match the file name
1162   //     of the dex file. In the second case (oat) it will include the file name
1163   //     and possibly some multidex annotation to uniquely identify it.
1164   // canonical_dex_location:
1165   //     the dex_location where it's file name part has been made canonical.
1166   static std::string GetDexCanonicalLocation(const char* dex_location);
1167 
GetOatDexFile()1168   const OatDexFile* GetOatDexFile() const {
1169     return oat_dex_file_;
1170   }
1171 
GetTypeLookupTable()1172   TypeLookupTable* GetTypeLookupTable() const {
1173     return lookup_table_.get();
1174   }
1175 
1176   void CreateTypeLookupTable(uint8_t* storage = nullptr) const;
1177 
1178  private:
1179   // Opens a .dex file
1180   static std::unique_ptr<const DexFile> OpenFile(int fd, const char* location,
1181                                                  bool verify, std::string* error_msg);
1182 
1183   // Opens dex files from within a .jar, .zip, or .apk file
1184   static bool OpenZip(int fd, const std::string& location, std::string* error_msg,
1185                       std::vector<std::unique_ptr<const DexFile>>* dex_files);
1186 
1187   enum class ZipOpenErrorCode {  // private
1188     kNoError,
1189     kEntryNotFound,
1190     kExtractToMemoryError,
1191     kDexFileError,
1192     kMakeReadOnlyError,
1193     kVerifyError
1194   };
1195 
1196   // Opens .dex file from the entry_name in a zip archive. error_code is undefined when non-null
1197   // return.
1198   static std::unique_ptr<const DexFile> Open(const ZipArchive& zip_archive, const char* entry_name,
1199                                              const std::string& location, std::string* error_msg,
1200                                              ZipOpenErrorCode* error_code);
1201 
1202   // Opens a .dex file at the given address backed by a MemMap
1203   static std::unique_ptr<const DexFile> OpenMemory(const std::string& location,
1204                                                    uint32_t location_checksum,
1205                                                    MemMap* mem_map,
1206                                                    std::string* error_msg);
1207 
1208   // Opens a .dex file at the given address, optionally backed by a MemMap
1209   static std::unique_ptr<const DexFile> OpenMemory(const uint8_t* dex_file,
1210                                                    size_t size,
1211                                                    const std::string& location,
1212                                                    uint32_t location_checksum,
1213                                                    MemMap* mem_map,
1214                                                    const OatDexFile* oat_dex_file,
1215                                                    std::string* error_msg);
1216 
1217   DexFile(const uint8_t* base, size_t size,
1218           const std::string& location,
1219           uint32_t location_checksum,
1220           MemMap* mem_map,
1221           const OatDexFile* oat_dex_file);
1222 
1223   // Top-level initializer that calls other Init methods.
1224   bool Init(std::string* error_msg);
1225 
1226   // Returns true if the header magic and version numbers are of the expected values.
1227   bool CheckMagicAndVersion(std::string* error_msg) const;
1228 
1229   // Check whether a location denotes a multidex dex file. This is a very simple check: returns
1230   // whether the string contains the separator character.
1231   static bool IsMultiDexLocation(const char* location);
1232 
1233 
1234   // The base address of the memory mapping.
1235   const uint8_t* const begin_;
1236 
1237   // The size of the underlying memory allocation in bytes.
1238   const size_t size_;
1239 
1240   // Typically the dex file name when available, alternatively some identifying string.
1241   //
1242   // The ClassLinker will use this to match DexFiles the boot class
1243   // path to DexCache::GetLocation when loading from an image.
1244   const std::string location_;
1245 
1246   const uint32_t location_checksum_;
1247 
1248   // Manages the underlying memory allocation.
1249   std::unique_ptr<MemMap> mem_map_;
1250 
1251   // Points to the header section.
1252   const Header* const header_;
1253 
1254   // Points to the base of the string identifier list.
1255   const StringId* const string_ids_;
1256 
1257   // Points to the base of the type identifier list.
1258   const TypeId* const type_ids_;
1259 
1260   // Points to the base of the field identifier list.
1261   const FieldId* const field_ids_;
1262 
1263   // Points to the base of the method identifier list.
1264   const MethodId* const method_ids_;
1265 
1266   // Points to the base of the prototype identifier list.
1267   const ProtoId* const proto_ids_;
1268 
1269   // Points to the base of the class definition list.
1270   const ClassDef* const class_defs_;
1271 
1272   // If this dex file was loaded from an oat file, oat_dex_file_ contains a
1273   // pointer to the OatDexFile it was loaded from. Otherwise oat_dex_file_ is
1274   // null.
1275   const OatDexFile* oat_dex_file_;
1276   mutable std::unique_ptr<TypeLookupTable> lookup_table_;
1277 
1278   friend class DexFileVerifierTest;
1279   ART_FRIEND_TEST(ClassLinkerTest, RegisterDexFileName);  // for constructor
1280 };
1281 
1282 struct DexFileReference {
DexFileReferenceDexFileReference1283   DexFileReference(const DexFile* file, uint32_t idx) : dex_file(file), index(idx) { }
1284   const DexFile* dex_file;
1285   uint32_t index;
1286 };
1287 
1288 std::ostream& operator<<(std::ostream& os, const DexFile& dex_file);
1289 
1290 // Iterate over a dex file's ProtoId's paramters
1291 class DexFileParameterIterator {
1292  public:
DexFileParameterIterator(const DexFile & dex_file,const DexFile::ProtoId & proto_id)1293   DexFileParameterIterator(const DexFile& dex_file, const DexFile::ProtoId& proto_id)
1294       : dex_file_(dex_file), size_(0), pos_(0) {
1295     type_list_ = dex_file_.GetProtoParameters(proto_id);
1296     if (type_list_ != nullptr) {
1297       size_ = type_list_->Size();
1298     }
1299   }
HasNext()1300   bool HasNext() const { return pos_ < size_; }
Size()1301   size_t Size() const { return size_; }
Next()1302   void Next() { ++pos_; }
GetTypeIdx()1303   uint16_t GetTypeIdx() {
1304     return type_list_->GetTypeItem(pos_).type_idx_;
1305   }
GetDescriptor()1306   const char* GetDescriptor() {
1307     return dex_file_.StringByTypeIdx(GetTypeIdx());
1308   }
1309  private:
1310   const DexFile& dex_file_;
1311   const DexFile::TypeList* type_list_;
1312   uint32_t size_;
1313   uint32_t pos_;
1314   DISALLOW_IMPLICIT_CONSTRUCTORS(DexFileParameterIterator);
1315 };
1316 
1317 // Abstract the signature of a method.
1318 class Signature : public ValueObject {
1319  public:
1320   std::string ToString() const;
1321 
NoSignature()1322   static Signature NoSignature() {
1323     return Signature();
1324   }
1325 
1326   bool operator==(const Signature& rhs) const;
1327   bool operator!=(const Signature& rhs) const {
1328     return !(*this == rhs);
1329   }
1330 
1331   bool operator==(const StringPiece& rhs) const;
1332 
1333  private:
Signature(const DexFile * dex,const DexFile::ProtoId & proto)1334   Signature(const DexFile* dex, const DexFile::ProtoId& proto) : dex_file_(dex), proto_id_(&proto) {
1335   }
1336 
Signature()1337   Signature() : dex_file_(nullptr), proto_id_(nullptr) {
1338   }
1339 
1340   friend class DexFile;
1341 
1342   const DexFile* const dex_file_;
1343   const DexFile::ProtoId* const proto_id_;
1344 };
1345 std::ostream& operator<<(std::ostream& os, const Signature& sig);
1346 
1347 // Iterate and decode class_data_item
1348 class ClassDataItemIterator {
1349  public:
ClassDataItemIterator(const DexFile & dex_file,const uint8_t * raw_class_data_item)1350   ClassDataItemIterator(const DexFile& dex_file, const uint8_t* raw_class_data_item)
1351       : dex_file_(dex_file), pos_(0), ptr_pos_(raw_class_data_item), last_idx_(0) {
1352     ReadClassDataHeader();
1353     if (EndOfInstanceFieldsPos() > 0) {
1354       ReadClassDataField();
1355     } else if (EndOfVirtualMethodsPos() > 0) {
1356       ReadClassDataMethod();
1357     }
1358   }
NumStaticFields()1359   uint32_t NumStaticFields() const {
1360     return header_.static_fields_size_;
1361   }
NumInstanceFields()1362   uint32_t NumInstanceFields() const {
1363     return header_.instance_fields_size_;
1364   }
NumDirectMethods()1365   uint32_t NumDirectMethods() const {
1366     return header_.direct_methods_size_;
1367   }
NumVirtualMethods()1368   uint32_t NumVirtualMethods() const {
1369     return header_.virtual_methods_size_;
1370   }
HasNextStaticField()1371   bool HasNextStaticField() const {
1372     return pos_ < EndOfStaticFieldsPos();
1373   }
HasNextInstanceField()1374   bool HasNextInstanceField() const {
1375     return pos_ >= EndOfStaticFieldsPos() && pos_ < EndOfInstanceFieldsPos();
1376   }
HasNextDirectMethod()1377   bool HasNextDirectMethod() const {
1378     return pos_ >= EndOfInstanceFieldsPos() && pos_ < EndOfDirectMethodsPos();
1379   }
HasNextVirtualMethod()1380   bool HasNextVirtualMethod() const {
1381     return pos_ >= EndOfDirectMethodsPos() && pos_ < EndOfVirtualMethodsPos();
1382   }
HasNext()1383   bool HasNext() const {
1384     return pos_ < EndOfVirtualMethodsPos();
1385   }
Next()1386   inline void Next() {
1387     pos_++;
1388     if (pos_ < EndOfStaticFieldsPos()) {
1389       last_idx_ = GetMemberIndex();
1390       ReadClassDataField();
1391     } else if (pos_ == EndOfStaticFieldsPos() && NumInstanceFields() > 0) {
1392       last_idx_ = 0;  // transition to next array, reset last index
1393       ReadClassDataField();
1394     } else if (pos_ < EndOfInstanceFieldsPos()) {
1395       last_idx_ = GetMemberIndex();
1396       ReadClassDataField();
1397     } else if (pos_ == EndOfInstanceFieldsPos() && NumDirectMethods() > 0) {
1398       last_idx_ = 0;  // transition to next array, reset last index
1399       ReadClassDataMethod();
1400     } else if (pos_ < EndOfDirectMethodsPos()) {
1401       last_idx_ = GetMemberIndex();
1402       ReadClassDataMethod();
1403     } else if (pos_ == EndOfDirectMethodsPos() && NumVirtualMethods() > 0) {
1404       last_idx_ = 0;  // transition to next array, reset last index
1405       ReadClassDataMethod();
1406     } else if (pos_ < EndOfVirtualMethodsPos()) {
1407       last_idx_ = GetMemberIndex();
1408       ReadClassDataMethod();
1409     } else {
1410       DCHECK(!HasNext());
1411     }
1412   }
GetMemberIndex()1413   uint32_t GetMemberIndex() const {
1414     if (pos_ < EndOfInstanceFieldsPos()) {
1415       return last_idx_ + field_.field_idx_delta_;
1416     } else {
1417       DCHECK_LT(pos_, EndOfVirtualMethodsPos());
1418       return last_idx_ + method_.method_idx_delta_;
1419     }
1420   }
GetRawMemberAccessFlags()1421   uint32_t GetRawMemberAccessFlags() const {
1422     if (pos_ < EndOfInstanceFieldsPos()) {
1423       return field_.access_flags_;
1424     } else {
1425       DCHECK_LT(pos_, EndOfVirtualMethodsPos());
1426       return method_.access_flags_;
1427     }
1428   }
GetFieldAccessFlags()1429   uint32_t GetFieldAccessFlags() const {
1430     return GetRawMemberAccessFlags() & kAccValidFieldFlags;
1431   }
GetMethodAccessFlags()1432   uint32_t GetMethodAccessFlags() const {
1433     return GetRawMemberAccessFlags() & kAccValidMethodFlags;
1434   }
MemberIsNative()1435   bool MemberIsNative() const {
1436     return GetRawMemberAccessFlags() & kAccNative;
1437   }
MemberIsFinal()1438   bool MemberIsFinal() const {
1439     return GetRawMemberAccessFlags() & kAccFinal;
1440   }
GetMethodInvokeType(const DexFile::ClassDef & class_def)1441   InvokeType GetMethodInvokeType(const DexFile::ClassDef& class_def) const {
1442     if (HasNextDirectMethod()) {
1443       if ((GetRawMemberAccessFlags() & kAccStatic) != 0) {
1444         return kStatic;
1445       } else {
1446         return kDirect;
1447       }
1448     } else {
1449       DCHECK_EQ(GetRawMemberAccessFlags() & kAccStatic, 0U);
1450       if ((class_def.access_flags_ & kAccInterface) != 0) {
1451         return kInterface;
1452       } else if ((GetRawMemberAccessFlags() & kAccConstructor) != 0) {
1453         return kSuper;
1454       } else {
1455         return kVirtual;
1456       }
1457     }
1458   }
GetMethodCodeItem()1459   const DexFile::CodeItem* GetMethodCodeItem() const {
1460     return dex_file_.GetCodeItem(method_.code_off_);
1461   }
GetMethodCodeItemOffset()1462   uint32_t GetMethodCodeItemOffset() const {
1463     return method_.code_off_;
1464   }
DataPointer()1465   const uint8_t* DataPointer() const {
1466     return ptr_pos_;
1467   }
EndDataPointer()1468   const uint8_t* EndDataPointer() const {
1469     CHECK(!HasNext());
1470     return ptr_pos_;
1471   }
1472 
1473  private:
1474   // A dex file's class_data_item is leb128 encoded, this structure holds a decoded form of the
1475   // header for a class_data_item
1476   struct ClassDataHeader {
1477     uint32_t static_fields_size_;  // the number of static fields
1478     uint32_t instance_fields_size_;  // the number of instance fields
1479     uint32_t direct_methods_size_;  // the number of direct methods
1480     uint32_t virtual_methods_size_;  // the number of virtual methods
1481   } header_;
1482 
1483   // Read and decode header from a class_data_item stream into header
1484   void ReadClassDataHeader();
1485 
EndOfStaticFieldsPos()1486   uint32_t EndOfStaticFieldsPos() const {
1487     return header_.static_fields_size_;
1488   }
EndOfInstanceFieldsPos()1489   uint32_t EndOfInstanceFieldsPos() const {
1490     return EndOfStaticFieldsPos() + header_.instance_fields_size_;
1491   }
EndOfDirectMethodsPos()1492   uint32_t EndOfDirectMethodsPos() const {
1493     return EndOfInstanceFieldsPos() + header_.direct_methods_size_;
1494   }
EndOfVirtualMethodsPos()1495   uint32_t EndOfVirtualMethodsPos() const {
1496     return EndOfDirectMethodsPos() + header_.virtual_methods_size_;
1497   }
1498 
1499   // A decoded version of the field of a class_data_item
1500   struct ClassDataField {
1501     uint32_t field_idx_delta_;  // delta of index into the field_ids array for FieldId
1502     uint32_t access_flags_;  // access flags for the field
ClassDataFieldClassDataField1503     ClassDataField() :  field_idx_delta_(0), access_flags_(0) {}
1504 
1505    private:
1506     DISALLOW_COPY_AND_ASSIGN(ClassDataField);
1507   };
1508   ClassDataField field_;
1509 
1510   // Read and decode a field from a class_data_item stream into field
1511   void ReadClassDataField();
1512 
1513   // A decoded version of the method of a class_data_item
1514   struct ClassDataMethod {
1515     uint32_t method_idx_delta_;  // delta of index into the method_ids array for MethodId
1516     uint32_t access_flags_;
1517     uint32_t code_off_;
ClassDataMethodClassDataMethod1518     ClassDataMethod() : method_idx_delta_(0), access_flags_(0), code_off_(0) {}
1519 
1520    private:
1521     DISALLOW_COPY_AND_ASSIGN(ClassDataMethod);
1522   };
1523   ClassDataMethod method_;
1524 
1525   // Read and decode a method from a class_data_item stream into method
1526   void ReadClassDataMethod();
1527 
1528   const DexFile& dex_file_;
1529   size_t pos_;  // integral number of items passed
1530   const uint8_t* ptr_pos_;  // pointer into stream of class_data_item
1531   uint32_t last_idx_;  // last read field or method index to apply delta to
1532   DISALLOW_IMPLICIT_CONSTRUCTORS(ClassDataItemIterator);
1533 };
1534 
1535 class EncodedStaticFieldValueIterator {
1536  public:
1537   // A constructor for static tools. You cannot call
1538   // ReadValueToField() for an object created by this.
1539   EncodedStaticFieldValueIterator(const DexFile& dex_file,
1540                                   const DexFile::ClassDef& class_def);
1541 
1542   // A constructor meant to be called from runtime code.
1543   EncodedStaticFieldValueIterator(const DexFile& dex_file,
1544                                   Handle<mirror::DexCache>* dex_cache,
1545                                   Handle<mirror::ClassLoader>* class_loader,
1546                                   ClassLinker* linker,
1547                                   const DexFile::ClassDef& class_def)
1548       SHARED_REQUIRES(Locks::mutator_lock_);
1549 
1550   template<bool kTransactionActive>
1551   void ReadValueToField(ArtField* field) const SHARED_REQUIRES(Locks::mutator_lock_);
1552 
HasNext()1553   bool HasNext() const { return pos_ < array_size_; }
1554 
1555   void Next();
1556 
1557   enum ValueType {
1558     kByte = 0x00,
1559     kShort = 0x02,
1560     kChar = 0x03,
1561     kInt = 0x04,
1562     kLong = 0x06,
1563     kFloat = 0x10,
1564     kDouble = 0x11,
1565     kString = 0x17,
1566     kType = 0x18,
1567     kField = 0x19,
1568     kMethod = 0x1a,
1569     kEnum = 0x1b,
1570     kArray = 0x1c,
1571     kAnnotation = 0x1d,
1572     kNull = 0x1e,
1573     kBoolean = 0x1f
1574   };
1575 
GetValueType()1576   ValueType GetValueType() const { return type_; }
GetJavaValue()1577   const jvalue& GetJavaValue() const { return jval_; }
1578 
1579  private:
1580   EncodedStaticFieldValueIterator(const DexFile& dex_file,
1581                                   Handle<mirror::DexCache>* dex_cache,
1582                                   Handle<mirror::ClassLoader>* class_loader,
1583                                   ClassLinker* linker,
1584                                   const DexFile::ClassDef& class_def,
1585                                   size_t pos,
1586                                   ValueType type);
1587 
1588   static constexpr uint8_t kEncodedValueTypeMask = 0x1f;  // 0b11111
1589   static constexpr uint8_t kEncodedValueArgShift = 5;
1590 
1591   const DexFile& dex_file_;
1592   Handle<mirror::DexCache>* const dex_cache_;  // Dex cache to resolve literal objects.
1593   Handle<mirror::ClassLoader>* const class_loader_;  // ClassLoader to resolve types.
1594   ClassLinker* linker_;  // Linker to resolve literal objects.
1595   size_t array_size_;  // Size of array.
1596   size_t pos_;  // Current position.
1597   const uint8_t* ptr_;  // Pointer into encoded data array.
1598   ValueType type_;  // Type of current encoded value.
1599   jvalue jval_;  // Value of current encoded value.
1600   DISALLOW_IMPLICIT_CONSTRUCTORS(EncodedStaticFieldValueIterator);
1601 };
1602 std::ostream& operator<<(std::ostream& os, const EncodedStaticFieldValueIterator::ValueType& code);
1603 
1604 class CatchHandlerIterator {
1605   public:
1606     CatchHandlerIterator(const DexFile::CodeItem& code_item, uint32_t address);
1607 
1608     CatchHandlerIterator(const DexFile::CodeItem& code_item,
1609                          const DexFile::TryItem& try_item);
1610 
CatchHandlerIterator(const uint8_t * handler_data)1611     explicit CatchHandlerIterator(const uint8_t* handler_data) {
1612       Init(handler_data);
1613     }
1614 
GetHandlerTypeIndex()1615     uint16_t GetHandlerTypeIndex() const {
1616       return handler_.type_idx_;
1617     }
GetHandlerAddress()1618     uint32_t GetHandlerAddress() const {
1619       return handler_.address_;
1620     }
1621     void Next();
HasNext()1622     bool HasNext() const {
1623       return remaining_count_ != -1 || catch_all_;
1624     }
1625     // End of this set of catch blocks, convenience method to locate next set of catch blocks
EndDataPointer()1626     const uint8_t* EndDataPointer() const {
1627       CHECK(!HasNext());
1628       return current_data_;
1629     }
1630 
1631   private:
1632     void Init(const DexFile::CodeItem& code_item, int32_t offset);
1633     void Init(const uint8_t* handler_data);
1634 
1635     struct CatchHandlerItem {
1636       uint16_t type_idx_;  // type index of the caught exception type
1637       uint32_t address_;  // handler address
1638     } handler_;
1639     const uint8_t* current_data_;  // the current handler in dex file.
1640     int32_t remaining_count_;   // number of handlers not read.
1641     bool catch_all_;            // is there a handler that will catch all exceptions in case
1642                                 // that all typed handler does not match.
1643 };
1644 
1645 }  // namespace art
1646 
1647 #endif  // ART_RUNTIME_DEX_FILE_H_
1648