blob: db82a9bf20737606c4df96b6e46d68abe804be24 [file] [log] [blame]
Mathieu Chartier7b074bf2017-09-25 16:22:36 -07001/*
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
David Sehr334b9d72018-02-12 18:27:56 -080017#ifndef ART_LIBDEXFILE_DEX_STANDARD_DEX_FILE_H_
18#define ART_LIBDEXFILE_DEX_STANDARD_DEX_FILE_H_
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070019
20#include <iosfwd>
21
22#include "dex_file.h"
23
24namespace art {
25
26class OatDexFile;
27
Mathieu Chartier292567e2017-10-12 13:24:38 -070028// Standard dex file. This is the format that is packaged in APKs and produced by tools.
29class StandardDexFile : public DexFile {
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070030 public:
Mathieu Chartierf95a75e2017-11-03 15:25:52 -070031 class Header : public DexFile::Header {
32 // Same for now.
33 };
34
Andreas Gampe3f1dcd32018-12-28 09:39:56 -080035 struct CodeItem : public dex::CodeItem {
Mathieu Chartierfa3db3d2018-01-12 14:42:18 -080036 static constexpr size_t kAlignment = 4;
37
Mathieu Chartier69147f12017-11-06 20:02:24 -080038 private:
Mathieu Chartier8892c6b2018-01-09 15:10:17 -080039 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;
Mathieu Chartier6238c832018-01-04 09:55:13 -080060 friend class StandardDexFile;
Mathieu Chartier69147f12017-11-06 20:02:24 -080061 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
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070070 static const uint8_t kDexMagic[kDexMagicSize];
Ulya Trafimovichab5f4c12019-08-16 13:59:11 +010071 static constexpr size_t kNumDexVersions = 5;
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070072 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);
Roland Levillainf73caca2018-08-24 17:19:07 +010076 bool IsMagicValid() const override;
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070077
78 // Returns true if the byte string after the magic is the correct value.
79 static bool IsVersionValid(const uint8_t* magic);
Roland Levillainf73caca2018-08-24 17:19:07 +010080 bool IsVersionValid() const override;
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070081
Roland Levillainf73caca2018-08-24 17:19:07 +010082 bool SupportsDefaultMethods() const override;
Mathieu Chartierf6e31472017-12-28 13:32:08 -080083
Andreas Gampe3f1dcd32018-12-28 09:39:56 -080084 uint32_t GetCodeItemSize(const dex::CodeItem& item) const override;
Mathieu Chartier6238c832018-01-04 09:55:13 -080085
Roland Levillainf73caca2018-08-24 17:19:07 +010086 size_t GetDequickenedSize() const override {
Nicolas Geoffray16fc4742019-01-30 16:53:24 +000087 // 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);
Alex Lightca97ada2018-02-02 09:25:31 -080091 }
92
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070093 private:
David Sehr0b426772018-07-03 23:03:42 +000094 StandardDexFile(const uint8_t* base,
95 size_t size,
Mathieu Chartier292567e2017-10-12 13:24:38 -070096 const std::string& location,
97 uint32_t location_checksum,
David Sehr0b426772018-07-03 23:03:42 +000098 const OatDexFile* oat_dex_file,
99 std::unique_ptr<DexFileContainer> container)
100 : DexFile(base,
101 size,
102 /*data_begin*/ base,
103 /*data_size*/ size,
Mathieu Chartier69147f12017-11-06 20:02:24 -0800104 location,
105 location_checksum,
106 oat_dex_file,
David Sehr0b426772018-07-03 23:03:42 +0000107 std::move(container),
Mathieu Chartier69147f12017-11-06 20:02:24 -0800108 /*is_compact_dex*/ false) {}
Mathieu Chartier7b074bf2017-09-25 16:22:36 -0700109
Mathieu Chartier79c87da2017-10-10 11:54:29 -0700110 friend class DexFileLoader;
Mathieu Chartier7b074bf2017-09-25 16:22:36 -0700111 friend class DexFileVerifierTest;
112
113 ART_FRIEND_TEST(ClassLinkerTest, RegisterDexFileName); // for constructor
Mathieu Chartierfa3db3d2018-01-12 14:42:18 -0800114 friend class OptimizingUnitTestHelper; // for constructor
Mathieu Chartier7b074bf2017-09-25 16:22:36 -0700115
Mathieu Chartier292567e2017-10-12 13:24:38 -0700116 DISALLOW_COPY_AND_ASSIGN(StandardDexFile);
Mathieu Chartier7b074bf2017-09-25 16:22:36 -0700117};
118
119} // namespace art
120
David Sehr334b9d72018-02-12 18:27:56 -0800121#endif // ART_LIBDEXFILE_DEX_STANDARD_DEX_FILE_H_