2013-03-01 52 views
0

我有一個應用程序不斷寫入的SD卡上的文件,我需要從該應用程序寫入該設備時將該文件拖動到我的windows主機進行進一步分析。從android sdcard到windows主機的流文件

adb pull是不好的,因爲它拉動整個文件然後停止,但當然文件仍然被寫入。無論如何,文件變得非常大,所以我不想每次都複製整個文件,只是從上次閱讀以來寫入的部分。

adb shell dd可能是一種選擇,但我只能把它從一個文件的SD卡複製到SD卡的另一個文件,即不是我的Windows機器:

例如adb shell dd if=/sdcard/input.pcm of=/sdcard/output.pcm然後使用跳過並尋找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. 閱讀,因爲我去年做了一個已更新的文件的部分讀(例如每100ms)

非常感謝提前。

回答

0

我認爲這是您的具體要求,所以修改Android的源代碼無關緊要。

爲什麼不實施另一個adb命令?然後您可以記錄上次讀取的位置並使用adb newcommand文件名來逐步提取文件。

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連續搜索文件併發迴文件內容。