通过adb从设备持续导出数据流

1. 背景

我需要分析设备的录音数据,但很可惜,设备存储空间比较小,录个几秒就爆了,远远达不到几分钟甚至几个小时的持续录音要求。本地存储放不下,又不支持拓展可移动存储,为什么不实时导出到PC呢?

刚好我的设备支持 adb,就不开发个新工具了,直接用 adb 的端口映射。

adb 使用说明:http://adbcommand.com/client/41
adb 使用说明(中文翻译):https://its401.com/article/qq_44704503/122761997
adb 官方说明:https://developer.android.com/studio/command-line/adb#forwardports

此方法其实不仅仅适用于录音,所有持续的流数据都可以通过这方法导出,例如日志。

2. 原理简介

此处需要用到 adb forward 命令,实现设备端口与本地端口的映射,例如在 PC 端执行以下命令,可以实现本地端口 11111 与设备的端口 22222 绑定。

adb forward tcp:11111 tcp:22222

除了端口绑定之外,adb forward 还支持特殊文件的绑定,例如:

adb forward tcp:11111 dev:/dev/block/by-name/xxxx

下图引用自 adb forward的细节(1):原理概述 ,清晰介绍了其原理。实际上 adb 的通信估计都是类似的操作,例如 adb push 有特定端口实现特定逻辑,而 adb forward 是提供给用户自定义端口绑定的方法。

我们可以用下面的命令列出通过 adb forward 绑定的接口:

$ adb forward --list
xxxxxxxxxxxxxxx tcp:11111 tcp:22222

3. 操作步骤

3.1 通过socket

比较有参考价值的博客文章:https://blog.csdn.net/omnispace/article/details/80018705

参考上面的博文,本来也是想通过 socket 直接转发的,但毕竟不熟悉网络,出错了不知道怎么解决,尴尬....

可能是我环境的原因,按理是行得通的,记录下来存档吧

3.1.1 步骤1:绑定端口

adb forward tcp:6666 tcp:6666

3.1.3 步骤2:PC端接受

nc localhost 6666 > record.wav

执行没反应,怀疑是步骤1的端口绑定还有问题...

3.1.2 步骤2:端上发送数据

arecord -D default -c 1 - | nc localhost 6666

执行报错:

nc: can't connect to remote host (127.0.0.1): Connection refused

从这里基本可以确定 3.1.1 的绑定端口还有问题,猜测是环境原因,毕竟我设备上的adb能力不是完整版本。

3.2 通过管道中转

上述 3.1 的方案在我的环境无效,联想到 adb 除了映射端口之外,还能映射文件,不如 创建个有名管道中转?

3.2.1 步骤1:创建有名管道

mkfifo /data/audio_pipe

3.2.2 步骤2:绑定端口

adb forward tcp:6666 dev:/data/audio_pipe

3.2.3 步骤3:PC端接收数据

nc localhost 6666 > record.wav

3.2.4 步骤4:设备端发送数据

arecord -D default -c 1 /data/audio_pipe
posted @ 2022-09-22 14:50  广漠飘羽  阅读(473)  评论(0编辑  收藏  举报