在设备本身上运行adb,即就像是PC发出命令一样

  • 本文关键字:PC 命令 一样 运行 adb android adb
  • 更新时间 :
  • 英文 :


我的目标是编写一个在手机上运行的应用程序,让用户从APK列表中选择,然后将选定的APK安装到同一网络上的Android Things设备上。

我们实际上可以忘记Android Things,因为相同的代码可以在两部手机之间工作,只是在那里毫无意义,因为目标可以通过许多其他方式接收APK,例如附件,BT等。 AT设备只有ADB,除了最近宣布的Android Things Console,这对于常规的本地开发来说是矫枉过正的。因此,我希望复制PC安装它的顺序,即"adb 连接,adb 安装..."等等,但来自手机本身。我们可以假设所有涉及的设备都是植根的。

在我看来,这意味着我的应用程序必须作为一个进程发出这些命令,但我很难让它完全正常工作。当我发出"adb help"时,我会收到帮助消息,当我发出"adb 重新启动"时,设备会重新启动,所以我认为我是正确的。当我尝试除那些之外的任何东西时,我什么也得不到 - "adb shell ping -c 1 192.168.62.40"的例子失败,但 PC 上的 ADB 可以。此外,非常奇怪的是"adb 版本"失败,这在终端上也可以。

起初,我认为手机可能只安装了"adb lite",这足以使它们作为adb目标工作,但使用PC上的外壳表明情况并非如此。

这是我正在尝试的代码:

Process process = Runtime.getRuntime().exec("su adb help");
//Process process = Runtime.getRuntime().exec("su adb reboot");
//Process process = Runtime.getRuntime().exec("su adb version");   
//Process process = Runtime.getRuntime().exec("su adb shell ping -c 1 192.168.62.40");
process.waitFor();
Log.d("PROCESS", "Status: "+process.exitValue());
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
StringBuilder everything = new StringBuilder();
String line;
while( (line = bufferedReader.readLine()) != null) {
everything.append(line);
}
Log.d("PROCESS", "Process output: "+everything.toString());
Toast.makeText(MainActivity.this, everything.toString(), Toast.LENGTH_SHORT).show();

问题是adb客户端(用于与开发计算机上的设备通信的 ADB服务器通信(未打包在 Android 设备上。但是,adbd守护进程(用于在adb客户端和设备之间进行通信(可以并且将在 Android 系统上找到。

有几个选项可以帮助在 Android 设备上使用adb客户端:

  • 尝试从 GitHub 上的adb源为 Android 设备构建adb客户端。
  • 尝试做一个临时adb"客户"。由于adb客户端和adbd守护程序通过 USB 或 TCP 进行通信,因此您可以尝试模拟通信协议以打开设备上的读/写流。有关客户端守护程序通信协议的更多信息,请单击此处。我正在处理的这个库可能会帮助你:eviltak/adb-nmap

快速而肮脏的选项是从源构建adb客户端并推送到设备。也就是说,如果你能让它在Android设备上构建。

第二种选择可能是最耗时的,但可能是最"干净"的选择。但是,您必须模拟adb身份验证系统,正确处理流等,这可能很麻烦。消息来源会帮助你。

无论哪种情况,GitHubadb源目录都应该包含您未来漫长道路所需的一切。

四年后...

我正在寻找同样的情况。

Adb 需要网络连接,因为它是客户端-服务器连接,其中 Android 设备是服务器,计算机是客户端。

要解决此问题,您需要Termux(带有包管理器的Android终端(和本地VPN,例如Netguard。不需要根访问权限。

在 Termux 中,您可以安装本机 Android 版本的adb这是第 1 步 byapt install android-tools. 但是 adb 应该与设备本身建立网络连接。然后VPN可能很有用。VPN在本地运行,其中设备充当VPN服务器,例如用于Netguard等广告拦截。然后你的设备会得到另一个IP地址的网络,例如Netguard制作10.1.10.1,我用它作为例子(你的VPN可能会发出不同的地址(。 运行adb connect 10.1.10.1设备可能会提示(仅一次("允许从计算机连接......哗啦啦..."并同意这一点。 然后运行adb connect 10.1.10.1:5555,您就连接了。现在,adb 命令可以从 Termux 命令外壳运行,而无需在设备本身或通过 SSH 连接运行。

注意:重启后仍需要插入 USB,除非您使用的是 Android 11+。

最新更新