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