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

  1. Use a variant whose prefix before the first '-' is exactly 'apt' (i.e. 'apt-android-7' or 'apt-android-5').
  2. If you need TAPM/PACMAN, uncomment and implement that enum constant plus its bootstrap support.
  3. Guard against a missing dash: validate packageVariantName contains '-' before splitting.
  4. 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

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


AI-assisted analysis of termux/termux-app@3df69d1da1 (2026-08-13). Data as JSON: /api/errors/00bcf295506a54ee. Report an issue: GitHub.