MonkeyRunner生成僵尸进程

时间:2014-05-12 15:49:12

标签: android adb monkeyrunner zombie-process

我在真实设备上使用 MonkeyRunner 进行Android自动化测试并运行隔夜测试。在其中一项广泛的自动化测试中,我发现只要MonkeyRunner截取屏幕截图,就会在设备内部系统上创建僵尸进程。在这里,当我运行adb shell ps命令时,您可以在下面看到僵尸进程:

enter image description here

随着僵尸进程的增加,设备无响应并开始挂起。在MonkeyRunner中,截屏是唯一的验证方式。因此,当运行需要花费数小时的大量测试时,这个问题非常关键。

我还看到this

  

framebuffer_service没有对产生的“等待”   screencap进程完成。因此,孩子进程   成为僵尸进程。

并建议修改adb源代码本身。但是,我认为必须有任何其他解决方案,而不是深入到源代码。

任何想法/建议如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我发现这很大程度上取决于Android版本和screencap实现。 您可以运行此测试(在 KitKat 上成功,但在以前的版本上可能会失败)来验证您的情况。

#! /usr/bin/python -u
# -*- coding: utf-8 -*-
'''
Copyright (C) 2014  Diego Torres Milano
'''

import sys
import unittest

from com.dtmilano.android.adb.adbclient import AdbClient

VERBOSE = True
TIMES = 40
SLEEP = 0

def repeat(times):
    def repeater(t):
        def caller(*args):
            for f in (t,)*times:
                if VERBOSE:
                    sys.stdout.write('.')
                f(*args)
                if SLEEP:
                    time.sleep(SLEEP)
        return caller
    return repeater

class TakeSnapshotTests(unittest.TestCase):

    def setUp(self):
        self.device = AdbClient(serialno=serialno)

    def tearDown(self):
        pass

    @repeat(TIMES)
    def testSnapshot(self):
        self.device.takeSnapshot(reconnect=True).save('/dev/null', 'PNG')
        out = self.device.shell('ps | grep screencap').split('\n')
        if len(out) > 1:
            self.fail(out)

    @staticmethod
    def main():
        unittest.main()

if __name__ == '__main__':
    if len(sys.argv) >= 2:
        serialno = sys.argv.pop(1)
    else:
        serialno = '.*'
    TakeSnapshotTests.main()