15867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com/* 25867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * [The "BSD licence"] 300fc68adf2e39aeb9fed35293f2576bbe729ec4bJesusFreke@JesusFreke.com * Copyright (c) 2010 Ben Gruver (JesusFreke) 45867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * All rights reserved. 55867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 65867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * Redistribution and use in source and binary forms, with or without 75867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * modification, are permitted provided that the following conditions 85867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * are met: 95867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 1. Redistributions of source code must retain the above copyright 105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer. 115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 2. Redistributions in binary form must reproduce the above copyright 125867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer in the 135867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * documentation and/or other materials provided with the distribution. 145867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 3. The name of the author may not be used to endorse or promote products 155867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * derived from this software without specific prior written permission. 165867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 175867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 185867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 195867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 205867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 265867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 285867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 295867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.compackage org.jf.dexlib; 305867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 3194abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruverimport com.google.common.base.Preconditions; 325867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.comimport org.jf.dexlib.Util.AnnotatedOutput; 335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.comimport org.jf.dexlib.Util.Input; 345867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.comimport org.jf.dexlib.Util.Utf8Utils; 355867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 365867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.compublic class HeaderItem extends Item<HeaderItem> { 375867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 385867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * the file format magic number, represented as the 395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * low-order bytes of a string 405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 4196b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver public static final byte[][] MAGIC_VALUES = new byte[][] { 4296b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver new byte[] {0x64, 0x65, 0x78, 0x0A, 0x30, 0x33, 0x35, 0x00}, //"dex\n035" + '\0'; 4396b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver new byte[] {0x64, 0x65, 0x78, 0x0A, 0x30, 0x33, 0x36, 0x00}}; //"dex\n036" + '\0'; 445867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 455867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 465867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** size of this section, in bytes */ 475867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com private static final int HEADER_SIZE = 0x70; 485867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 495867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** the endianness constants */ 505867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com private static final int LITTLE_ENDIAN = 0x12345678; 511f1f0122924bdd3f623abdb65dec4852bc1252c8Ben Gruver private static final int BIG_ENDIAN = 0x78563412; 525867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 5396b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver /* Which magic value to use when writing out the header item */ 5496b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver private int magic_index = 0; 5596b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver 5694abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver private boolean checksumSignatureSet = false; 5794abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver private int checksum; 5894abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver private byte[] signature; 5994abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver 605867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 615867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * Create a new uninitialized <code>HeaderItem</code> 625867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param dexFile The <code>DexFile</code> containing this <code>HeaderItem</code> 635867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 645867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected HeaderItem(final DexFile dexFile) { 655867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com super(dexFile); 665867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 675867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 685867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** {@inheritDoc} */ 695867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected void readItem(Input in, ReadContext readContext) { 705867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com byte[] readMagic = in.readBytes(8); 715867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 7296b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver boolean success = false; 7396b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver for (int i=0; i<MAGIC_VALUES.length; i++) { 7496b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver byte[] magic_value = MAGIC_VALUES[i]; 7596b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver boolean matched = true; 760d57d427948557fbc1ee1b96a7556360116b7377Ben Gruver for (int j=0; j<8; j++) { 7796b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver if (magic_value[j] != readMagic[j]) { 7896b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver matched = false; 7996b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver break; 8096b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver } 8196b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver } 8296b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver if (matched) { 8396b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver success = true; 8496b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver magic_index = i; 8596b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver break; 865867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 875867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 885867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 8996b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver if (!success) { 9096b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver throw new RuntimeException("Unrecognized dex magic value"); 9196b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver } 9296b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver 9394abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver checksum = in.readInt(); //checksum 9494abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver signature = in.readBytes(20); //signature 9594abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver checksumSignatureSet = true; 9694abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver 975867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com in.readInt(); //filesize 983cf9e0c1e50f04cfca5e512b3f671922b990d37eBen Gruver in.readInt(); //header size 995867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1005867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com int endianTag = in.readInt(); 1015867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com if (endianTag == BIG_ENDIAN) { 1025867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com throw new RuntimeException("This dex file is big endian. Only little endian is currently supported."); 1035867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } else if (endianTag != LITTLE_ENDIAN) { 1045867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com throw new RuntimeException("The endian tag is not 0x12345678 or 0x78563412"); 1055867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 1065867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 107fadcc2dcb90d9ce6374351d75111dc475d6f9826jesusfreke@jesusfreke.com //link_size + link_off 108fadcc2dcb90d9ce6374351d75111dc475d6f9826jesusfreke@jesusfreke.com if ((in.readInt() | in.readInt()) != 0) { 109fadcc2dcb90d9ce6374351d75111dc475d6f9826jesusfreke@jesusfreke.com System.err.println("This dex file has a link section, which is not supported. Ignoring."); 1105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 1115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1125867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com int sectionSize; 1135867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com int sectionOffset; 1145867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1155867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com //map_offset 1165867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionOffset = in.readInt(); 1175867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com readContext.addSection(ItemType.TYPE_MAP_LIST, 1, sectionOffset); 1185867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1195867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com //string_id_item 1205867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionSize = in.readInt(); 1215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionOffset = in.readInt(); 1225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com readContext.addSection(ItemType.TYPE_STRING_ID_ITEM, sectionSize, sectionOffset); 1235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com //type_id_item 1255867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionSize = in.readInt(); 1265867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionOffset = in.readInt(); 1275867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com readContext.addSection(ItemType.TYPE_TYPE_ID_ITEM, sectionSize, sectionOffset); 1285867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1295867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com //proto_id_item 1305867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionSize = in.readInt(); 1315867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionOffset = in.readInt(); 1325867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com readContext.addSection(ItemType.TYPE_PROTO_ID_ITEM, sectionSize, sectionOffset); 1335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1345867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com //field_id_item 1355867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionSize = in.readInt(); 1365867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionOffset = in.readInt(); 1375867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com readContext.addSection(ItemType.TYPE_FIELD_ID_ITEM, sectionSize, sectionOffset); 1385867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com //method_id_item 1405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionSize = in.readInt(); 1415867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionOffset = in.readInt(); 1425867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com readContext.addSection(ItemType.TYPE_METHOD_ID_ITEM, sectionSize, sectionOffset); 1435867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1445867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com //class_data_item 1455867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionSize = in.readInt(); 1465867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com sectionOffset = in.readInt(); 1475867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com readContext.addSection(ItemType.TYPE_CLASS_DEF_ITEM, sectionSize, sectionOffset); 1485867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1495867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com in.readInt(); //data_size 1505867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com in.readInt(); //data_off 1515867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 1525867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 15396b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver /** 15496b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver * Sets the dex version number. 15596b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver * 15696b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver * 35 is the default. 15796b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver * 36 is for dex files that use extended opcodes (only works with ICS+) 15896b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver * 15996b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver * @param version - must be either 35 or 36 16096b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver */ 16196b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver public void setVersion(int version) { 16296b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver if (version == 35) { 16396b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver magic_index = 0; 16496b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver return; 16596b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver } 16696b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver if (version == 36) { 16796b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver magic_index = 1; 16896b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver return; 16996b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver } 17096b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver throw new RuntimeException("Invalid dex version number passed to setVersion"); 17196b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver } 17296b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver 1735867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** {@inheritDoc} */ 1745867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected int placeItem(int offset) { 1755867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com return HEADER_SIZE; 1765867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 1775867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1785867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** {@inheritDoc} */ 1795867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected void writeItem(AnnotatedOutput out) { 1805867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com StringBuilder magicBuilder = new StringBuilder(); 1815867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com for (int i=0; i<8; i++) { 18296b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver magicBuilder.append((char)MAGIC_VALUES[magic_index][i]); 1835867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 1845867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1855867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("magic: " + Utf8Utils.escapeString(magicBuilder.toString())); 18696b803c8821bac22418e48f976adf0132e3d9b24Ben Gruver out.write(MAGIC_VALUES[magic_index]); 1875867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1885867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("checksum"); 1895867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(0); 1905867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1915867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("signature"); 1925867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.write(new byte[20]); 1935867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1945867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("file_size: 0x" + Integer.toHexString(dexFile.getFileSize()) + " (" + dexFile.getFileSize() + 1955867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com " bytes)"); 1965867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.getFileSize()); 1975867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1985867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("header_size: 0x" + Integer.toHexString(HEADER_SIZE)); 1995867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(HEADER_SIZE); 2005867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2015867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("endian_tag: 0x" + Integer.toHexString(LITTLE_ENDIAN)); 2025867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(LITTLE_ENDIAN); 2035867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2045867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("link_size: 0"); 2055867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(0); 2065867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2075867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("link_off: 0"); 2085867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(0); 2095867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("map_off: 0x" + Integer.toHexString(dexFile.MapItem.getOffset())); 2115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.MapItem.getOffset()); 2125867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2135867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("string_ids_size: " + dexFile.StringIdsSection.getItems().size()); 2145867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.StringIdsSection.getItems().size()); 2155867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2165867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("string_ids_off: 0x" + Integer.toHexString(dexFile.StringIdsSection.getOffset())); 2175867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.StringIdsSection.getOffset()); 2185867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2195867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("type_ids_size: " + dexFile.TypeIdsSection.getItems().size()); 2205867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.TypeIdsSection.getItems().size()); 2215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("type_ids_off: 0x" + Integer.toHexString(dexFile.TypeIdsSection.getOffset())); 2235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.TypeIdsSection.getOffset()); 2245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2255867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("proto_ids_size: " + dexFile.ProtoIdsSection.getItems().size()); 2265867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.ProtoIdsSection.getItems().size()); 2275867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2285867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("proto_ids_off: 0x" + Integer.toHexString(dexFile.ProtoIdsSection.getOffset())); 2295867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.ProtoIdsSection.getOffset()); 2305867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2315867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("field_ids_size: " + dexFile.FieldIdsSection.getItems().size()); 2325867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.FieldIdsSection.getItems().size()); 2335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2345867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("field_ids_off: 0x" + Integer.toHexString(dexFile.FieldIdsSection.getOffset())); 2355867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.FieldIdsSection.getOffset()); 2365867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2375867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("method_ids_size: " + dexFile.MethodIdsSection.getItems().size()); 2385867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.MethodIdsSection.getItems().size()); 2395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("method_ids_off: 0x" + Integer.toHexString(dexFile.MethodIdsSection.getOffset())); 2415867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.MethodIdsSection.getOffset()); 2425867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2435867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("class_defs_size: " + dexFile.ClassDefsSection.getItems().size()); 2445867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.ClassDefsSection.getItems().size()); 2455867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2465867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("class_defs_off: 0x" + Integer.toHexString(dexFile.ClassDefsSection.getOffset())); 2475867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.ClassDefsSection.getOffset()); 2485867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2495867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("data_size: 0x" + Integer.toHexString(dexFile.getDataSize()) + " (" + dexFile.getDataSize() + 2505867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com " bytes)"); 2515867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.getDataSize()); 2525867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2535867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.annotate("data_off: 0x" + Integer.toHexString(dexFile.getDataOffset())); 2545867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com out.writeInt(dexFile.getDataOffset()); 2555867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 2565867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2575867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** {@inheritDoc} */ 2585867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com public ItemType getItemType() { 2595867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com return ItemType.TYPE_HEADER_ITEM; 2605867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 2615867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2625867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** {@inheritDoc} */ 2635867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com public String getConciseIdentity() { 2645867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com return "header_item"; 2655867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 2665867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2675867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** {@inheritDoc} */ 2685867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com public int compareTo(HeaderItem o) { 2695867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com //there is only 1 header item 2705867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com return 0; 2715867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 27294abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver 27394abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver /** 27494abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * Get the checksum that was originally stored as part of this header item 27594abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * 27694abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * Note that this should only be called if this HeaderItem is from a DexFile that was read from disk, as opposed 27794abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * to one that is created from scratch. 27894abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * 27994abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * @return The addler32 checksum (as an integer) of the dex file 28094abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver */ 28194abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver public int getChecksum() { 28294abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver Preconditions.checkState(checksumSignatureSet, 28394abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver "This can only be called on a DexFile that was read from disk."); 28494abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver return checksum; 28594abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver } 28694abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver 28794abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver /** 28894abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * Get the signature that was originally stored as part of this header item 28994abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * 29094abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * Note that this should only be called if this HeaderItem is from a DexFile that was read from disk, as opposed 29194abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * to one that is created from scratch. 29294abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * 29394abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver * @return The sha1 checksum of the dex file, as a 20-element byte array 29494abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver */ 29594abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver public byte[] getSignature() { 29694abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver Preconditions.checkState(checksumSignatureSet, 29794abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver "This can only be called on a DexFile that was read from disk."); 29894abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver return signature; 29994abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver } 30094abcd3332bbc12b4f1099bdd5d93ea8b6fb9c89Ben Gruver 3015867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com} 302