118b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver/* 218b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * Copyright 2013, Google Inc. 318b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * All rights reserved. 418b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * 518b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * Redistribution and use in source and binary forms, with or without 618b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * modification, are permitted provided that the following conditions are 718b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * met: 818b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * 918b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * * Redistributions of source code must retain the above copyright 1018b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * notice, this list of conditions and the following disclaimer. 1118b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * * Redistributions in binary form must reproduce the above 1218b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * copyright notice, this list of conditions and the following disclaimer 1318b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * in the documentation and/or other materials provided with the 1418b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * distribution. 1518b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * * Neither the name of Google Inc. nor the names of its 1618b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * contributors may be used to endorse or promote products derived from 1718b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * this software without specific prior written permission. 1818b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * 1918b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2018b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2118b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2218b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2318b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2418b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2518b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2618b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2718b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2818b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2918b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3018b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver */ 3118b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver 3218b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruverpackage org.jf.dexlib2.dexbacked.raw; 3318b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver 3418b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruverimport org.jf.dexlib2.dexbacked.DexBackedDexFile; 358f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruverimport org.jf.dexlib2.dexbacked.raw.util.DexAnnotator; 36ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverimport org.jf.dexlib2.util.AnnotatedBytes; 3718b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver 3818b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruverimport javax.annotation.Nonnull; 398f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruverimport javax.annotation.Nullable; 4018b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver 4118b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruverpublic class TypeListItem { 42ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver public static final int SIZE_OFFSET = 0; 43ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver public static final int LIST_OFFSET = 4; 44ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 45ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver @Nonnull 468f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) { 478f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver return new SectionAnnotator(annotator, mapItem) { 48ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver @Nonnull @Override public String getItemName() { 49ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver return "type_list"; 50ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver } 51ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 52ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver @Override 538f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) { 54ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver int size = dexFile.readSmallUint(out.getCursor()); 55ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver out.annotate(4, "size: %d", size); 56ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 57ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver for (int i=0; i<size; i++) { 58ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver int typeIndex = dexFile.readUshort(out.getCursor()); 59ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver out.annotate(2, TypeIdItem.getReferenceAnnotation(dexFile, typeIndex)); 60ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver } 61ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver } 62ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 63ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver @Override public int getItemAlignment() { 64ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver return 4; 65ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver } 66ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver }; 67ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver } 68ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 6918b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver @Nonnull 7018b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int typeListOffset) { 7118b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver if (typeListOffset == 0) { 72a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver return "type_list_item[NO_OFFSET]"; 7318b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver } 7418b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver 7518b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver try { 7618b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver String typeList = asString(dexFile, typeListOffset); 7718b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver return String.format("type_list_item[0x%x]: %s", typeListOffset, typeList); 7818b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver } catch (Exception ex) { 7918b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver ex.printStackTrace(System.err); 8018b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver } 8118b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver return String.format("type_list_item[0x%x]", typeListOffset); 8218b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver } 8318b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver 8418b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver @Nonnull 8518b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver public static String asString(@Nonnull DexBackedDexFile dexFile, int typeListOffset) { 8618b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver if (typeListOffset == 0) { 8718b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver return ""; 8818b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver } 8918b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver 9018b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver StringBuilder sb = new StringBuilder(); 9118b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver 9218b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver int size = dexFile.readSmallUint(typeListOffset); 9318b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver for (int i=0; i<size; i++) { 9418b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver int typeIndex = dexFile.readUshort(typeListOffset + 4 + i*2); 9518b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver String type = dexFile.getType(typeIndex); 9618b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver sb.append(type); 9718b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver } 9818b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver return sb.toString(); 9918b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver } 10018b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver} 101