Android Monkey Runner设备调用挂起但在进程被杀死时工作

时间:2013-10-16 05:08:36

标签: android python ubuntu monkeyrunner

所以对于初学者来说,我有一个相当复杂的系统连接到一个python web套接字以触发一些不同的Android事件。我或多或少在Mac Mini上以工作形式给出了这个系统。我已经将它移植到Ubuntu 13.04并取得了一些成功。我遇到的问题是我用两个python脚本来实际触发这些Android事件。

我所拥有的是两个.py文件,run_wsh和performAction。基本上run_wsh通过套接字连接,并告知要触发的事件。 run_wsh启动performAction的子进程,并将perform输入的管道输入和performAction的输出返回run_wsh。

第一个主要调用是run_wsh中的“Install”。 run_wsh将此结果发送到performAction,它已经运行了一段时间的True:循环,等待输入。这可能是问题所在,但我不确定。 performAction通过设置以下内容来读取(使用python 2,因此raw_input是标准的):

input = raw_input()

performAction然后通过以下方式检查:

if input is None:
    continue
if input == "Install":
    device.installPackage('pathToMyApk.apk')
    runComponent = 'blah/.activityBlah'
    device.startActivity(component=runComponent)
    time.sleep(1)
    subprocess.call(['blah/adb', 'pull', '/pathToTextFileInAndroid.txt', '/pathToTextFileInUbuntu.txt']
    print "Install Successful"

这是在对模拟器的初始waitForConnection调用成功之后。现在每当发送“安装”时,它就会挂起而不会发生任何事情。我知道这一点,因为无法从run_wsh脚本中读取任何输出。作为参考,下面是run_wsh的相关位。

args = ['pathToMonkeyRunner', 'pathToPerformAction.py']
prog = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
prog.stdout.readline()
#This is to spit out a printed connection statement for when waitForConnection finishes
...
#Inside install call
inputToWrite = "Install"
prog.stdin.write(inputToWrite)
s = prog.stdout.readline()
f = open('/pathToTextFileInUbuntu.txt', 'r')
t = f.read()
#Read from the file and send information back out through the socket

我之前插入了print语句,以验证是否永远不会命中行s = prog.stdout.readline()。 performAction中有不同输入的其他elif案例,但也失败了,但我现在只是看这个案例。这里真正的错误是,当它挂起时,我最终只是终止了终端的python进程。当我使用安装部分注释掉(并且我的apk已经通过adb手动安装)完成此操作后,一旦该进程被终止,模拟器最终会像它应该的那样拉出活动页面(我正在运行窗口打开以进行调试,但通常会打开-no-window。世界上最奇怪的事情。我已经尝试在代码中插入各种time.sleep调用,或许如果我有数据竞争,我可以用这种或那种方式引导它,但唉,这似乎也失败了。

拜托,我知道这是一个庞大的系统中的一个大问题,但任何帮助都会很棒。我已经在网上寻找更深入的帮助python,monkey runner和Android,没有特别解决这个问题。

另外请忽略代码或写作中的任何愚蠢的拼写错误。我手工复制的代码是从vm中的终端而不是实际的复制粘贴。我已经改变了垃圾的各种途径,但它们应该足以理解。谢谢!

1 个答案:

答案 0 :(得分:0)

monkeyrunner也有同样的问题。我最初认为这是我的C#主机应用程序有问题,但是如果生成python 3问题,它将读取输入而没有问题。

一个different answer表示Jython 2.5.3中存在一个错误,您可以用Jython 2.5.4rc1 jar替换它,但这在Windows上并不能解决。


我需要的只是向jython进程发送消息的功能,所以我最终没有运行stdin,而是最终运行了HTTP服务器:

import time
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class PostHandler(BaseHTTPRequestHandler):
  def do_POST(self):
    content_len = int(self.headers.getheader('content-length', 0))
    post_body = self.rfile.read(content_len)
    for pair in post_body.split(';'):
      x, y = map(int, pair.split(','))
      device.touch(x, y, MonkeyDevice.DOWN_AND_UP)
      time.sleep(0.08)
    
    self.send_response(200)

if __name__ == '__main__':
  print 'Waiting for device connection...'
  device = MonkeyRunner.waitForConnection()

  server = HTTPServer(('localhost', 8080), PostHandler)
  print 'Got device, starting server, use <Ctrl-C> to stop'
  server.serve_forever()