Android: 为什么 运行 adb shell 命令从 pc 和 USB 调试不需要权限?

Android: why does running adb shell commands from pc and USB debugging doesn't required permission?

以编程方式 运行:getRuntime.exec("screencap", "-p /sdcard/image.png") 除了以 code=1 退出外什么都不做。

但是当 USB 调试时,运行 来自 PC 在 cmd 中的相同命令:adb shell screencap -p /sdcard/dddd.png 有效。

从以前的 Whosebug 帖子来看,该命令似乎在编程上 运行 不起作用,因为该应用程序没有权限,这需要对 phone 进行 root 才能授予 su 访问该应用程序的权限.

为什么 运行 来自 pc 的这些命令不需要特权访问?

不同之处在于 adbd(adb 守护程序)使用 shell uid 运行,而从应用程序执行此操作时,您仍然使用应用程序的 uid。所以是不同的语境。

有一个 SELinux 规则允许 adb 调用屏幕截图(在 system/sepolicy/private/adbd.te 中定义):

# Perform binder IPC to surfaceflinger (screencap)
# XXX Run screencap in a separate domain?
binder_use(adbd)
binder_call(adbd, surfaceflinger)
binder_call(adbd, gpuservice)
# b/13188914
allow adbd gpu_device:chr_file rw_file_perms;
allow adbd ion_device:chr_file rw_file_perms;
r_dir_file(adbd, system_file)