0

我在 sdcard 上有一个文件正在被应用程序不断写入,我需要在应用程序写入时将文件从设备中提取到我的 Windows 主机上以进行进一步分析。

adb pull不好,因为它会拉出整个文件然后停止,但当然文件仍在写入中。无论如何,文件变得非常大,所以我不想每次都复制整个文件,只是我上次阅读后写入的部分。

adb shell dd可能是一个选项,但我只能将它从 sdcard 上的一个文件复制到 sdcard 上的另一个文件,即不是我的 Windows 机器:

例如adb shell dd if=/sdcard/input.pcm of=/sdcard/output.pcm,然后使用跳过并寻找 dd 选项。

如果我使用 dd 和 pipe::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 毫秒)

提前谢谢了。

4

1 回答 1

0

我认为这是您的特定要求,因此修改Android的源代码没有关系。

你为什么不实现另一个 adb 命令?然后可以记录最后读取的位置,使用 adb newcommand filename 增量拉出文件。

adb的实现可以分为主机端和adbd两部分。

在主机端,当您键入命令时,它会转到adb_commandline()commandline.c。

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 不断寻找文件并发送回文件内容。

于 2013-03-01T01:17:06.100 回答