How to Manage Android App Permissions with ADB (No Root)

9 min read Step‑by‑step guide to grant or revoke Android app runtime permissions using ADB commands without rooting your device. September 29, 2026 01:00 How to Manage Android App Permissions with ADB (No Root)

Sometimes an app asks for a permission you don’t want to grant, or you need to give a permission that the UI hides behind a prompt you can’t see (e.g., after a silent install). Android’s pm tool, reachable through ADB, lets you control runtime permissions directly from your computer – no root required.

All commands below assume you have a working ADB installation on a Windows, macOS, or Linux PC and that USB debugging is enabled on the phone.

Before you start

  • Charge your device – at least 50 % to avoid accidental shutdown.
  • Backup important data – changing permissions can make an app misbehave, but it never erases user data.
  • Install ADB – download the Platform‑Tools package from the Android developer site and extract it.
  • Enable USB debugging – Settings > About phone > tap "Build number" seven times, then Settings > System > Advanced > Developer options > toggle "USB debugging".
  • Connect the phone via USB and allow the RSA prompt on the device.

Step 1 – Verify ADB connection

  1. Open a terminal (Command Prompt, PowerShell, or your favorite shell) and navigate to the platform-tools folder.
  2. Run adb devices. You should see a line with your device serial number and the word device.
    adb devices
    List of devices attached
    ABCD12345678	device
  3. If the device shows as unauthorized, check the phone for the RSA dialog and tap "Allow".

Step 2 – Find the package name of the target app

  1. Option A – Use the Play Store URL. The package name is the part after id=, e.g., com.whatsapp.
  2. Option B – List all installed packages via ADB:
    adb shell pm list packages | grep -i "keyword"
    Replace keyword with part of the app name.
  3. Option C – Open Settings > Apps, tap the app, scroll down to "App details in store"; the URL contains the package name.

Step 3 – List the current runtime permissions for the app

  1. Run the following command, replacing PACKAGE_NAME with the actual name:
    adb shell pm dump PACKAGE_NAME | grep "android.permission"
  2. Alternatively, a cleaner view:
    adb shell dumpsys package PACKAGE_NAME | grep granted=true
  3. The output will show each permission and whether it is granted=true or granted=false.

Step 4 – Grant a permission

  1. Identify the exact permission string you want to grant, e.g., android.permission.ACCESS_FINE_LOCATION.
  2. Execute the grant command:
    adb shell pm grant PACKAGE_NAME android.permission.ACCESS_FINE_LOCATION
  3. Verify the change by re‑running the list command from Step 3 – the permission should now show granted=true.

Step 5 – Revoke a permission

  1. Use the same permission string you wish to remove, e.g., android.permission.READ_CONTACTS.
  2. Run the revoke command:
    adb shell pm revoke PACKAGE_NAME android.permission.READ_CONTACTS
  3. Again, list the permissions to confirm the status changed to granted=false.

Step 6 – Grant or revoke multiple permissions at once

While ADB does not accept a list in a single call, you can script the process. Below is a one‑liner for Linux/macOS; Windows users can copy the lines into a .bat file.

# Grant location and camera
for perm in android.permission.ACCESS_FINE_LOCATION android.permission.CAMERA; do
  adb shell pm grant com.example.app $perm
done

# Revoke contacts and microphone
for perm in android.permission.READ_CONTACTS android.permission.RECORD_AUDIO; do
  adb shell pm revoke com.example.app $perm
done

Why ADB can change permissions

Since Android 6.0 (Marshmallow) the system separates dangerous permissions from normal ones. The UI asks the user at runtime, but the underlying package manager (the pm tool) still controls the grant state. ADB runs with the android.permission.GRANT_RUNTIME_PERMISSIONS privilege, which is granted to the shell user on every device – that’s why root is not required.

Alternative: Using appops for finer control

Some permissions are mapped to app ops (e.g., android:access_fine_location maps to android:location_fine). If you need to toggle an operation without changing the formal permission, use:

adb shell appops set PACKAGE_NAME OPERATION MODE

Common values for MODE are allow, ignore, and deny. Example:

adb shell appops set com.example.app ACCESS_FINE_LOCATION ignore

This can be useful when an app declares a permission but you only want to block the underlying operation.

Troubleshooting

  • Command returns "Permission denied" – make sure USB debugging is still enabled and that the RSA prompt was accepted. Some OEMs (e.g., Huawei) disable the shell user’s grant privilege on certain builds; you may need to enable "Allow USB debugging in charge only mode".
  • Permission not listed in Step 3 – the app may not request that permission in its manifest, or it targets an API level lower than 23 (pre‑runtime). In that case, the permission is granted at install time and cannot be toggled via ADB.
  • App crashes after revoking a permission – many apps assume a permission is present once they have been granted. If you revoke it, the app may not handle the missing permission gracefully. Re‑grant the permission or reinstall the app if needed.
  • Device not listed by adb devices – try a different USB cable, enable "USB debugging (Security settings)" if available, or restart the ADB server with adb kill-server && adb start-server.

Safety warnings

Granting dangerous permissions (location, microphone, contacts, etc.) gives the app full access to that data. Only grant permissions to apps you trust.

Revoking a permission that an app relies on for core functionality may render the app unusable until the permission is restored.

Wrapping up

Using ADB to manage runtime permissions gives you granular control without rooting or reinstalling apps. The workflow – connect, identify the package, list current grants, then pm grant or pm revoke – can be repeated for any app on any Android device that supports the standard ADB shell user.

Keep this guide handy whenever you encounter a permission prompt you can’t dismiss, want to pre‑grant a permission for an automated test, or need to lock down an app after a security audit. With a few typed commands you’ll have the same power as the system UI, but with the precision of a terminal.

User Comments (0)

Add Comment
We'll never share your email with anyone else.