skylot/jadx · error · JadxRuntimeException

AndroidManifest.xml is missing

Error message

AndroidManifest.xml is missing

What it means

AndroidManifestParser.parse() throws when isManifestFound() is false, i.e. the parser was constructed without locating an AndroidManifest resource (androidManifest document is null). The parser is built from a ResourceFile of type MANIFEST; if none was provided/found, parseAttributes() cannot run. This signals the APK/resource set has no decodable manifest.

Source

Thrown at jadx-core/src/main/java/jadx/core/utils/android/AndroidManifestParser.java:55

		this.androidManifest = parseAndroidManifest(androidManifestRes);
		this.appStrings = parseAppStrings(appStrings);
	}

	public boolean isManifestFound() {
		return androidManifest != null;
	}

	public static @Nullable ResourceFile getAndroidManifest(List<ResourceFile> resources) {
		return resources.stream()
				.filter(resourceFile -> resourceFile.getType() == ResourceType.MANIFEST)
				.findFirst()
				.orElse(null);
	}

	public ApplicationParams parse() {
		if (!isManifestFound()) {
			throw new JadxRuntimeException("AndroidManifest.xml is missing");
		}
		return parseAttributes();
	}

	private ApplicationParams parseAttributes() {
		ApplicationParams appParams = new ApplicationParams();

		@Nullable
		Element manifest = (Element) androidManifest.getElementsByTagName("manifest").item(0);
		@Nullable
		Element usesSdk = (Element) androidManifest.getElementsByTagName("uses-sdk").item(0);

		if (parseAttrs.contains(AppAttribute.APPLICATION_LABEL)) {
			appParams.setApplicationLabel(getApplicationLabel());
		}
		if (usesSdk != null) {
			if (parseAttrs.contains(AppAttribute.MIN_SDK_VERSION)) {
				appParams.setMinSdkVersion(safeParseInteger(usesSdk.getAttribute("android:minSdkVersion")));

View on GitHub (pinned to e738a26571)

Solutions

  1. Confirm the input is an APK/AAB that actually contains AndroidManifest.xml.
  2. Call AndroidManifestParser.getAndroidManifest(resources) first and only parse() when it returns non-null.
  3. Re-export/rebuild the APK if the manifest was stripped.
  4. If using the API directly, ensure you pass the manifest ResourceFile returned by the resource loader, not an arbitrary one.

Example fix

// before
AndroidManifestParser p = new AndroidManifestParser(manifestRes, attrs, security);
ApplicationParams params = p.parse(); // throws if manifest missing
// after
ResourceFile mf = AndroidManifestParser.getAndroidManifest(resources);
if (mf == null) {
    LOG.warn("No AndroidManifest.xml in input");
} else {
    ApplicationParams params = new AndroidManifestParser(mf, attrs, security).parse();
}
Defensive patterns

Strategy: validation

Validate before calling

ResourceFile mf = AndroidManifestParser.getAndroidManifest(resources);
if (mf == null) {
    // no manifest in this input; do not call parse()
    LOG.warn("Input has no AndroidManifest.xml");
} else {
    new AndroidManifestParser(mf, attrs, security).parse();
}

Try / catch

try {
    params = parser.parse();
} catch (JadxRuntimeException e) {
    if ("AndroidManifest.xml is missing".equals(e.getMessage())) {
        LOG.warn("No manifest; skipping app params");
        params = ApplicationParams.empty();
    } else {
        throw e;
    }
}

Prevention

When it happens

Trigger: Constructing AndroidManifestParser with a ResourceFile that is not the manifest (or null) then calling parse(); or getAndroidManifest(resources) returned null because no resource has ResourceType.MANIFEST.

Common situations: Decompiling a JAR/non-APK input that has no AndroidManifest.xml; a stripped/obfuscated APK with the manifest removed or renamed; passing the wrong ResourceFile list; a manifest resource present but not tagged as ResourceType.MANIFEST by the resource loader.

Related errors


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