private void cacheHeaderInfo(TaskMonitor monitor) throws CancelledException, IOException {
		monitor.setMaximum(programs.size());
		monitor.setProgress(1);
		for (Program program : programs) {
			monitor.checkCancelled();
			monitor.incrementProgress(1);
			monitor.setMessage("Caching DEX header for " + program.getName() + "...");

			DexHeader dexHeader = DexHeaderFactory.getDexHeader(program);
			dexMap.put(program, dexHeader);

			Map<ClassMethodPrototype, Integer> map = new HashMap<>();
			cmpMap.put(dexHeader, map);

			int index = 0;
			for (MethodIDItem item : dexHeader.getMethods()) {
				monitor.checkCancelled();

				String className =
					DexUtil.convertTypeIndexToString(dexHeader, item.getClassIndex());

				String methodName = DexUtil.convertToString(dexHeader, item.getNameIndex());

				String prototype =
					DexUtil.convertPrototypeIndexToString(dexHeader, item.getProtoIndex());

				ClassMethodPrototype cmp =
					new ClassMethodPrototype(className, methodName, prototype);

				map.put(cmp, index);
				++index;
			}
		}
	}
Links multidex APKs together
via the "method_lookup" section using
external references.
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/android/multidex/MultiDexLinker.java