1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16e377ef62a40267ab16c2dd20cc5f4c63af6397ccDan Bornstein 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Access .dex (Dalvik Executable Format) files. The code here assumes that 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the DEX file has been rewritten (byte-swapped, word-aligned) and that 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the contents can be directly accessed as a collection of C arrays. Please 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * see docs/dalvik/dex-format.html for a detailed description. 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The structure and field names were chosen to match those in the DEX spec. 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * It's generally assumed that the DEX file will be stored in shared memory, 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * obviating the need to copy code and constant pool entries into newly 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * allocated storage. Maintaining local pointers to items in the shared area 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is valid and encouraged. 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * All memory-mapped structures are 32-bit aligned unless otherwise noted. 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 32e377ef62a40267ab16c2dd20cc5f4c63af6397ccDan Bornstein 33375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef LIBDEX_DEXFILE_H_ 34375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define LIBDEX_DEXFILE_H_ 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "vm/Common.h" // basic type defs, e.g. u1/u2/u4/u8, and LOG 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "libdex/SysUtil.h" 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * gcc-style inline management -- ensures we have a copy of all functions 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in the library, so code that links against us will work whether or not 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * it was built with optimizations enabled. 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef _DEX_GEN_INLINES /* only defined by DexInlines.c */ 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define DEX_INLINE extern __inline__ 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define DEX_INLINE 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* DEX file magic number */ 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define DEX_MAGIC "dex\n" 529fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein 539fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein/* current version, encoded in 4 bytes of ASCII */ 549fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein#define DEX_MAGIC_VERS "036\0" 559fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein 569fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein/* 579fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein * older but still-recognized version (corresponding to Android API 589fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein * levels 13 and earlier 599fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein */ 609fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein#define DEX_MAGIC_VERS_API_13 "035\0" 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* same, but for optimized DEX header */ 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define DEX_OPT_MAGIC "dey\n" 647d18e38e260d79df8144908b28033b800d5d7470Andy McFadden#define DEX_OPT_MAGIC_VERS "036\0" 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define DEX_DEP_MAGIC "deps" 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 160-bit SHA-1 digest. 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { kSHA1DigestLen = 20, 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kSHA1DigestOutputLen = kSHA1DigestLen*2 +1 }; 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* general constants */ 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexEndianConstant = 0x12345678, /* the endianness indicator */ 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexNoIndex = 0xffffffff, /* not a valid index value */ 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 81a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * Enumeration of all the primitive types. 82a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein */ 83bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiroenum PrimitiveType { 84a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein PRIM_NOT = 0, /* value is a reference type, not a primitive type */ 85a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein PRIM_VOID = 1, 86a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein PRIM_BOOLEAN = 2, 87a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein PRIM_BYTE = 3, 88a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein PRIM_SHORT = 4, 89a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein PRIM_CHAR = 5, 90a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein PRIM_INT = 6, 91a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein PRIM_LONG = 7, 92a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein PRIM_FLOAT = 8, 93a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein PRIM_DOUBLE = 9, 94bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 95a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein 96a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein/* 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * access flags and masks; the "standard" ones are all <= 0x4000 98de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: There are related declarations in vm/oo/Object.h in the ClassFlags 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * enum. 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_PUBLIC = 0x00000001, // class, field, method, ic 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_PRIVATE = 0x00000002, // field, method, ic 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_PROTECTED = 0x00000004, // field, method, ic 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_STATIC = 0x00000008, // field, method, ic 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_FINAL = 0x00000010, // class, field, method, ic 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_SYNCHRONIZED = 0x00000020, // method (only allowed on natives) 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_SUPER = 0x00000020, // class (not used in Dalvik) 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_VOLATILE = 0x00000040, // field 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_BRIDGE = 0x00000040, // method (1.5) 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_TRANSIENT = 0x00000080, // field 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_VARARGS = 0x00000080, // method (1.5) 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_NATIVE = 0x00000100, // method 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_INTERFACE = 0x00000200, // class, ic 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_ABSTRACT = 0x00000400, // class, method, ic 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_STRICT = 0x00000800, // method 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_SYNTHETIC = 0x00001000, // field, method, ic 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_ANNOTATION = 0x00002000, // class, ic (1.5) 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_ENUM = 0x00004000, // class, field, ic (1.5) 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_CONSTRUCTOR = 0x00010000, // method (Dalvik only) 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_DECLARED_SYNCHRONIZED = 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 0x00020000, // method (Dalvik only) 124de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro ACC_CLASS_MASK = 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (ACC_PUBLIC | ACC_FINAL | ACC_INTERFACE | ACC_ABSTRACT 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project | ACC_SYNTHETIC | ACC_ANNOTATION | ACC_ENUM), 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_INNER_CLASS_MASK = 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (ACC_CLASS_MASK | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC), 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_FIELD_MASK = 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project | ACC_VOLATILE | ACC_TRANSIENT | ACC_SYNTHETIC | ACC_ENUM), 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ACC_METHOD_MASK = 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project | ACC_SYNCHRONIZED | ACC_BRIDGE | ACC_VARARGS | ACC_NATIVE 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project | ACC_ABSTRACT | ACC_STRICT | ACC_SYNTHETIC | ACC_CONSTRUCTOR 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project | ACC_DECLARED_SYNCHRONIZED), 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* annotation constants */ 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexVisibilityBuild = 0x00, /* annotation visibility */ 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexVisibilityRuntime = 0x01, 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexVisibilitySystem = 0x02, 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationByte = 0x00, 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationShort = 0x02, 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationChar = 0x03, 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationInt = 0x04, 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationLong = 0x06, 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationFloat = 0x10, 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationDouble = 0x11, 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationString = 0x17, 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationType = 0x18, 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationField = 0x19, 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationMethod = 0x1a, 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationEnum = 0x1b, 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationArray = 0x1c, 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationAnnotation = 0x1d, 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationNull = 0x1e, 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationBoolean = 0x1f, 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationValueTypeMask = 0x1f, /* low 5 bits */ 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexAnnotationValueArgShift = 5, 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* map item type codes */ 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeHeaderItem = 0x0000, 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeStringIdItem = 0x0001, 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeTypeIdItem = 0x0002, 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeProtoIdItem = 0x0003, 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeFieldIdItem = 0x0004, 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeMethodIdItem = 0x0005, 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeClassDefItem = 0x0006, 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeMapList = 0x1000, 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeTypeList = 0x1001, 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeAnnotationSetRefList = 0x1002, 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeAnnotationSetItem = 0x1003, 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeClassDataItem = 0x2000, 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeCodeItem = 0x2001, 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeStringDataItem = 0x2002, 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeDebugInfoItem = 0x2003, 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeAnnotationItem = 0x2004, 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeEncodedArrayItem = 0x2005, 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexTypeAnnotationsDirectoryItem = 0x2006, 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* auxillary data section chunk codes */ 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexChunkClassLookup = 0x434c4b50, /* CLKP */ 19199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project kDexChunkRegisterMaps = 0x524d4150, /* RMAP */ 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexChunkEnd = 0x41454e44, /* AEND */ 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* debug info opcodes and constants */ 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_END_SEQUENCE = 0x00, 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_ADVANCE_PC = 0x01, 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_ADVANCE_LINE = 0x02, 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_START_LOCAL = 0x03, 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_START_LOCAL_EXTENDED = 0x04, 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_END_LOCAL = 0x05, 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_RESTART_LOCAL = 0x06, 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_SET_PROLOGUE_END = 0x07, 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_SET_EPILOGUE_BEGIN = 0x08, 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_SET_FILE = 0x09, 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_FIRST_SPECIAL = 0x0a, 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_LINE_BASE = -4, 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DBG_LINE_RANGE = 15, 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "header_item" struct. 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 216bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexHeader { 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1 magic[8]; /* includes version number */ 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 checksum; /* adler32 checksum */ 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1 signature[kSHA1DigestLen]; /* SHA-1 hash */ 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 fileSize; /* length of entire file */ 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 headerSize; /* offset to start of next section */ 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 endianTag; 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 linkSize; 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 linkOff; 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 mapOff; 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 stringIdsSize; 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 stringIdsOff; 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 typeIdsSize; 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 typeIdsOff; 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 protoIdsSize; 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 protoIdsOff; 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 fieldIdsSize; 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 fieldIdsOff; 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 methodIdsSize; 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 methodIdsOff; 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 classDefsSize; 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 classDefsOff; 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 dataSize; 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 dataOff; 240bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "map_item". 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 245bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexMapItem { 246bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro u2 type; /* type code (see kDexType* above) */ 247bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro u2 unused; 248bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro u4 size; /* count of items of the indicated type */ 249bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro u4 offset; /* file offset to the start of data */ 250bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "map_list". 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 255bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexMapList { 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 size; /* #of entries in list */ 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DexMapItem list[1]; /* entries */ 258bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "string_id_item". 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 263bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexStringId { 264bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro u4 stringDataOff; /* file offset to string_data_item */ 265bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "type_id_item". 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 270bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexTypeId { 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 descriptorIdx; /* index into stringIds list for type descriptor */ 272bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "field_id_item". 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 277bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexFieldId { 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 classIdx; /* index into typeIds list for defining class */ 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 typeIdx; /* index into typeIds for field type */ 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 nameIdx; /* index into stringIds for field name */ 281bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "method_id_item". 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 286bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexMethodId { 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 classIdx; /* index into typeIds list for defining class */ 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 protoIdx; /* index into protoIds for method prototype */ 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 nameIdx; /* index into stringIds for method name */ 290bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "proto_id_item". 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 295bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexProtoId { 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 shortyIdx; /* index into stringIds for shorty descriptor */ 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 returnTypeIdx; /* index into typeIds list for return type */ 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 parametersOff; /* file offset to type_list for parameter types */ 299bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "class_def_item". 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 304bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexClassDef { 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 classIdx; /* index into typeIds for this class */ 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 accessFlags; 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 superclassIdx; /* index into typeIds for superclass */ 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 interfacesOff; /* file offset to DexTypeList */ 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 sourceFileIdx; /* index into stringIds for source file name */ 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 annotationsOff; /* file offset to annotations_directory_item */ 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 classDataOff; /* file offset to class_data_item */ 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 staticValuesOff; /* file offset to DexEncodedArray */ 313bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "type_item". 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 318bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexTypeItem { 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 typeIdx; /* index into typeIds */ 320bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "type_list". 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 325bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexTypeList { 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 size; /* #of entries in list */ 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DexTypeItem list[1]; /* entries */ 328bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "code_item". 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "catches" table is used when throwing an exception, 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "debugInfo" is used when displaying an exception stack trace or 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * debugging. An offset of zero indicates that there are no entries. 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 337bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexCode { 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 registersSize; 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 insSize; 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 outsSize; 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 triesSize; 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 debugInfoOff; /* file offset to debug info stream */ 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 insnsSize; /* size of the insns array, in u2 units */ 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 insns[1]; 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* followed by optional u2 padding */ 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* followed by try_item[triesSize] */ 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* followed by uleb128 handlersSize */ 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* followed by catch_handler_item[handlersSize] */ 349bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "try_item". 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 354bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexTry { 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 startAddr; /* start address, in 16-bit code units */ 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 insnCount; /* instruction count, in 16-bit code units */ 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 handlerOff; /* offset in encoded handler data to handlers */ 358bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Link table. Currently undefined. 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 363bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexLink { 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1 bleargh; 365bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "annotations_directory_item". 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 371bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexAnnotationsDirectoryItem { 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 classAnnotationsOff; /* offset to DexAnnotationSetItem */ 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 fieldsSize; /* count of DexFieldAnnotationsItem */ 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 methodsSize; /* count of DexMethodAnnotationsItem */ 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 parametersSize; /* count of DexParameterAnnotationsItem */ 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* followed by DexFieldAnnotationsItem[fieldsSize] */ 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* followed by DexMethodAnnotationsItem[methodsSize] */ 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* followed by DexParameterAnnotationsItem[parametersSize] */ 379bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "field_annotations_item". 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 384bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexFieldAnnotationsItem { 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 fieldIdx; 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 annotationsOff; /* offset to DexAnnotationSetItem */ 387bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "method_annotations_item". 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 392bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexMethodAnnotationsItem { 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 methodIdx; 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 annotationsOff; /* offset to DexAnnotationSetItem */ 395bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "parameter_annotations_item". 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 400bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexParameterAnnotationsItem { 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 methodIdx; 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 annotationsOff; /* offset to DexAnotationSetRefList */ 403bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "annotation_set_ref_item". 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 408bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexAnnotationSetRefItem { 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 annotationsOff; /* offset to DexAnnotationSetItem */ 410bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "annotation_set_ref_list". 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 415bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexAnnotationSetRefList { 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 size; 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DexAnnotationSetRefItem list[1]; 418bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 421c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson * Direct-mapped "annotation_set_item". 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 423bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexAnnotationSetItem { 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 size; 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 entries[1]; /* offset to DexAnnotationItem */ 426bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "annotation_item". 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NOTE: this structure is byte-aligned. 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 433bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexAnnotationItem { 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1 visibility; 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1 annotation[1]; /* data in encoded_annotation format */ 436bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "encoded_array". 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NOTE: this structure is byte-aligned. 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 443bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexEncodedArray { 444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1 array[1]; /* data in encoded_array format */ 445bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Lookup table for classes. It provides a mapping from class name to 449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * class definition. Used by dexFindClass(). 450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We calculate this at DEX optimization time and embed it in the file so we 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * don't need the same hash table in every VM. This is slightly slower than 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a hash table with direct pointers to the items, but because it's shared 454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * there's less of a penalty for using a fairly sparse table. 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 456bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexClassLookup { 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int size; // total size, including "size" 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int numEntries; // size of table[]; always power of 2 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct { 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 classDescriptorHash; // class descriptor hash code 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int classDescriptorOffset; // in bytes, from start of DEX 462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int classDefOffset; // in bytes, from start of DEX 463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } table[1]; 464bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Header added by DEX optimization pass. Values are always written in 468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * local byte and structure padding. The first field (magic + version) 469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is guaranteed to be present and directly readable for all expected 470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * compiler configurations; the rest is version-dependent. 471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Try to keep this simple and fixed-size. 473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 474bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexOptHeader { 475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1 magic[8]; /* includes version number */ 476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 dexOffset; /* file offset of DEX header */ 478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 dexLength; 479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 depsOffset; /* offset of optimized DEX dependency table */ 480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 depsLength; 481e377ef62a40267ab16c2dd20cc5f4c63af6397ccDan Bornstein u4 optOffset; /* file offset of optimized data tables */ 482e377ef62a40267ab16c2dd20cc5f4c63af6397ccDan Bornstein u4 optLength; 483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 flags; /* some info flags */ 485e377ef62a40267ab16c2dd20cc5f4c63af6397ccDan Bornstein u4 checksum; /* adler32 checksum covering deps/opt */ 486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4877d18e38e260d79df8144908b28033b800d5d7470Andy McFadden /* pad for 64-bit alignment if necessary */ 488bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define DEX_OPT_FLAG_BIG (1<<1) /* swapped to big-endian */ 491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define DEX_INTERFACE_CACHE_SIZE 128 /* must be power of 2 */ 493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Structure representing a DEX file. 496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Code should regard DexFile as opaque, using the API calls provided here 498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to access specific structures. 499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 500bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexFile { 501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* directly-mapped "opt" header */ 502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexOptHeader* pOptHeader; 503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* pointers to directly-mapped structs and arrays in base DEX */ 505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexHeader* pHeader; 506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexStringId* pStringIds; 507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexTypeId* pTypeIds; 508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFieldId* pFieldIds; 509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexMethodId* pMethodIds; 510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexProtoId* pProtoIds; 511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexClassDef* pClassDefs; 512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexLink* pLinkData; 513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /* 51599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * These are mapped out of the "auxillary" section, and may not be 51699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * included in the file. 51799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project */ 518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexClassLookup* pClassLookup; 51999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project const void* pRegisterMapPool; // RegisterMapClassPool 520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* points to start of DEX file data */ 522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u1* baseAddr; 523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* track memory overhead for auxillary structures */ 525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int overhead; 526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* additional app-specific data structures associated with the DEX */ 528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //void* auxData; 529bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro}; 530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Utility function -- rounds up to the nearest power of 2. 533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu4 dexRoundUpPower2(u4 val); 535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Parse an optimized or unoptimized .dex file sitting in memory. 538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On success, return a newly-allocated DexFile. 540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDexFile* dexFileParse(const u1* data, size_t length, int flags); 542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* bit values for "flags" argument to dexFileParse */ 544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { 545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexParseDefault = 0, 546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexParseVerifyChecksum = 1, 547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project kDexParseContinueOnError = (1 << 1), 548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 5514b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * Fix the byte ordering of all fields in the DEX file, and do 5524b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * structural verification. This is only required for code that opens 5534b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * "raw" DEX files, such as the DEX optimizer. 554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return 0 on success. 556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5574b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornsteinint dexSwapAndVerify(u1* addr, int len); 5584b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein 5594b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein/* 5604b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * Detect the file type of the given memory buffer via magic number. 5614b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * Call dexSwapAndVerify() on an unoptimized DEX file, do nothing 5624b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * but return successfully on an optimized DEX file, and report an 5634b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * error for all other cases. 5644b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * 5654b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * Return 0 on success. 5664b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein */ 5674b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornsteinint dexSwapAndVerifyIfNecessary(u1* addr, int len); 568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 5709fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein * Check to see if the file magic and format version in the given 5719fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein * header are recognized as valid. Returns true if they are 5729fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein * acceptable. 5739fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein */ 5749fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornsteinbool dexHasValidMagic(const DexHeader* pHeader); 5759fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein 5769fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein/* 577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compute DEX checksum. 578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu4 dexComputeChecksum(const DexHeader* pHeader); 580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Free a DexFile structure, along with any associated structures. 583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dexFileFree(DexFile* pDexFile); 585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create class lookup table. 588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDexClassLookup* dexCreateClassLookup(DexFile* pDexFile); 590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Find a class definition by descriptor. 593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst DexClassDef* dexFindClass(const DexFile* pFile, const char* descriptor); 595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Set up the basic raw data pointers of a DexFile. This function isn't 598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * meant for general use. 599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dexFileSetupBasicPointers(DexFile* pDexFile, const u1* data); 601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the DexMapList of the file, if any */ 603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexMapList* dexGetMap(const DexFile* pDexFile) { 604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 mapOff = pDexFile->pHeader->mapOff; 605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (mapOff == 0) { 607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const DexMapList*) (pDexFile->baseAddr + mapOff); 610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the const char* string data referred to by the given string_id */ 614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexGetStringData(const DexFile* pDexFile, 615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexStringId* pStringId) { 616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u1* ptr = pDexFile->baseAddr + pStringId->stringDataOff; 617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Skip the uleb128 length. 619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (*(ptr++) > 0x7f) /* empty */ ; 620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const char*) ptr; 622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the StringId with the specified index */ 624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexStringId* dexGetStringId(const DexFile* pDexFile, u4 idx) { 625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(idx < pDexFile->pHeader->stringIdsSize); 626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return &pDexFile->pStringIds[idx]; 627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the UTF-8 encoded string with the specified string_id index */ 629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexStringById(const DexFile* pDexFile, u4 idx) { 630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexStringId* pStringId = dexGetStringId(pDexFile, idx); 631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dexGetStringData(pDexFile, pStringId); 632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Return the UTF-8 encoded string with the specified string_id index, 635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * also filling in the UTF-16 size (number of 16-bit code points).*/ 636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst char* dexStringAndSizeById(const DexFile* pDexFile, u4 idx, 637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4* utf16Size); 638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the TypeId with the specified index */ 640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexTypeId* dexGetTypeId(const DexFile* pDexFile, u4 idx) { 641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(idx < pDexFile->pHeader->typeIdsSize); 642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return &pDexFile->pTypeIds[idx]; 643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the descriptor string associated with a given type index. 647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The caller should not free() the returned string. 648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexStringByTypeIdx(const DexFile* pDexFile, u4 idx) { 650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexTypeId* typeId = dexGetTypeId(pDexFile, idx); 651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dexStringById(pDexFile, typeId->descriptorIdx); 652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the MethodId with the specified index */ 655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexMethodId* dexGetMethodId(const DexFile* pDexFile, u4 idx) { 656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(idx < pDexFile->pHeader->methodIdsSize); 657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return &pDexFile->pMethodIds[idx]; 658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the FieldId with the specified index */ 661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexFieldId* dexGetFieldId(const DexFile* pDexFile, u4 idx) { 662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(idx < pDexFile->pHeader->fieldIdsSize); 663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return &pDexFile->pFieldIds[idx]; 664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the ProtoId with the specified index */ 667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexProtoId* dexGetProtoId(const DexFile* pDexFile, u4 idx) { 668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(idx < pDexFile->pHeader->protoIdsSize); 669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return &pDexFile->pProtoIds[idx]; 670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the parameter list from a ProtoId. The returns NULL if the ProtoId 674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * does not have a parameter list. 675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexTypeList* dexGetProtoParameters( 677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile *pDexFile, const DexProtoId* pProtoId) { 678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pProtoId->parametersOff == 0) { 679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const DexTypeList*) 682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (pDexFile->baseAddr + pProtoId->parametersOff); 683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the ClassDef with the specified index */ 686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexClassDef* dexGetClassDef(const DexFile* pDexFile, u4 idx) { 687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(idx < pDexFile->pHeader->classDefsSize); 688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return &pDexFile->pClassDefs[idx]; 689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project/* given a ClassDef pointer, recover its index */ 69299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source ProjectDEX_INLINE u4 dexGetIndexForClassDef(const DexFile* pDexFile, 69399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project const DexClassDef* pClassDef) 69499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project{ 69599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project assert(pClassDef >= pDexFile->pClassDefs && 69699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project pClassDef < pDexFile->pClassDefs + pDexFile->pHeader->classDefsSize); 69799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project return pClassDef - pDexFile->pClassDefs; 69899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project} 69999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project 700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the interface list for a DexClass */ 701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexTypeList* dexGetInterfacesList(const DexFile* pDexFile, 702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexClassDef* pClassDef) 703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pClassDef->interfacesOff == 0) 705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const DexTypeList*) 707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (pDexFile->baseAddr + pClassDef->interfacesOff); 708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the Nth entry in a DexTypeList. */ 710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexTypeItem* dexGetTypeItem(const DexTypeList* pList, 711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 idx) 712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(idx < pList->size); 714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return &pList->list[idx]; 715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the type_idx for the Nth entry in a TypeList */ 717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE u4 dexTypeListGetIdx(const DexTypeList* pList, u4 idx) { 718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexTypeItem* pItem = dexGetTypeItem(pList, idx); 719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pItem->typeIdx; 720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the static values list for a DexClass */ 723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexEncodedArray* dexGetStaticValuesList( 724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexClassDef* pClassDef) 725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pClassDef->staticValuesOff == 0) 727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const DexEncodedArray*) 729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (pDexFile->baseAddr + pClassDef->staticValuesOff); 730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the annotations directory item for a DexClass */ 733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationsDirectoryItem* dexGetAnnotationsDirectoryItem( 734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexClassDef* pClassDef) 735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pClassDef->annotationsOff == 0) 737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const DexAnnotationsDirectoryItem*) 739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (pDexFile->baseAddr + pClassDef->annotationsOff); 740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the source file string */ 743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexGetSourceFile( 744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexClassDef* pClassDef) 745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pClassDef->sourceFileIdx == 0xffffffff) 747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dexStringById(pDexFile, pClassDef->sourceFileIdx); 749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 751b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden/* get the size, in bytes, of a DexCode */ 752b51ea11c70602918c42764bfafe92a997d3b1803Andy McFaddensize_t dexGetDexCodeSize(const DexCode* pCode); 753b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden 754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Get the list of "tries" for the given DexCode. */ 755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexTry* dexGetTries(const DexCode* pCode) { 756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u2* insnsEnd = &pCode->insns[pCode->insnsSize]; 757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Round to four bytes. 759b210a9f9c7ae17e2028a86d9a4e9a3b35472862aSangWook Han if ((((uintptr_t) insnsEnd) & 3) != 0) { 760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project insnsEnd++; 761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 762de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const DexTry*) insnsEnd; 764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Get the base of the encoded data for the given DexCode. */ 767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const u1* dexGetCatchHandlerData(const DexCode* pCode) { 768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexTry* pTries = dexGetTries(pCode); 769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const u1*) &pTries[pCode->triesSize]; 770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 772b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden/* get a pointer to the start of the debugging data */ 773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const u1* dexGetDebugInfoStream(const DexFile* pDexFile, 774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexCode* pCode) 775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pCode->debugInfoOff == 0) { 777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pDexFile->baseAddr + pCode->debugInfoOff; 780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* DexClassDef convenience - get class descriptor */ 784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexGetClassDescriptor(const DexFile* pDexFile, 785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexClassDef* pClassDef) 786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dexStringByTypeIdx(pDexFile, pClassDef->classIdx); 788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* DexClassDef convenience - get superclass descriptor */ 791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexGetSuperClassDescriptor(const DexFile* pDexFile, 792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexClassDef* pClassDef) 793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pClassDef->superclassIdx == 0) 795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dexStringByTypeIdx(pDexFile, pClassDef->superclassIdx); 797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* DexClassDef convenience - get class_data_item pointer */ 800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const u1* dexGetClassData(const DexFile* pDexFile, 801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexClassDef* pClassDef) 802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pClassDef->classDataOff == 0) 804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const u1*) (pDexFile->baseAddr + pClassDef->classDataOff); 806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Get an annotation set at a particular offset. */ 809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetItem* dexGetAnnotationSetItem( 810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, u4 offset) 811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 8124f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes if (offset == 0) { 8134f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes return NULL; 8144f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes } 815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const DexAnnotationSetItem*) (pDexFile->baseAddr + offset); 816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the class' annotation set */ 818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetItem* dexGetClassAnnotationSet( 819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexAnnotationsDirectoryItem* pAnnoDir) 820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dexGetAnnotationSetItem(pDexFile, pAnnoDir->classAnnotationsOff); 822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the class' field annotation list */ 825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexFieldAnnotationsItem* dexGetFieldAnnotations( 826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexAnnotationsDirectoryItem* pAnnoDir) 827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pAnnoDir->fieldsSize == 0) 829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Skip past the header to the start of the field annotations. 832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const DexFieldAnnotationsItem*) &pAnnoDir[1]; 833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get field annotation list size */ 836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE int dexGetFieldAnnotationsSize(const DexFile* pDexFile, 837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexAnnotationsDirectoryItem* pAnnoDir) 838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pAnnoDir->fieldsSize; 840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return a pointer to the field's annotation set */ 843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetItem* dexGetFieldAnnotationSetItem( 844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexFieldAnnotationsItem* pItem) 845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dexGetAnnotationSetItem(pDexFile, pItem->annotationsOff); 847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the class' method annotation list */ 850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexMethodAnnotationsItem* dexGetMethodAnnotations( 851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexAnnotationsDirectoryItem* pAnnoDir) 852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pAnnoDir->methodsSize == 0) 854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Skip past the header and field annotations to the start of the 858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * method annotations. 859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u1* addr = (const u1*) &pAnnoDir[1]; 861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project addr += pAnnoDir->fieldsSize * sizeof (DexFieldAnnotationsItem); 862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const DexMethodAnnotationsItem*) addr; 863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get method annotation list size */ 866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE int dexGetMethodAnnotationsSize(const DexFile* pDexFile, 867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexAnnotationsDirectoryItem* pAnnoDir) 868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pAnnoDir->methodsSize; 870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return a pointer to the method's annotation set */ 873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetItem* dexGetMethodAnnotationSetItem( 874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexMethodAnnotationsItem* pItem) 875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dexGetAnnotationSetItem(pDexFile, pItem->annotationsOff); 877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the class' parameter annotation list */ 880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexParameterAnnotationsItem* dexGetParameterAnnotations( 881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexAnnotationsDirectoryItem* pAnnoDir) 882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pAnnoDir->parametersSize == 0) 884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NULL; 885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Skip past the header, field annotations, and method annotations 888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to the start of the parameter annotations. 889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u1* addr = (const u1*) &pAnnoDir[1]; 891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project addr += pAnnoDir->fieldsSize * sizeof (DexFieldAnnotationsItem); 892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project addr += pAnnoDir->methodsSize * sizeof (DexMethodAnnotationsItem); 893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (const DexParameterAnnotationsItem*) addr; 894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get method annotation list size */ 897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE int dexGetParameterAnnotationsSize(const DexFile* pDexFile, 898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexAnnotationsDirectoryItem* pAnnoDir) 899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pAnnoDir->parametersSize; 901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the parameter annotation ref list */ 904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetRefList* dexGetParameterAnnotationSetRefList( 905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexParameterAnnotationsItem* pItem) 906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 9074f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes if (pItem->annotationsOff == 0) { 9084f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes return NULL; 9094f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes } 9104f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes return (const DexAnnotationSetRefList*) (pDexFile->baseAddr + pItem->annotationsOff); 911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get method annotation list size */ 914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE int dexGetParameterAnnotationSetRefSize(const DexFile* pDexFile, 915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexParameterAnnotationsItem* pItem) 916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 9174f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes if (pItem->annotationsOff == 0) { 918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 0; 9194f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes } 920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dexGetParameterAnnotationSetRefList(pDexFile, pItem)->size; 921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the Nth entry from an annotation set ref list */ 924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetRefItem* dexGetParameterAnnotationSetRef( 925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexAnnotationSetRefList* pList, u4 idx) 926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(idx < pList->size); 928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return &pList->list[idx]; 929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* given a DexAnnotationSetRefItem, return the DexAnnotationSetItem */ 932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetItem* dexGetSetRefItemItem( 933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexAnnotationSetRefItem* pItem) 934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dexGetAnnotationSetItem(pDexFile, pItem->annotationsOff); 936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the Nth annotation offset from a DexAnnotationSetItem */ 939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE u4 dexGetAnnotationOff( 940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexAnnotationSetItem* pAnnoSet, u4 idx) 941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(idx < pAnnoSet->size); 943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return pAnnoSet->entries[idx]; 944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the Nth annotation item from a DexAnnotationSetItem */ 947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationItem* dexGetAnnotationItem( 948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const DexFile* pDexFile, const DexAnnotationSetItem* pAnnoSet, u4 idx) 949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 9504f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes u4 offset = dexGetAnnotationOff(pAnnoSet, idx); 9514f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes if (offset == 0) { 9524f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes return NULL; 9534f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes } 9544f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes return (const DexAnnotationItem*) (pDexFile->baseAddr + offset); 955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 957a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein/* 958a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * Get the type descriptor character associated with a given primitive 959a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * type. This returns '\0' if the type is invalid. 960a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein */ 961a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornsteinchar dexGetPrimitiveTypeDescriptorChar(PrimitiveType type); 962a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein 963a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein/* 964a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * Get the type descriptor string associated with a given primitive 965a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * type. 966a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein */ 967a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornsteinconst char* dexGetPrimitiveTypeDescriptor(PrimitiveType type); 968a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein 969a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein/* 970a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * Get the boxed type descriptor string associated with a given 971a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * primitive type. This returns NULL for an invalid type, including 9721553988115a2ecfce43eedebc488e0a8b8dea847Dan Bornstein * particularly for type "void". In the latter case, even though there 9731553988115a2ecfce43eedebc488e0a8b8dea847Dan Bornstein * is a class Void, there's no such thing as a boxed instance of it. 974a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein */ 975a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornsteinconst char* dexGetBoxedTypeDescriptor(PrimitiveType type); 976a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein 977a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein/* 978a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * Get the primitive type constant from the given descriptor character. 979a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * This returns PRIM_NOT (note: this is a 0) if the character is invalid 980a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * as a primitive type descriptor. 981a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein */ 982a9c49df6714b3a37b7a7d0522932e622be2b35acDan BornsteinPrimitiveType dexGetPrimitiveTypeFromDescriptorChar(char descriptorChar); 983a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein 984375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // LIBDEX_DEXFILE_H_ 985