Many Android devices ship with a handful of pre‑installed apps that sit in the system partition. They consume internal storage, appear in the app drawer, and cannot be uninstalled without root. If you have an adoptable SD card (Android 6.0+), you can relocate the data of many of those apps to the card, freeing precious internal space while keeping the apps functional. This guide walks you through the entire process using only ADB – no rooting, no custom recoveries, and no third‑party “move‑to‑SD” hacks.
adb backup or a cloud backup for contacts, messages, and any app‑specific data you cannot afford to lose.System apps reside in the /system partition, which is read‑only at runtime. Android treats them as part of the OS, so the package manager does not allow them to be moved directly. However, you can disable a system app for the current user and then re‑install it as a user app. Once it lives in the user space, Android’s normal Move to SD UI works.
Key points:
/data/app, which can be relocated.If the option is missing, your manufacturer has disabled adoptable storage. In that case, the method described here cannot be used.
adb.adb devices. You should see a device serial number followed by device. If you see unauthorized, accept the RSA key prompt on the phone.Successful connection is essential; all subsequent commands run on the phone via this channel.
Not every system app is a good candidate. Focus on bloatware that you actually use (e.g., a manufacturer’s gallery, music player, or note‑taking app). Use the following command to list all system packages:
adb shell pm list packages -s
The -s flag limits the output to system packages. To find a specific app, pipe the output through grep (Linux/macOS) or findstr (Windows):
adb shell pm list packages -s | grep "gallery"
Note the full package name (e.g., com.samsung.android.gallery).
PACKAGE_NAME with the actual name:adb shell pm disable-user --user 0 PACKAGE_NAMEPackage PACKAGE_NAME new state: disabled-user. The app disappears from the launcher.If the command fails with "Error: not allowed to disable package", the app is a core system component and must stay enabled. Skip it.
Now ask the package manager to install the disabled system app for the current user. This creates a copy in /data/app that can be moved.
adb shell cmd package install-existing PACKAGE_NAMESuccess: installed existing package PACKAGE_NAME.At this point the app is treated like any user‑installed app. Verify it appears in Settings > Apps.
Android’s package manager respects a global install‑location setting. Setting it to 2 (external) tells the system that new installations should prefer the SD card. Existing user apps can then be moved manually.
adb shell pm set-install-location 2adb shell pm get-install-location2 [external].If you later want to revert to internal‑only installs, repeat the command with 1 (internal).
Android does not expose a direct ADB command to move an app to external storage, but once the app is a user app the standard UI works.
After the move, the app’s storage usage will be reflected under the SD‑card section in Settings > Storage.
Run the following command to see where the package lives:
adb shell pm get-app-ops PACKAGE_NAME
While this command shows permission ops, a more direct check is:
adb shell dumpsys package PACKAGE_NAME | grep -i "codePath"
If the path points to /data/app/… and the app’s storage summary shows the SD card, the move succeeded. You can also open the app and confirm it launches without errors.
If you have several bloatware packages, you can script the steps. Below is a minimal Bash snippet (Linux/macOS) that disables, reinstalls, and attempts to move a list of packages:
#!/bin/bash
PACKAGES=(
"com.samsung.android.gallery"
"com.samsung.android.messaging"
"com.samsung.android.app.contacts"
)
for PKG in "${PACKAGES[@]}"; do
echo "Processing $PKG"
adb shell pm disable-user --user 0 $PKG
adb shell cmd package install-existing $PKG
# UI move must be manual; we only set location flag here
echo "Package $PKG ready to be moved via Settings > Apps > Storage"
done
Run the script while your phone is connected. Remember that the UI step cannot be fully automated without root.
/system.pm get-install-location returns 2. If not, re‑run the command. If the button remains disabled, the app simply cannot be moved.Adoptable storage behaves like internal storage: the system may encrypt it and move data around during OTA updates. Keep the following in mind:
If your device does not support adoptable storage, or if you rely on fast internal flash for performance‑critical apps (games, camera, etc.), moving apps may degrade responsiveness. In those cases, consider disabling the unwanted system apps instead of moving them.
By leveraging ADB’s ability to disable system packages and reinstall them as user apps, you can safely relocate many pre‑installed apps to an adoptable SD card without ever rooting your phone. The process is reversible: simply re‑enable the original system package with adb shell pm enable --user 0 PACKAGE_NAME and uninstall the user copy if desired.
With the steps, warnings, and troubleshooting tips above, you should now have a clearer path to reclaiming internal storage on Android devices that otherwise feel cramped by manufacturer bloatware.









