1959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle/* 2959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Copyright (C) 2014 The Android Open Source Project 3959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * 4959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Licensed under the Apache License, Version 2.0 (the "License"); 5959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * you may not use this file except in compliance with the License. 6959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * You may obtain a copy of the License at 7959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * 8959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * http://www.apache.org/licenses/LICENSE-2.0 9959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * 10959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Unless required by applicable law or agreed to in writing, software 11959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * distributed under the License is distributed on an "AS IS" BASIS, 12959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * See the License for the specific language governing permissions and 14959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * limitations under the License. 15959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */ 16959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 17959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepackage dexfuzz.rawdex; 18959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 19959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.Log; 20959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 21959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.io.IOException; 22959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.ArrayList; 23959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.List; 24959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 25959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepublic class MapList implements RawDexObject { 26959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 27959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private RawDexFile rawDexFile; 28959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 29959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public int size; 30959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public List<MapItem> mapItems; 31959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 32959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public MapList(RawDexFile rawDexFile) { 33959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle this.rawDexFile = rawDexFile; 34959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 35959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 36959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 37959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void read(DexRandomAccessFile file) throws IOException { 38959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Find the map list. 39959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle file.seek(rawDexFile.header.mapOff.getOriginalOffset()); 40959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 41959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle file.getOffsetTracker().getNewOffsettable(file, this); 42959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 43959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Get the number of entries. 44959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle size = file.readUInt(); 45959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 46959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Allocate and populate the array. 47959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle mapItems = new ArrayList<MapItem>(size); 48959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < size; i++) { 49959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle MapItem mapItem = new MapItem(); 50959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle mapItems.add(mapItem); 51959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle mapItem.read(file); 52959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 53959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 54959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle file.getOffsetTracker().rememberPointAfterMapList(); 55959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 56959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // NB: We track the current index into the MapList, so when we encounter the DebugInfoItem 57959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // MapItem, we know how to find the next MapItem, so we know how large the DebugInfo 58959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // area is, so we can copy it as a blob. 59959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int mapItemIdx = 0; 60959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 61959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Iterate through the list, and create all the other data structures. 62959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (MapItem mapItem : mapItems) { 63959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle file.seek(mapItem.offset.getOriginalOffset()); 64959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle switch (mapItem.type) { 65959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_HEADER_ITEM: 66959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Already read it; skip. 67959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 68959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_STRING_ID_ITEM: 69959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 70959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle StringIdItem newStringId = new StringIdItem(); 71959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.stringIds.add(newStringId); 72959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newStringId.read(file); 73959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 74959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 75959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_TYPE_ID_ITEM: 76959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 77959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle TypeIdItem newTypeId = new TypeIdItem(); 78959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.typeIds.add(newTypeId); 79959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newTypeId.read(file); 80959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 81959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 82959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_PROTO_ID_ITEM: 83959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 84959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle ProtoIdItem newProtoId = new ProtoIdItem(); 85959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.protoIds.add(newProtoId); 86959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newProtoId.read(file); 87959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 88959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 89959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_FIELD_ID_ITEM: 90959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 91959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle FieldIdItem newFieldId = new FieldIdItem(); 92959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.fieldIds.add(newFieldId); 93959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newFieldId.read(file); 94959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 95959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 96959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_METHOD_ID_ITEM: 97959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 98959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle MethodIdItem newMethodId = new MethodIdItem(); 99959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.methodIds.add(newMethodId); 100959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newMethodId.read(file); 101959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 102959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 103959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_CLASS_DEF_ITEM: 104959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 105959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle ClassDefItem newClassDef = new ClassDefItem(); 106959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.classDefs.add(newClassDef); 107959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newClassDef.read(file); 108959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 109959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 110959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_MAP_LIST: 111959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Already read it; skip. 112959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 113959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_TYPE_LIST: 114959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.typeLists = new ArrayList<TypeList>(mapItem.size); 115959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 116959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle TypeList newTypeList = new TypeList(); 117959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.typeLists.add(newTypeList); 118959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newTypeList.read(file); 119959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 120959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 121959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_ANNOTATION_SET_REF_LIST: 122959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.annotationSetRefLists = 123959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle new ArrayList<AnnotationSetRefList>(mapItem.size); 124959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 125959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle AnnotationSetRefList newAnnotationSetRefList = new AnnotationSetRefList(); 126959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.annotationSetRefLists.add(newAnnotationSetRefList); 127959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newAnnotationSetRefList.read(file); 128959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 129959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 130959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_ANNOTATION_SET_ITEM: 131959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.annotationSetItems = new ArrayList<AnnotationSetItem>(mapItem.size); 132959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 133959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle AnnotationSetItem newAnnotationSetItem = new AnnotationSetItem(); 134959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.annotationSetItems.add(newAnnotationSetItem); 135959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newAnnotationSetItem.read(file); 136959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 137959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 138959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_CLASS_DATA_ITEM: 139959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.classDatas = new ArrayList<ClassDataItem>(mapItem.size); 140959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 141959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle ClassDataItem newClassData = new ClassDataItem(); 142959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.classDatas.add(newClassData); 143959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newClassData.read(file); 144959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 145959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 146959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_CODE_ITEM: 147959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.codeItems = new ArrayList<CodeItem>(mapItem.size); 148959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 149959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle CodeItem newCodeItem = new CodeItem(); 150959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.codeItems.add(newCodeItem); 151959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newCodeItem.read(file); 152959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 153959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 154959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_STRING_DATA_ITEM: 155959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.stringDatas = new ArrayList<StringDataItem>(mapItem.size); 156959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 157959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle StringDataItem newStringData = new StringDataItem(); 158959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.stringDatas.add(newStringData); 159959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newStringData.read(file); 160959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 161959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 162959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_DEBUG_INFO_ITEM: 163959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle { 164959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // We aren't interested in updating the debug data, so just read it as a blob. 165959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int start = mapItem.offset.getOriginalOffset(); 166959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int end = mapItems.get(mapItemIdx + 1).offset.getOriginalOffset(); 167959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int size = end - start; 168959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.debugInfoItem = new DebugInfoItem(size); 169959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.debugInfoItem.read(file); 170959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 171959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 172959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_ANNOTATION_ITEM: 173959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.annotationItems = new ArrayList<AnnotationItem>(mapItem.size); 174959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 175959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle AnnotationItem newAnnotationItem = new AnnotationItem(); 176959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.annotationItems.add(newAnnotationItem); 177959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newAnnotationItem.read(file); 178959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 179959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 180959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_ENCODED_ARRAY_ITEM: 181959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.encodedArrayItems = new ArrayList<EncodedArrayItem>(mapItem.size); 182959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 183959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle EncodedArrayItem newEncodedArrayItem = new EncodedArrayItem(); 184959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.encodedArrayItems.add(newEncodedArrayItem); 185959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newEncodedArrayItem.read(file); 186959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 187959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 188959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case MapItem.TYPE_ANNOTATIONS_DIRECTORY_ITEM: 189959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.annotationsDirectoryItems = 190959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle new ArrayList<AnnotationsDirectoryItem>(mapItem.size); 191959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < mapItem.size; i++) { 192959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle AnnotationsDirectoryItem newAnnotationsDirectoryItem = new AnnotationsDirectoryItem(); 193959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawDexFile.annotationsDirectoryItems.add(newAnnotationsDirectoryItem); 194959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newAnnotationsDirectoryItem.read(file); 195959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 196959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 197959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle default: 198959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Log.errorAndQuit("Encountered unknown map item when reading map item list."); 199959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 200959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle mapItemIdx++; 201959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 202959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 203959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 204959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 205959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void write(DexRandomAccessFile file) throws IOException { 206959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle file.alignForwards(4); 207959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle file.getOffsetTracker().updatePositionOfNextOffsettable(file); 208959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle file.writeUInt(mapItems.size()); 209959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (MapItem mapItem : mapItems) { 210959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle mapItem.write(file); 211959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 212959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 213959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 214959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 215959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void incrementIndex(IndexUpdateKind kind, int insertedIdx) { 216959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Do nothing. 217959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 218959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle} 219