termux/termux-app · critical · RuntimeException
Unsupported TERMUX_APP_PACKAGE_MANAGER "%s" with variant "%s
Error message
Unsupported TERMUX_APP_PACKAGE_MANAGER "%s" with variant "%s"
What it means
Thrown by setTermuxPackageManagerAndVariant after the variant was accepted but the package-manager prefix (substring before the first '-') does not match any PackageManager. Only 'apt' is a valid manager. This indicates the variant string has a valid suffix shape but an unknown manager prefix (e.g. 'foo-android-7').
Source
Thrown at termux-shared/src/main/java/com/termux/shared/termux/TermuxBootstrap.java:40
/** 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 the
* {@link TERMUX_APP#BUILD_CONFIG_CLASS_NAME} class of the Termux app APK installed on the device.
* This can only be used by apps that share `sharedUserId` with the Termux app and can be used
* by plugin apps.
*
* @param currentPackageContext The context of current package.
*/
public static void setTermuxPackageManagerAndVariantFromTermuxApp(@NonNull Context currentPackageContext) {
String packageVariantName = getTermuxAppBuildConfigPackageVariantFromTermuxApp(currentPackageContext);
if (packageVariantName != null) {
TermuxBootstrap.setTermuxPackageManagerAndVariant(packageVariantName);View on GitHub (pinned to 3df69d1da1)
Solutions
- Use a variant whose prefix before the first '-' is exactly 'apt' (i.e. 'apt-android-7' or 'apt-android-5').
- If you need TAPM/PACMAN, uncomment and implement that enum constant plus its bootstrap support.
- Guard against a missing dash: validate packageVariantName contains '-' before splitting.
- Check the build.gradle TERMUX_PACKAGE_VARIANT spelling.
Example fix
// before
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 + "\"");
}
// after (explicit validation with helpful message)
int index = packageVariantName.indexOf('-');
if (index == -1) {
throw new RuntimeException("Invalid variant (missing '-'): " + packageVariantName);
}
String packageManagerName = packageVariantName.substring(0, index);
TERMUX_APP_PACKAGE_MANAGER = PackageManager.managerOf(packageManagerName);
if (TERMUX_APP_PACKAGE_MANAGER == null) {
throw new RuntimeException("Unsupported package manager '" + packageManagerName + "'. Supported: apt");
} Defensive patterns
Strategy: validation
Validate before calling
int dash = packageVariantName.indexOf('-');
if (dash == -1) {
throw new IllegalArgumentException("Variant must contain '-': " + packageVariantName);
}
String mgr = packageVariantName.substring(0, dash);
if (PackageManager.managerOf(mgr) == null) {
throw new IllegalArgumentException("Unsupported manager: " + mgr + ". Valid: apt");
} Prevention
- Ensure the variant's manager prefix (before the first '-') is a registered PackageManager.
- Use only 'apt-*' variants unless you enable TAPM/PACMAN in the enum.
- Validate the variant string shape (must contain '-') before splitting.
When it happens
Trigger: packageVariantName's substring before the first '-' is not 'apt' (e.g. 'tapm-android-7', 'pacman-android-7', or a variant with no dash so index==-1 yields null managerName). Only 'apt' is registered; the others (TAPM, PACMAN) are commented out.
Common situations: Using a variant name whose manager prefix was never enabled in the enum (TAPM/PACMAN are commented out); a variant string with no '-' dash so managerName becomes null; typo in the manager portion.
Related errors
- Unsupported TERMUX_APP_PACKAGE_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/00bcf295506a54ee.
Report an issue: GitHub.