How Universal Android Debloater Next Generation Prevents Apps from Updating

Universal Android Debloater Next Generation prevents apps from updating by using Android's pm disable-user command to disable packages rather than uninstalling them, which blocks the Play Store and system package manager from pushing updates.

Universal Android Debloater Next Generation (UAD-NG) includes a disable mode that stops unwanted system apps from receiving automatic updates. Instead of removing packages entirely, this feature disables them at the system level, preventing the Play Store from recognizing them as active installations. This approach effectively prevents apps from updating while maintaining the ability to restore functionality later.

How Disable Mode Blocks Updates

When disable mode is enabled, UAD-NG does not uninstall packages. Instead, it executes the ADB shell command pm disable-user <package>, which puts the app into a disabled state. A disabled package remains installed but is ignored by Android's package manager, causing the Play Store and other installers to skip it during update checks.

Configuring the Disable Mode Setting

The GUI exposes this feature in crates/uad-gui/src/views/settings.rs. Lines 508-511 define the checkbox label as "Clear and disable packages instead of uninstalling them", while lines 15-22 handle the toggle logic that updates self.device.disable_mode. The checkbox is only active when phone.android_sdk >= 23, ensuring compatibility checks before enabling the feature.

The configuration is stored in DeviceSettings.disable_mode within crates/uad-core/src/config.rs, persisting the user's preference across sessions.

Source Code Implementation

The core decision logic resides in crates/uad-core/src/sync.rs at line 184. Here, the sync module checks both settings.disable_mode and the device's SDK version to determine which ADB commands to execute:

// sync.rs – decides which shell commands to run
if sdk >= 23 {
    // When disabling is allowed we use "pm disable-user"
    vec!["pm disable-user", "am force-stop", PM_CLEAR_PACK]
} else {
    // Fallback to normal uninstall for older devices
    vec![PM_UNINSTALL]
}

When the conditions are met, the tool issues pm disable-user followed by am force-stop and package data clearing commands. This sequence ensures the app cannot run or receive updates while preserving the installation files.

The GUI implementation renders the control with conditional styling based on Android version:

// In the Settings view (settings.rs)
let disable_checkbox_style = if phone.android_sdk >= 23 {
    style::CheckBox::SettingsEnabled
} else {
    style::CheckBox::SettingsDisabled
};

let disable_mode_checkbox = checkbox(self.device.disable_mode)
    .label("Clear and disable packages instead of uninstalling them")
    .on_toggle(Message::DisableMode)
    .size(20)
    .style(disable_checkbox_style);

Toggling the checkbox sends Message::DisableMode(bool), which updates the configuration and ensures future debloating operations use the disable command rather than uninstallation.

CLI Method for Preventing Updates

Users can also prevent updates via command line. The CLI entry point in crates/uad-cli/src/repl.rs (line 136) parses the disable subcommand and forwards it to the same core sync logic:


# In a terminal with the UAD‑NG CLI installed

uad-cli disable com.example.unwantedapp

This command executes the identical pm disable-user ADB shell call, freezing the package and excluding it from automatic update cycles without requiring the GUI.

Summary

  • Disable mode prevents app updates by marking packages as disabled rather than removing them, causing the Play Store to ignore them during update checks.
  • The feature requires Android 6.0 (API 23) or higher; UAD-NG falls back to uninstallation on older devices.
  • The tool uses the pm disable-user command executed via ADB to freeze packages at the system level.
  • Configuration occurs through a checkbox in the GUI settings at crates/uad-gui/src/views/settings.rs or via the uad-cli disable command.
  • Disabled packages remain installed but cannot run, receive updates, or appear in the app drawer, providing a reversible debloating solution.

Frequently Asked Questions

Does disabling an app with UAD-NG free up storage space?

No, disabling an app prevents it from running and receiving updates, but the APK and data remain on the device. To reclaim storage, you must uninstall the package instead. However, when using the "Clear and disable" option, the tool does remove app data while preserving the base package.

Can I re-enable a package after disabling it with UAD-NG?

Yes, disabled packages can be restored. The tool maintains a record of disabled packages, and you can re-enable them through the GUI or by using the pm enable command directly via ADB. This reversibility is the primary advantage over permanent uninstallation.

Why does the disable mode require Android 6.0 or higher?

The pm disable-user command was introduced in Android 6.0 (API 23) as a standard way for users to disable packages without root access. On earlier Android versions, UAD-NG falls back to standard uninstallation because the disable-user functionality does not exist in the package manager implementation.

Will disabled apps still appear in my app drawer?

No, disabled apps are automatically hidden from the launcher and app drawer by Android's package manager. They remain visible in the UAD-NG interface and in system settings under "Disabled apps," but cannot be launched until re-enabled.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →