我的项目中有一个非导出的活动.
如果我尝试使用adb在手机上启动它:
adb shell am start -n "packagename/activityname"
我收到错误:
java.lang.SecurityException:
Permission Denial: starting Intent { ... } from null (...) not exported from uid ...
但是,如果我在模拟器上运行相同的命令,那么一切正常.怎么会?
最佳答案
But,if I run the same command on an emulator,then everything works Okay. How comes?
默认情况下,模拟器实例以root身份运行,这意味着与非root设备相比,更多系统进程具有root权限.
考虑使用adbd和sh grep-ed的ps命令输出(分别是adb shell ps | grep’adbd’和adb shell ps | grep’sh’).您可能会看到以下内容(当然,您的设备/模拟器上有不同的PID和PPID):
>非root设备
USER PID PPID NAME
shell 166 1 /sbin/adbd
...
shell 15721 166 /system/bin/sh
>模拟器
USER PID PPID NAME
root 1183 1 /sbin/adbd
...
root 2884 1183 /system/bin/sh
sh进程,其父进程adbd也是由root用户在仿真器上拥有,与非root用户设备上的shell所有者不同.并且root用户具有访问应用程序沙箱的“权限”,尽管android:exported
属性设置为false.