从android sdcard到windows主机的流文件

时间:2013-03-01 01:02:56

标签: android adb

我在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等。但我不确定这是否可行。

任何人都可以建议我如何能够满足我的要求:

  1. 读取所有可用于Windows主机的文件
  2. 读取自上次读取以来已更新的文件部分(例如,每100毫秒)
  3. 非常感谢提前。

1 个答案:

答案 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不断搜索文件并发回文件内容。