ADB

Uninstalling Bloatware Without Root Using adb shell pm uninstall --user 0

Published: July 6, 2026 Applies to: Android 5.0 and later, no root required

Most carrier and OEM pre-installed apps can't be uninstalled through the normal Settings > Apps menu — the uninstall button is greyed out or simply absent. Rooting used to be the only way around this. It isn't anymore: the Android package manager has a per-user uninstall command that adb can call without root, because it removes the app for your user profile rather than deleting the system package itself.

What This Command Actually Does

Android since Lollipop treats the phone's primary account as user 0. System apps that ship baked into the read-only system partition can't be deleted outright without root, but pm uninstall --user 0 disassociates the app from your user profile, freeing its storage and stopping it from running, updating, or showing up in the app drawer. The underlying APK stays on the system partition, which is exactly why the command works without root or an unlocked bootloader — it's not touching the protected partition, just your user's association with that package.

This distinction matters for a factory reset: because the base APK is untouched, a factory reset restores the app for every user profile, including the one you removed it from.

Prerequisites

Step 1: Find the Package Name

You need the app's package identifier (like com.facebook.katana), not its display name. List all installed packages:

adb shell pm list packages

To narrow the list to a keyword:

adb shell pm list packages | grep -i facebook

If you're not sure which package corresponds to a specific pre-installed app visible in your app drawer, a quicker route is opening the app's page in Settings > Apps, then looking at the URL-style identifier shown near the bottom of the App Info screen, or using a third-party package name lookup tool.

Step 2: Run the Uninstall Command

adb shell pm uninstall --user 0 com.example.packagename

A successful removal prints Success. If the package is protected against removal by a device policy (common on carrier-locked or enterprise-managed phones), you'll instead see an error naming the restriction, and the command has no effect.

Reversing It

Because the base APK remains on the system partition, reinstalling for your user is usually possible with:

adb shell cmd package install-existing com.example.packagename

If that returns an error, a factory reset will restore the app as a fallback, since the reset re-associates every system package with the newly created user 0 profile.

Packages Worth Leaving Alone

Not every low-value-looking package is safe to remove. Before uninstalling anything with "system," "framework," "gms," or a carrier's core service name in the package identifier, search for that exact package name first. Removing core Google Play services components, carrier provisioning services, or system UI packages can break mobile data APN configuration, push notifications, or in rare cases the ability to boot into the home screen normally. The --user 0 approach is reversible, but a broken home screen or lost mobile data provisioning is an inconvenience worth avoiding by checking first.

Removing Several Apps at Once

For a phone with a long list of carrier apps to strip out, a short shell loop saves repetitive typing:

for pkg in com.example.one com.example.two com.example.three; do
  adb shell pm uninstall --user 0 "$pkg"
done

Test the first package on its own before running a longer list, so a typo in a package name doesn't silently skip past an app you actually meant to remove.

Doing This Across Several Devices

If you're setting up multiple identical phones (a family plan, a small fleet of work devices) and want to strip the same set of carrier apps from each one, combine this with adb's -s flag for targeting a specific connected device so each phone gets the same treatment one at a time from a single terminal session.

Checking What You've Already Removed

To see the full list of packages currently disabled or removed for your user, including anything you stripped out in a previous session:

adb shell pm list packages -u

The -u flag includes uninstalled packages in the listing, which is useful for confirming a removal actually took effect, or for building a list of exactly what was stripped from a phone before handing it off to someone else or restoring it to a more stock state later.

Disable Instead of Uninstall for Anything You're Unsure About

For apps you're not fully confident about removing, pm disable-user is a gentler alternative that stops the app from running and hides it from the launcher without touching its association to your user profile the way uninstall --user 0 does:

adb shell pm disable-user --user 0 com.example.packagename

Re-enabling is a single command and doesn't depend on install-existing working correctly:

adb shell pm enable com.example.packagename

This is worth reaching for first on system apps you're not certain are safe to touch, since disabling is trivially reversible in a way that doesn't rely on the package still being present on the system partition.

Why the Settings App Won't Let You Do This Directly

OEMs and carriers deliberately grey out the uninstall option for apps they consider part of the phone's baseline configuration, partly for support reasons (fewer support calls about a missing pre-installed app) and partly because some of these apps are tied to carrier billing, VoLTE configuration, or bundled subscription trials that generate revenue. The pm uninstall --user 0 command works around this restriction at the package manager level rather than the Settings UI level, which is exactly why it needs adb rather than being available as a toggle in the phone's own interface.