我在sdcard上有一个文件正在由应用程序不断写入,我需要从应用程序写入设备时将文件拉到我的Windows主机上进行进一步分析。
adb pull
并不好,因为它会拉动整个文件然后停止,但当然文件仍在写入。无论如何,文件变得非常大,所以我不想每次都复制整个文件,只是自上次读取以来已写入的部分。
adb shell dd
可能是一个选项,但我只能将它从SD卡上的一个文件复制到SD卡上的另一个文件,即不是我的Windows机器:
e.g。 adb shell dd if=/sdcard/input.pcm of=/sdcard/output.pcm
然后使用skip和seek dd选项。
如果我使用dd和管道:: adb shell dd if=/sdcard/input.pcm > output.pcm
输出文件有一些损坏:0x0D,0x0D随机添加到pcm数据。就像我刚做adb shell cat input.pcm。
我还考虑过将数据写入logcat并对其进行解析,但这是相当笨拙和混乱的,并且有大量的数据。
另一种选择可能是在编写文件时将文件拆分为许多小文件,然后使用adb pull。
这些都不是理想的。理想情况下,我希望主机上的程序能够控制数据,例如fopen,fread等。但我不确定这是否可行。
任何人都可以建议我如何能够满足我的要求:
非常感谢提前。
答案 0 :(得分:0)
我认为这是您的具体要求,因此修改Android的源代码无关紧要。
为什么不实施其他adb命令?然后,您可以记录上次读取的位置,并使用adb newcommand filename逐步提取文件。
adb的实现可以分为两部分:主机端和adbd。
在主机端,当您键入命令时,它将转到commandline.c中的adb_commandline()
。
if(!strcmp(argv[0], "pull")) {
if (argc == 2) {
return do_sync_pull(argv[1], ".");
} else if (argc == 3) {
return do_sync_pull(argv[1], argv[2]);
} else {
return usage();
}
}
然后do_sync_pull
不断与adbd通信。 adbd(adb.c)侦听从主机端发送的请求。
一种简单的方法是在do_sync_pull中添加另一个参数,让adbd不断搜索文件并发回文件内容。