skylot/jadx · critical · JadxRuntimeException

Error loading jadx class set

Error message

Error loading jadx class set

What it means

RootNode.initClassPath() builds the ClspGraph (class hierarchy / classpath graph). The try/catch wraps loading the jadx class-set file (core.deobf / .json), adding application classes, and initializing the cache. ANY failure aborts classpath setup with a chained cause. This is process-fatal: without ClspGraph, type resolution cannot proceed.

Source

Thrown at jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java:276

	public void processResources(ResourceStorage resStorage) {
		constValues.setResourcesNames(resStorage.getResourcesNames());
		appPackage = resStorage.getAppPackage();
		appResClass = AndroidResourcesUtils.searchAppResClass(this, resStorage);
	}

	public void initClassPath() {
		try {
			if (this.clsp == null) {
				ClspGraph newClsp = new ClspGraph(this);
				if (args.isLoadJadxClsSetFile()) {
					newClsp.loadClsSetFile();
				}
				newClsp.addApp(classes);
				newClsp.initCache();
				this.clsp = newClsp;
			}
		} catch (Exception e) {
			throw new JadxRuntimeException("Error loading jadx class set", e);
		}
	}

	private void updateObfuscatedFiles(IResTableParser parser, List<ResourceFile> resources) {
		if (args.isSkipResources()) {
			return;
		}
		boolean useHeaders = args.isUseHeadersForDetectResourceExtensions();
		long start = System.currentTimeMillis();
		int renamedCount = 0;
		ResourceStorage resStorage = parser.getResStorage();
		ValuesParser valuesParser = new ValuesParser(parser.getStrings(), resStorage.getResourcesNames());
		Map<String, ResourceEntry> entryNames = new HashMap<>();
		for (ResourceEntry resEntry : resStorage.getResources()) {
			String val = valuesParser.getSimpleValueString(resEntry);
			if (val != null) {
				entryNames.put(val, resEntry);
			}

View on GitHub (pinned to e738a26571)

Solutions

  1. Delete the JADX cache/class-set directory and let it regenerate, or reinstall JADX cleanly.
  2. Upgrade to a matching JADX release where the class-set file version aligns with the binary.
  3. Ensure the APK file is not corrupt (re-download / re-extract).
  4. Check the chained cause in the stack trace — it identifies whether loadClsSetFile, addApp, or initCache failed.
Defensive patterns

Strategy: retry

Validate before calling

// Before loading, confirm the jadx class-set file exists and is non-empty,
// or that auto-download is enabled.
Path clspDir = Path.of(System.getProperty("user.home"), ".cache", "jadx");
if (args.isLoadJadxClsSetFile()) {
    Path f = clspDir.resolve("core.deobf");
    if (!Files.exists(f) || Files.size(f) == 0) {
        throw new IllegalStateException("jadx class-set file missing or empty: " + f);
    }
}

Try / catch

try {
    jadx.load();
} catch (JadxRuntimeException e) {
    if (e.getMessage().equals("Error loading jadx class set")) {
        // Clear the cache and retry once with a fresh class-set download.
        cleanJadxCache();
        jadx = new JadxDecompiler(args);
        jadx.load();
    } else throw e;
}

Prevention

When it happens

Trigger: The bundled/cached jadx class-set file is missing, corrupt, or incompatible; addApp(classes) hits a corrupt app class; or initCache fails on bad type data.

Common situations: First run with a missing or partially downloaded class-set file, a corrupt jadx install, a version mismatch between the class-set file and the JADX build, or a corrupted APK that breaks class hierarchy ingestion.

Related errors


AI-assisted analysis of skylot/jadx@e738a26571 (2026-08-14). Data as JSON: /api/errors/771597971641a4f6. Report an issue: GitHub.