185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver/* 285fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * Copyright 2013, Google Inc. 385fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * All rights reserved. 485fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * 585fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * Redistribution and use in source and binary forms, with or without 685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * modification, are permitted provided that the following conditions are 785fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * met: 885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * 985fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * * Redistributions of source code must retain the above copyright 1085fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * notice, this list of conditions and the following disclaimer. 1185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * * Redistributions in binary form must reproduce the above 1285fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * copyright notice, this list of conditions and the following disclaimer 1385fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * in the documentation and/or other materials provided with the 1485fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * distribution. 1585fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * * Neither the name of Google Inc. nor the names of its 1685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * contributors may be used to endorse or promote products derived from 1785fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * this software without specific prior written permission. 1885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * 1985fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2085fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2285fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2385fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2485fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2585fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2785fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2985fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3085fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver */ 3185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver 3285fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruverpackage org.jf.dexlib2.dexbacked.raw; 3385fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver 3485fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruverimport org.jf.dexlib2.dexbacked.DexBackedDexFile; 358f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruverimport org.jf.dexlib2.dexbacked.raw.util.DexAnnotator; 3685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruverimport org.jf.dexlib2.util.AnnotatedBytes; 3785fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver 3885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruverimport javax.annotation.Nonnull; 398f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruverimport javax.annotation.Nullable; 4085fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver 4185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruverpublic class TypeIdItem { 4285fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver public static final int ITEM_SIZE = 4; 4385fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver 4418b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver @Nonnull 458f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) { 468f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver return new SectionAnnotator(annotator, mapItem) { 4778612c755447a47945d7179a688120856db0a76dBen Gruver @Nonnull @Override public String getItemName() { 4878612c755447a47945d7179a688120856db0a76dBen Gruver return "type_id_item"; 4978612c755447a47945d7179a688120856db0a76dBen Gruver } 5085fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver 5178612c755447a47945d7179a688120856db0a76dBen Gruver @Override 528f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) { 5378612c755447a47945d7179a688120856db0a76dBen Gruver int stringIndex = dexFile.readSmallUint(out.getCursor()); 5478612c755447a47945d7179a688120856db0a76dBen Gruver out.annotate(4, StringIdItem.getReferenceAnnotation(dexFile, stringIndex)); 5585fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver } 5685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver }; 5785fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver } 5885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver 5918b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver @Nonnull 605b71582325a2e9df14f627d731b46a91ee8064c5Ben Gruver public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int typeIndex) { 6185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver try { 625b71582325a2e9df14f627d731b46a91ee8064c5Ben Gruver String typeString = dexFile.getType(typeIndex); 6318b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver return String.format("type_id_item[%d]: %s", typeIndex, typeString); 6485fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver } catch (Exception ex) { 6585fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver ex.printStackTrace(System.err); 6685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver } 675b71582325a2e9df14f627d731b46a91ee8064c5Ben Gruver return String.format("type_id_item[%d]", typeIndex); 6885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver } 69a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver 70a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver @Nonnull 71a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver public static String getOptionalReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int typeIndex) { 72a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver if (typeIndex == -1) { 73a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver return "type_id_item[NO_INDEX]"; 74a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver } 75a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver return getReferenceAnnotation(dexFile, typeIndex); 76a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver } 77132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver 78132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver public static String[] getTypes(@Nonnull RawDexFile dexFile) { 79132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver MapItem mapItem = dexFile.getMapItemForSection(ItemType.TYPE_ID_ITEM); 80132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver if (mapItem == null) { 81132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver return new String[0]; 82132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver } 83132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver 84132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver int typeCount = mapItem.getItemCount(); 85132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver String[] ret = new String[typeCount]; 86132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver for (int i=0; i<typeCount; i++) { 87132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver ret[i] = dexFile.getType(i); 88132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver } 89132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver return ret; 90132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver } 9185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver} 92