非导出活动:在模拟器上启动;在手机上会出现SecurityException

7

我在我的项目中有一个未导出的活动

如果我尝试使用adb在手机上启动它:

adb shell am start -n "packagename/activityname"

I get the error:

java.lang.SecurityException:
Permission Denial: starting Intent { ... } from null (...) not exported from uid ...

但是,如果我在模拟器上运行相同的命令,一切都正常。这是怎么回事?


据我所知,adb shell 运行的用户帐户在模拟器上拥有更高的权限。 - CommonsWare
1个回答

5
但是,如果我在模拟器上运行相同的命令,一切都正常。怎么回事?
默认情况下,模拟器实例以 root 用户身份运行,这意味着与非 root 设备相比,更多的系统进程具有 root 权限。
考虑使用带有 adbd 和 sh 的 grep 命令输出的 ps 命令(即 adb shell ps | grep 'adbd' 和 adb shell ps | grep 'sh')。您可能会看到以下内容(当然,您的设备/模拟器上的 PID 和 PPID 不同):
  • Non-rooted device

    USER     PID   PPID  NAME
    shell    166   1     /sbin/adbd
    ...
    shell    15721 166   /system/bin/sh
    
  • Emulator

    USER     PID   PPID  NAME
    root     1183  1     /sbin/adbd
    ...
    root     2884  1183  /system/bin/sh
    

sh进程,以及它的父进程adbd,在模拟器上都属于root所有,与非root设备上的shell所有者形成对比。而一个root用户有权访问您应用程序的沙盒,即使android:exported属性设置为false


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接