public void parse(BinaryReader reader) throws IOException {
		if (parsed) {
			return;
		}
		parsed = true;

		if (mapOffset > 0 && reader.isValidIndex(mapOffset)) {
			int adjustedMapOffset = DexUtil.adjustOffset(mapOffset, this);
			reader.setPointerIndex(adjustedMapOffset);
			mapList = new MapList(reader);
		}

		reader.setPointerIndex(stringIdsOffset);
		for (int i = 0; i < stringIdsSize; ++i) {
			strings.add(new StringIDItem(reader, this));
		}

		reader.setPointerIndex(typeIdsOffset);
		for (int i = 0; i < typeIdsSize; ++i) {
			types.add(new TypeIDItem(reader));
		}

		reader.setPointerIndex(protoIdsOffset);
		for (int i = 0; i < protoIdsSize; ++i) {
			prototypes.add(new PrototypesIDItem(reader, this));
		}

		reader.setPointerIndex(fieldIdsOffset);
		for (int i = 0; i < fieldIdsSize; ++i) {
			fields.add(new FieldIDItem(reader));
		}

		reader.setPointerIndex(methodIdsOffset);
		for (int i = 0; i < methodIdsSize; ++i) {
			methods.add(new MethodIDItem(reader));
		}

		if (reader.isValidIndex(classDefsIdsOffset)) {
			reader.setPointerIndex(classDefsIdsOffset);
			for (int i = 0; i < classDefsIdsSize; ++i) {
				classDefs.add(new ClassDefItem(reader, this));
			}
		}
	}
https://android.googlesource.com/platform/art/+/master/libdexfile/dex/dex_file.h#91
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/android/dex/format/DexHeader.java