【问题标题】:Why does exec() start a ADB daemon? [closed]为什么 exec() 会启动 ADB 守护进程? [关闭]
【发布时间】:2015-12-05 11:08:28
【问题描述】:

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

我曾尝试通过Runtime.getRuntime().exec()从手机本身运行adb shell pm clear COM.PACKAGE.NAME之类的命令,但命令的输出如下:

cannot bind 'tcp:5038

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

为什么?

【问题讨论】:

    标签: android shell adb runtime.exec


    【解决方案1】:

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

    参考

    1. Android Debug BridgeAndroid 开发者网站上。
    2. ADB(Android Debug Bridge): How it works?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

    【讨论】: