通过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