monkeyrunner内置uiautomator出错的原因
来源:互联网 发布:验证域名所有权的方法 编辑:程序博客网 时间:2024/05/20 11:51
之前做app功能遍历的项目中使用的是monkeyrunner+hierarchyviewer的方式,但是hierarchyviewer提供的信息太多而且无用的信息居多,所以想换成monkeyrunner+uiautomatorviewer的方式来做。但是在集合的时候调用monkeyrunner和uiautomator时出错:
public void test_Exception() {System.setProperty("com.android.uiautomator.bindir", "D:/sdk/tools");DebugBridge.init();MyDeviceManager manager = null;IDevice idevice = null;try {Thread.sleep(3000);List<IDevice> devices = DebugBridge.getDevices();idevice = devices.get(0);manager = new MyDeviceManager(idevice);getUIHierarchy(idevice);} catch (Exception e) {e.printStackTrace();} finally {manager.dispose();DebugBridge.terminate();}}private void getUIHierarchy(IDevice idevice) {String path = System.getProperty("user.dir") + File.separator + "xml" + File.separator + "uidump.xml";String command = String.format("%s %s %s", new Object[] { "/system/bin/uiautomator", "dump","/data/local/tmp/qianhui.xml" });CountDownLatch commandCompleteLatch = new CountDownLatch(1);try {idevice.executeShellCommand(command, new CollectingOutputReceiver(commandCompleteLatch), 40000);commandCompleteLatch.await(40L, TimeUnit.SECONDS);System.out.println("Pull UI XML snapshot from device...1212");idevice.getSyncService().pullFile("/data/local/tmp/qianhui.xml", path, SyncService.getNullProgressMonitor());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
在MyDeviceManager构造方法中执行的是创建monkey对象:
public MyDeviceManager(IDevice iDevice) {this.mIDevice = iDevice;this.mAdbChimpDevice = new AdbChimpDevice(iDevice);/*String width = mAdbChimpDevice.getProperty("display.width");System.out.println(width);String height = mAdbChimpDevice.getProperty("display.height");System.out.println(height);sWidth = Integer.parseInt(width);sHeight = Integer.parseInt(height);*/}
当我执行上面的代码时报错:
06-01 17:06:47.897: E/AndroidRuntime(3007): *** FATAL EXCEPTION IN SYSTEM PROCESS: main06-01 17:06:47.897: E/AndroidRuntime(3007): java.lang.IllegalStateException: UiAutomationService android.accessibilityservice.IAccessibilityServiceClient$Stub$Proxy@421baa38already registered!06-01 17:06:47.897: E/AndroidRuntime(3007): at android.os.Parcel.readException(Parcel.java:1473)06-01 17:06:47.897: E/AndroidRuntime(3007): at android.os.Parcel.readException(Parcel.java:1419)06-01 17:06:47.897: E/AndroidRuntime(3007): at android.view.accessibility.IAccessibilityManager$Stub$Proxy.registerUiTestAutomationService(IAccessibilityManager.java:342)06-01 17:06:47.897: E/AndroidRuntime(3007): at android.app.UiAutomationConnection.registerUiTestAutomationServiceLocked(UiAutomationConnection.java:175)06-01 17:06:47.897: E/AndroidRuntime(3007): at android.app.UiAutomationConnection.connect(UiAutomationConnection.java:72)06-01 17:06:47.897: E/AndroidRuntime(3007): at android.app.UiAutomation.connect(UiAutomation.java:188)06-01 17:06:47.897: E/AndroidRuntime(3007): at com.android.uiautomator.core.UiAutomationShellWrapper.connect(UiAutomationShellWrapper.java:32)06-01 17:06:47.897: E/AndroidRuntime(3007): at com.android.commands.uiautomator.DumpCommand.run(DumpCommand.java:74)06-01 17:06:47.897: E/AndroidRuntime(3007): at com.android.commands.uiautomator.Launcher.main(Launcher.java:83)06-01 17:06:47.897: E/AndroidRuntime(3007): at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)06-01 17:06:47.897: E/AndroidRuntime(3007): at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:271)06-01 17:06:47.897: E/AndroidRuntime(3007): at dalvik.system.NativeStart.main(Native Method)06-01 17:06:47.907: E/ServiceManager(3007): error in getService06-01 17:06:47.907: E/ServiceManager(3007): android.os.RemoteException: Unknown binder error code. 0xfffffff706-01 17:06:47.907: E/ServiceManager(3007): at android.os.BinderProxy.transact(Native Method)06-01 17:06:47.907: E/ServiceManager(3007): at android.os.ServiceManagerProxy.getService(ServiceManagerNative.java:123)06-01 17:06:47.907: E/ServiceManager(3007): at android.os.ServiceManager.getService(ServiceManager.java:55)06-01 17:06:47.907: E/ServiceManager(3007): at android.app.ActivityManagerNative$1.create(ActivityManagerNative.java:2152)06-01 17:06:47.907: E/ServiceManager(3007): at android.app.ActivityManagerNative$1.create(ActivityManagerNative.java:2150)06-01 17:06:47.907: E/ServiceManager(3007): at android.util.Singleton.get(Singleton.java:34)06-01 17:06:47.907: E/ServiceManager(3007): at android.app.ActivityManagerNative.getDefault(ActivityManagerNative.java:76)06-01 17:06:47.907: E/ServiceManager(3007): at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:86)06-01 17:06:47.907: E/ServiceManager(3007): at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)06-01 17:06:47.907: E/ServiceManager(3007): at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)06-01 17:06:47.907: E/ServiceManager(3007): at dalvik.system.NativeStart.main(Native Method)06-01 17:06:47.917: I/Process(3007): Sending signal. PID: 3007 SIG: 906-01 17:06:47.917: E/AndroidRuntime(3007): Error reporting crash06-01 17:06:47.917: E/AndroidRuntime(3007): java.lang.NullPointerException06-01 17:06:47.917: E/AndroidRuntime(3007): at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:86)06-01 17:06:47.917: E/AndroidRuntime(3007): at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)06-01 17:06:47.917: E/AndroidRuntime(3007): at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)06-01 17:06:47.917: E/AndroidRuntime(3007): at dalvik.system.NativeStart.main(Native Method)
而当我把
manager = new MyDeviceManager(idevice);getUIHierarchy(idevice);
的位置调换一下,执行成功。所以我怀疑monkeyrunner在启动的时候已经创建了uiautomator的对象,才会造成上面的提示错误,所以我试图去查看一下monkeyrunner到底有没有做这件事。
查看AdbChimpDevice创建的源码,发现
String command = new StringBuilder().append("monkey --port ").append(port).toString(); executeAsyncCommand(command, new LoggingOutputReceiver(LOG, Level.FINE));
这一步是打开monkey,在cmd下执行该命令就能知道:
通过这条命令我找到了system/bin下的monkey脚本:
# Script to start "monkey" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/monkey.jartrap "" HUPexec app_process $base/bin com.android.commands.monkey.Monkey $*
然后用dex2jar工具将其编译成classes_dex2jar.jar,然后用JD-GUI打开。
找到了执行的方法,但是没发现执行uiautomator的函数。继续看AdbChimpDevice里方法一路跟踪到ChimpManager这个类,在AdbChimpDevice执行力该类的wake()方法:
public void wake() throws IOException { sendMonkeyEvent("wake"); }
private String sendMonkeyEventAndGetResponse(String command) throws IOException { command = command.trim(); LOG.info(new StringBuilder().append("Monkey Command: ").append(command).append(".").toString()); this.monkeyWriter.write(new StringBuilder().append(command).append("\n").toString()); this.monkeyWriter.flush(); return this.monkeyReader.readLine(); }
最终向12345端口的socket发送了一条wake的命令。
很不幸,被我言中了。看来将uiautomator内置进来,还不是一件轻松的事情!
0 0
- monkeyrunner内置uiautomator出错的原因
- monkeyrunner加载python模块出错的解决方法
- delete出错的原因
- 程序出错的原因
- 移植MonkeyRunner的图片对比和获取子图功能的实现-UiAutomator/Robotium篇
- 移植MonkeyRunner的图片对比和获取子图功能的实现-UiAutomator/Robotium篇
- 移植MonkeyRunner的图片对比和获取子图功能的实现-UiAutomator/Robotium篇
- 移植MonkeyRunner的图片对比和获取子图功能的实现-UiAutomator/Robotium篇
- 移植MonkeyRunner的图片对比和获取子图功能的实现-UiAutomator/Robotium篇
- 移植MonkeyRunner的图片对比和获取子图功能的实现-UiAutomator/Robotium篇
- 用hibernate内置方法取对象列表,前台用el表达式取对象的对象出错的原因
- 基本上找到出错的原因
- GPF出错的原因之一
- 数据绑定出错的原因
- @Autowired注解出错的原因
- SDK release14 运行monkeyrunner出错
- android自动测试方法分析(monkeyrunner,robotium,uiautomator)
- Android Testing Fundamentals 2, robotium, uiautomator, monkeyrunner and monkey
- MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白
- 跑数速度慢,修改参数
- poj 1328 Radar Installation
- 微信公众平台之CURL应用
- C++面试出现频率最高的30道题目(二)
- monkeyrunner内置uiautomator出错的原因
- 设计模式学习笔记
- HTML5中x-webkit-speech语音输入功能
- poj 3669Meteor Shower
- K-SVD与On-line dictionary learning
- <Lua程序设计(第二版)>书摘-11
- Cloudfoundry的部署工具BOSH介绍
- poj 3009Curling 2.0
- 网站建设的要素