1 /* 2 * Copyright (C) 2017 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_LIBDEXFILE_DEX_STANDARD_DEX_FILE_H_ 18 #define ART_LIBDEXFILE_DEX_STANDARD_DEX_FILE_H_ 19 20 #include <iosfwd> 21 22 #include "dex_file.h" 23 24 namespace art { 25 26 class OatDexFile; 27 28 // Standard dex file. This is the format that is packaged in APKs and produced by tools. 29 class StandardDexFile : public DexFile { 30 public: 31 class Header : public DexFile::Header { 32 // Same for now. 33 }; 34 35 struct CodeItem : public dex::CodeItem { 36 static constexpr size_t kAlignment = 4; 37 38 private: 39 CodeItem() = default; 40 41 uint16_t registers_size_; // the number of registers used by this code 42 // (locals + parameters) 43 uint16_t ins_size_; // the number of words of incoming arguments to the method 44 // that this code is for 45 uint16_t outs_size_; // the number of words of outgoing argument space required 46 // by this code for method invocation 47 uint16_t tries_size_; // the number of try_items for this instance. If non-zero, 48 // then these appear as the tries array just after the 49 // insns in this instance. 50 uint32_t debug_info_off_; // Holds file offset to debug info stream. 51 52 uint32_t insns_size_in_code_units_; // size of the insns array, in 2 byte code units 53 uint16_t insns_[1]; // actual array of bytecode. 54 55 ART_FRIEND_TEST(CodeItemAccessorsTest, TestDexInstructionsAccessor); 56 friend class CodeItemDataAccessor; 57 friend class CodeItemDebugInfoAccessor; 58 friend class CodeItemInstructionAccessor; 59 friend class DexWriter; 60 friend class StandardDexFile; 61 DISALLOW_COPY_AND_ASSIGN(CodeItem); 62 }; 63 64 // Write the standard dex specific magic. 65 static void WriteMagic(uint8_t* magic); 66 67 // Write the current version, note that the input is the address of the magic. 68 static void WriteCurrentVersion(uint8_t* magic); 69 70 static const uint8_t kDexMagic[kDexMagicSize]; 71 static constexpr size_t kNumDexVersions = 4; 72 static const uint8_t kDexMagicVersions[kNumDexVersions][kDexVersionLen]; 73 74 // Returns true if the byte string points to the magic value. 75 static bool IsMagicValid(const uint8_t* magic); 76 bool IsMagicValid() const override; 77 78 // Returns true if the byte string after the magic is the correct value. 79 static bool IsVersionValid(const uint8_t* magic); 80 bool IsVersionValid() const override; 81 82 bool SupportsDefaultMethods() const override; 83 84 uint32_t GetCodeItemSize(const dex::CodeItem& item) const override; 85 GetDequickenedSize()86 size_t GetDequickenedSize() const override { 87 // JVMTI will run dex layout on standard dex files that have hidden API data, 88 // in order to remove that data. As dexlayout may increase the size of the dex file, 89 // be (very) conservative and add one MB to the size. 90 return Size() + (HasHiddenapiClassData() ? 1 * MB : 0); 91 } 92 93 private: StandardDexFile(const uint8_t * base,size_t size,const std::string & location,uint32_t location_checksum,const OatDexFile * oat_dex_file,std::unique_ptr<DexFileContainer> container)94 StandardDexFile(const uint8_t* base, 95 size_t size, 96 const std::string& location, 97 uint32_t location_checksum, 98 const OatDexFile* oat_dex_file, 99 std::unique_ptr<DexFileContainer> container) 100 : DexFile(base, 101 size, 102 /*data_begin*/ base, 103 /*data_size*/ size, 104 location, 105 location_checksum, 106 oat_dex_file, 107 std::move(container), 108 /*is_compact_dex*/ false) {} 109 110 friend class DexFileLoader; 111 friend class DexFileVerifierTest; 112 113 ART_FRIEND_TEST(ClassLinkerTest, RegisterDexFileName); // for constructor 114 friend class OptimizingUnitTestHelper; // for constructor 115 116 DISALLOW_COPY_AND_ASSIGN(StandardDexFile); 117 }; 118 119 } // namespace art 120 121 #endif // ART_LIBDEXFILE_DEX_STANDARD_DEX_FILE_H_ 122