为什么 exec() 启动 ADB 守护进程?

Why does exec() start a ADB daemon?

我正在为我拥有的一些 root phones 构建一个应用程序。我想知道是否有任何方法可以从我的应用程序中卸载 phone 运行 一些代码附带的系统应用程序。

我已经通过 Runtime.getRuntime().exec() 从 phone 本身尝试了 运行 类似 adb shell pm clear COM.PACKAGE.NAME 的命令,但是命令的输出如下:

cannot bind 'tcp:5038

* Daemon not running. Starting it now on port 5038*

为什么?

ADB 服务器在您的主机 (Unix, Windows) 上启动,默认情况下绑定到端口 5037。客户端(也是您的主机)使用该端口将命令发送到在系统环境中执行命令的目标设备。

参考:

  1. Android Debug BridgeAndroid 开发者网站上。
  2. ADB(Android Debug Bridge): How it works? by Tetsuyuki Kobayashi

当您 运行 一个应用程序时,它的代码在环境中执行。因此,当您调用 Runtime.getRuntime().exec("adb shell command") 时,您实际做的是尝试启动另一个 adb 服务器进程(现在在目标设备上),该进程在 tcp 端口 5038 上启动,因为端口 5037 很忙。

总结一下:您不需要将 adb 参数传递给 exec() 方法,这是多余的。而是使用

Runtime.getRuntime().exec("command")

关于以编程方式卸载系统应用程序,您的应用程序必须首先获得 su,这超出了问题的范围。不过,以下链接可能会帮助您开始:

  1. ANDROID: How to gain root access in an Android application?
  2. execute shell command from android