" adb pull"在Bash脚本中返回空文件

时间:2017-05-22 09:11:16

标签: android bash file adb pull

我正在编写一个脚本来在Android上进行堆转储,将其拉到我的计算机,并可选择将其转换为标准的hprof。使用的主要命令是:

adb shell "am dumpheap ${PROCESS} /data/local/tmp/${FILENAME}-unconverted.hprof"
adb pull "/data/local/tmp/${FILENAME}-unconverted.hprof"
adb shell "rm /data/local/tmp/${FILENAME}-unconverted.hprof"

当我在终端中逐个执行这些行时,一切正常。但是,当我在bash脚本中运行这些命令时,adb pull会抓取一个空文件。

在终端中运行时,adb pull需要相当长的时间并报告进度百分比,但是当在bash脚本中运行时,它会立即显示

"/data/local/tmp/heapdump-05_22_2017_1807-unconverted.hprof: 1 file pulled"

我浏览了所有可以找到的adb拉/推帖,试图弄清楚这一点,但没有任何工作或真正应用。非常感谢任何帮助!

感谢。

2 个答案:

答案 0 :(得分:1)

我发现这是一个没有完成的dumpheap调用,因为它作为一个守护进程运行,并且adb pull实际上在拉空文件时是正确的。

我通过添加等待函数来解决这个问题,该等待函数一直等到设备上的文件完成后继续:

waitForFile() {
    # wait for file to stabalize at a size above 0
    local lastSize=0
    local matchCount=0
    while [ ${matchCount} -lt 3 ] ;
    do
        if [[ ${lastSize} -gt 0 && $(fileSize) = ${lastSize} ]] ;
            then
            let "matchCount+=1"
            echo "match ${matchCount}"
        else
            matchCount=0
            lastSize=$(fileSize)
            echo "Dumping file...current size = ${lastSize}"
        fi
        sleep 0.5
    done
    echo "Heap Dump Complete, file size = ${lastSize}"
}

fileSize() {
    local size=$(echo $(adb shell "ls -s /data/local/tmp/${FILENAME}-unconverted.hprof") | cut -f1 -d' ')
    echo $size
}

adb shell "am dumpheap ${PROCESS} /data/local/tmp/${FILENAME}-unconverted.hprof"
waitForFile
adb pull "/data/local/tmp/${FILENAME}-unconverted.hprof"
adb shell "rm /data/local/tmp/${FILENAME}-unconverted.hprof"

对于任何想要使用它来获得标准hprof的读者,可以在最后添加以下行:

hprof-conv -z ${FILENAME}-unconverted.hprof ${FILENAME}-standard.hprof

答案 1 :(得分:0)

  1. 您可以在调用dumpheap之后和调用abd pull之前添加一个短暂的睡眠(即睡眠5)(丑陋但快速的解决方案)。
  2. 你可以存储dumpheap进程的pid并在调用adb pull之前等待它结束。 祝你好运。