skylot/jadx · error · JadxRuntimeException

Failed to init res table provider: ${resTableParserProvider}

Error message

Failed to init res table provider: ${resTableParserProvider}

What it means

Thrown during ResourcesLoader.init() when an IResTableParserProvider's init(root) throws. Resource table parser providers (e.g., the Android ARSC parser) are pluggable and initialized once against the RootNode; if any one fails, ResourcesLoader aborts immediately with a JadxRuntimeException naming the failing provider via its toString(). The cause is chained. This runs during resource loading setup.

Source

Thrown at jadx-core/src/main/java/jadx/api/ResourcesLoader.java:69

		this.resTableParserProviders.add(new ResTableBinaryParserProvider());
	}

	List<ResourceFile> load(RootNode root) {
		init(root);
		List<File> inputFiles = decompiler.getArgs().getInputFiles();
		List<ResourceFile> list = new ArrayList<>(inputFiles.size());
		for (File file : inputFiles) {
			loadFile(list, file);
		}
		return list;
	}

	private void init(RootNode root) {
		for (IResTableParserProvider resTableParserProvider : resTableParserProviders) {
			try {
				resTableParserProvider.init(root);
			} catch (Exception e) {
				throw new JadxRuntimeException("Failed to init res table provider: " + resTableParserProvider);
			}
		}
		for (IResContainerFactory resContainerFactory : resContainerFactories) {
			try {
				resContainerFactory.init(root);
			} catch (Exception e) {
				throw new JadxRuntimeException("Failed to init res container factory: " + resContainerFactory);
			}
		}
	}

	public interface ResourceDecoder<T> {
		T decode(long size, InputStream is) throws IOException;
	}

	@Override
	public void addResContainerFactory(IResContainerFactory resContainerFactory) {
		resContainerFactories.add(resContainerFactory);

View on GitHub (pinned to e738a26571)

Solutions

  1. Inspect getCause() to see which provider failed and why (the message includes the provider's toString()).
  2. Remove or fix the offending IResTableParserProvider from the registered providers list.
  3. Ensure the provider's version matches the jadx API version you depend on.
  4. If it is your own provider, make init(root) defensive and log+skip rather than throw.

Example fix

// before
@Override
public void init(RootNode root) {
    this.table = parseBaseTable(); // throws
}

// after
@Override
public void init(RootNode root) {
    try {
        this.table = parseBaseTable();
    } catch (Exception e) {
        LOG.error("Resource table provider init failed, disabling provider", e);
        this.table = null;
    }
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Before resource loading, verify each provider can init without throwing
// by wrapping registration in your own try/catch during setup.
for (IResTableParserProvider p : providers) {
    try { p.init(root); } catch (Exception e) {
        LOG.warn("Disabling failing provider {}: {}", p, e);
    }
}

Try / catch

try {
    jadx.getResources();
} catch (JadxRuntimeException e) {
    if (e.getMessage().startsWith("Failed to init res table provider")) {
        LOG.error("Resource table provider failed: {}", e.getMessage());
        // remove the named provider from the list and retry
    } else throw e;
}

Prevention

When it happens

Trigger: Calling the resource-loading entry point (e.g., jadx.getResources()) which triggers ResourcesLoader.init(root), with a registered IResTableParserProvider whose init(root) throws an exception.

Common situations: A custom or third-party IResTableParserProvider plugin that throws during setup (bad config, missing native dependency); a provider version incompatible with the jadx API version in use; a malformed RootNode handed to the provider; a service-loader/classpath issue where the provider cannot find a required resource.

Related errors


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