android linux shell adb adb-shell

Comprender el comando a través de adb shell y el código-Android



linux adb-shell (1)

El comando que ejecuta con adb shell se ejecuta con privilegios de usuario de shell(UID=2000) . El comando que ejecuta desde su código java se ejecuta con los privilegios de UID su aplicación. De ahí la diferencia.

Estoy tratando de dar permiso a BATTERSTATS a una aplicación. Cuando ejecuto el comando desde una PC, funciona bien:

adb shell pm grant com.example.sample.myapplication android.permission.BATTERY_STATS

Pero el mismo comando pm grant no funciona cuando se ejecuta desde la aplicación de Android:

java.lang.Process process = Runtime.getRuntime().exec("pm grant com.example.sample.myapplication android.permission.BATTERY_STATS");

¿Requiere permiso de root para otorgar este permiso? Si es así, ¿por qué no requiere que el dispositivo esté rooteado para ejecutarlo a través de adb shell ?

Soy nuevo en Android, explique un poco más claramente lo que está sucediendo dentro y cómo proceder.