2012-08-02 24 views
2

我正在开发一个工具来识别android应用程序中的窗口小部件,并在点击时显示它们的属性。我已经创建了一个独立的工具,可以成功完成此任务,但是我在将独立工具转换为eclipse插件时遇到了问题,这对于打包到最终产品中将是必需的。发送logcat输入到monkeyrunner通过eclipse/java导致问题

工具运行的方式是首先在模拟器上运行一个透明的覆盖应用程序。此应用程序收集用户屏幕按下的坐标并将其写入Android日志。然后,在模拟器上启动要测试的应用程序。

Adb logcat作为标准输入传送到处理小部件标识的monkeyrunner脚本中。 monkeyrunner脚本实时解析坐标信息的logcat输入。 monkeyrunner脚本使用AndroidViewClient(https://github.com/dtmilano/AndroidViewClient),该工具可以列出屏幕上的所有View对象及其属性。使用坐标印刷机信息,从具有正确坐标属性的视图列表中选择视图,并打印出其属性。

我的问题源于尝试在eclipse/java的上下文中处理logcat输出到monkeyrunner脚本的管道。如果我在单独的并发进程中运行adb logcat和monkeyrunner,并将logcat的InputStream传输到monkeyrunner的OutputStream,似乎存在一些锁定问题,因为monkeyrunner从未接收到坐标信息作为输入。我试图把流处理程序放在不同的线程中,但是这没有效果。

由于并发进程有时可能成为问题的根源,我以为直接在monkeyrunner中从logcat中读取,因此只有一个主进程。在monkeyrunner中,一旦与仿真器建立连接,就可以在其上打开一个adb shell(https://developer.android.com/tools/help/MonkeyDevice.html#shell)。 logcat的是一个很常见的亚行命令,但是当我运行device.shell(“logcat中”),它失败

[main] [com.android.chimpchat.adb.AdbChimpDevice] Error executing command: logcat 

[main] [com.android.chimpchat.adb.AdbChimpDevice]com.android.ddmlib.ShellCommandUnrespo‌​nsiveException – 

不幸的是,我的谷歌技能一直没能找到我解决了这个问题。

回答

2

嗯,我想这是你在找什么:

#! /usr/bin/env monkeyrunner 
import time 
import subprocess 

# Imports the monkeyrunner modules 
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage 

# Connects to the current device, returning a MonkeyDevice object 
device = MonkeyRunner.waitForConnection() 

p = subprocess.Popen([ "adb", "logcat", "TEST:V", "*:S" ], shell=False, 
     stdout=subprocess.PIPE) 
i = 0 
while True: 
    device.shell("log -t TEST This is line %d" % i) 
    i += 1 
    print p.stdout.readline() 
    time.sleep(1) 

连接到该设备,编写和还读取logcat的一个monkeyrunner脚本。

顺便说一句,我很高兴听到你发现AndroidViewClient有用。

+0

谢谢!我不知道为什么我没有想到为adb运行子进程。我想我不太熟悉python。另外,我是AndroidViewClient和您的博客的忠实粉丝!我一直在研究的这两个开源项目经常使用您的博客作为想法/参考http://sourceforge.net/apps/mediawiki/guitar/index.php?title=Android_GUITAR和http://sourceforge.net/应用/的mediawiki /吉他/的index.php?标题= Intents_GUITAR – Rowhawn 2012-08-04 20:25:29