You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Android设备实现ADB Shell远程控制其他安卓设备的技术问询

安卓APP实现ADB远程控制的技术方案

一、核心思路

安卓系统本身兼容ADB客户端,无需额外搭建复杂环境——直接将ADB可执行文件打包到APP中,通过代码调用执行命令,即可实现对另一台安卓设备的WiFi/USB调试控制,完全满足闭源开发需求。

二、具体实现步骤

1. 准备ADB二进制文件

  • 从Android SDK的platform-tools目录中,提取对应安卓架构(arm64-v8a、armeabi-v7a、x86_64等)的adb可执行文件。
  • 将这些文件放到APP的assets目录下,按架构分文件夹存放(比如assets/adb/arm64-v8a/)。
  • APP首次启动时,根据当前设备的CPU架构,将对应目录下的adb复制到APP私有目录(如getFilesDir().getAbsolutePath()),并通过chmod 755 [adb文件路径]赋予执行权限。

2. 执行ADB命令的代码实现

使用Runtime或ProcessBuilder执行命令,注意在子线程中操作,避免阻塞UI:

private void runAdbCommand(String fullCommand) {
    new Thread(() -> {
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(fullCommand);
            
            // 读取命令输出
            BufferedReader outputReader = new BufferedReader(
                new InputStreamReader(process.getInputStream(), "UTF-8")
            );
            BufferedReader errorReader = new BufferedReader(
                new InputStreamReader(process.getErrorStream(), "UTF-8")
            );
            
            StringBuilder output = new StringBuilder();
            StringBuilder error = new StringBuilder();
            String line;
            while ((line = outputReader.readLine()) != null) {
                output.append(line).append("\n");
            }
            while ((line = errorReader.readLine()) != null) {
                error.append(line).append("\n");
            }
            
            int exitCode = process.waitFor();
            // 回到UI线程更新结果
            runOnUiThread(() -> {
                if (exitCode == 0) {
                    // 执行成功,处理output(比如显示到TextView)
                } else {
                    // 执行失败,处理error信息
                }
            });
            
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
            runOnUiThread(() -> {
                // 处理异常提示
            });
        } finally {
            if (process != null) {
                process.destroy();
            }
        }
    }).start();
}

// 调用示例:连接WiFi设备
String adbPath = getFilesDir() + "/adb";
runAdbCommand(adbPath + " connect 192.168.1.105:5555");

// 调用示例:打开指定APP
runAdbCommand(adbPath + " shell am start -n com.example.demo/com.example.demo.MainActivity");

// 调用示例:获取所有包名
runAdbCommand(adbPath + " shell pm list packages");

3. 适配WiFi/USB调试场景

  • WiFi调试:确保目标设备开启「无线调试」,与控制APP处于同一局域网,先执行adb connect [IP]:5555建立连接,后续即可执行所有shell命令。
  • USB调试:控制设备需支持OTG,通过OTG线连接目标设备后,直接执行adb shell相关命令,无需额外连接步骤。

三、关键注意事项

  • 权限配置:
    • 声明INTERNET权限(WiFi调试需要);若使用私有目录存储ADB文件,无需申请外部存储权限(Android 10+推荐)。
  • 架构兼容:
    • 打包时针对不同架构生成APK,或在APP启动时动态适配当前设备的CPU架构,避免因不兼容导致ADB无法执行。
  • 闭源保护:
    • 将ADB二进制打包到APP内部,配合ProGuard/R8混淆代码,可有效防止核心逻辑被反编译提取。
  • 线程安全:
    • 所有ADB命令必须在子线程执行,处理输入输出流时避免遗漏,防止进程挂起导致ANR。

四、优化建议

  • 预设常用设备IP列表,支持一键连接,减少重复输入。
  • 将打开APP、关闭APP、获取包名等操作封装成模板按钮,用户只需输入包名/Activity名即可执行。
  • 对pm list packages的输出进行解析,转换成结构化列表展示,提升可读性。
  • 给操作按钮添加加载状态,执行完成后显示明确的成功/失败提示。
  • 针对常见错误(如设备未在线、权限不足)做针对性的错误提示,帮助用户快速排查问题。

内容的提问来源于stack exchange,提问作者ShahabBidi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:25:58