基于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
相关产品推荐
相关产品推荐

