termux/termux-app · critical · RuntimeException
Unsupported TERMUX_APP_PACKAGE_VARIANT "%s"
Error message
Unsupported TERMUX_APP_PACKAGE_VARIANT "%s"
What it means
Thrown by TermuxBootstrap.setTermuxPackageManagerAndVariant when packageVariantName does not match any PackageVariant enum value. Valid variants are 'apt-android-7' and 'apt-android-5'. variantOf() does a case-sensitive equality check against the enum names; any other string (including null passed safely returns null before this, but an unrecognized non-empty string) triggers the exception.
Source
Thrown at termux-shared/src/main/java/com/termux/shared/termux/TermuxBootstrap.java:30
private static final String LOG_TAG = "TermuxBootstrap";
/** The field name used by Termux app to store package variant in
* {@link TERMUX_APP#BUILD_CONFIG_CLASS_NAME} class. */
public static final String BUILD_CONFIG_FIELD_TERMUX_PACKAGE_VARIANT = "TERMUX_PACKAGE_VARIANT";
/** The {@link PackageManager} for the bootstrap in the app APK added in app/build.gradle. */
public static PackageManager TERMUX_APP_PACKAGE_MANAGER;
/** The {@link PackageVariant} for the bootstrap in the app APK added in app/build.gradle. */
public static PackageVariant TERMUX_APP_PACKAGE_VARIANT;
/** Set {@link #TERMUX_APP_PACKAGE_VARIANT} and {@link #TERMUX_APP_PACKAGE_MANAGER} from {@code packageVariantName} passed. */
public static void setTermuxPackageManagerAndVariant(@Nullable String packageVariantName) {
TERMUX_APP_PACKAGE_VARIANT = PackageVariant.variantOf(packageVariantName);
if (TERMUX_APP_PACKAGE_VARIANT == null) {
throw new RuntimeException("Unsupported TERMUX_APP_PACKAGE_VARIANT \"" + packageVariantName + "\"");
}
Logger.logVerbose(LOG_TAG, "Set TERMUX_APP_PACKAGE_VARIANT to \"" + TERMUX_APP_PACKAGE_VARIANT + "\"");
// Set packageManagerName to substring before first dash "-" in packageVariantName
int index = packageVariantName.indexOf('-');
String packageManagerName = (index == -1) ? null : packageVariantName.substring(0, index);
TERMUX_APP_PACKAGE_MANAGER = PackageManager.managerOf(packageManagerName);
if (TERMUX_APP_PACKAGE_MANAGER == null) {
throw new RuntimeException("Unsupported TERMUX_APP_PACKAGE_MANAGER \"" + packageManagerName + "\" with variant \"" + packageVariantName + "\"");
}
Logger.logVerbose(LOG_TAG, "Set TERMUX_APP_PACKAGE_MANAGER to \"" + TERMUX_APP_PACKAGE_MANAGER + "\"");
}
/**
* Set {@link #TERMUX_APP_PACKAGE_VARIANT} and {@link #TERMUX_APP_PACKAGE_MANAGER} with the
* {@link #BUILD_CONFIG_FIELD_TERMUX_PACKAGE_VARIANT} field value from theView on GitHub (pinned to 3df69d1da1)
Solutions
- Set TERMUX_PACKAGE_VARIANT in build.gradle to one of the supported values: 'apt-android-7' or 'apt-android-5'.
- Trim and lower-case the variant string before lookup if whitespace/case is suspected.
- Ensure the build config field name matches BUILD_CONFIG_FIELD_TERMUX_PACKAGE_VARIANT exactly.
- If you forked and added a variant, also add it to the PackageVariant enum.
Example fix
// before
public static PackageVariant variantOf(String name) {
if (name == null || name.isEmpty()) return null;
for (PackageVariant v : PackageVariant.values()) {
if (v.name.equals(name)) return v;
}
return null;
}
// after (case-insensitive + trimmed lookup with explicit error listing valid values)
public static PackageVariant variantOf(String name) {
if (name == null) return null;
String key = name.trim();
if (key.isEmpty()) return null;
for (PackageVariant v : PackageVariant.values()) {
if (v.name.equalsIgnoreCase(key)) return v;
}
throw new IllegalArgumentException("Unknown package variant '" + name + "'. Valid: apt-android-7, apt-android-5");
} Defensive patterns
Strategy: validation
Validate before calling
String v = (packageVariantName == null) ? null : packageVariantName.trim();
if (v == null || PackageVariant.variantOf(v) == null) {
throw new IllegalArgumentException(
"Unsupported variant: " + v + ". Valid: apt-android-7, apt-android-5");
} Try / catch
try {
TermuxBootstrap.setTermuxPackageManagerAndVariant(variant);
} catch (RuntimeException e) {
if (e.getMessage() != null && e.getMessage().startsWith("Unsupported TERMUX_APP_PACKAGE_VARIANT")) {
// fallback to default variant or fail build
throw new BuildException(e.getMessage(), e);
}
throw e;
} Prevention
- Set TERMUX_PACKAGE_VARIANT in build.gradle to a registered enum value.
- Trim and validate the variant string before lookup.
- Keep the PackageVariant enum in sync with the build variants you ship.
When it happens
Trigger: TERMUX_PACKAGE_VARIANT build config field is set to an unsupported value (e.g. 'apt-android-6', 'tapm-android-7', 'APT-ANDROID-7' with wrong case, or a typo); a plugin reads a stale/wrong build config field from the Termux app; the variant string has trailing whitespace.
Common situations: Custom build sets an unregistered variant in build.gradle; upgrading introduced a new variant name not yet in the enum; sharedUserId plugin reads a field that does not exist, returning garbage.
Related errors
- Unsupported TERMUX_APP_PACKAGE_MANAGER "%s" with variant "%s
- Unsupported TERMUX_PACKAGE_VARIANT "%s"
- Malformed symlink line:
- No SYMLINKS.txt encountered
- Moving termux prefix staging to prefix directory failed
AI-assisted analysis of termux/termux-app@3df69d1da1 (2026-08-13).
Data as JSON: /api/errors/ca6327507e3b1132.
Report an issue: GitHub.