之前做app功能遍历的项目中使用的是monkeyrunner+hierarchyviewer的方式,但是hierarchyviewer提供的信息太多而且无用的信息居多,所以想换成
monkeyrunner+uiautomatorviewer的方式来做。但是在集合的时候调用monkeyrunner和uiautomator时出错: publicvoidtest_Exception(){ System.setProperty("com.android.uiautomator.bindir","D:/sdk/tools"); DebugBridge.init(); MyDeviceManagermanager=null; IDeviceidevice=null; try{ Thread.sleep(3000); List<IDevice>devices=DebugBridge.getDevices(); idevice=devices.get(0); manager=newMyDeviceManager(idevice); getUIHierarchy(idevice); }catch(Exceptione){ e.printStackTrace(); }finally{ manager.dispose(); DebugBridge.terminate(); } } privatevoidgetUIHierarchy(IDeviceidevice){ Stringpath=System.getProperty("user.dir")+File.separator+"xml"+File.separator+"uidump.xml"; Stringcommand=String.format("%s%s%s",newObject[]{"/system/bin/uiautomator","dump", "/data/local/tmp/qianhui.xml"}); CountDownLatchcommandCompleteLatch=newCountDownLatch(1); try{ idevice.executeShellCommand(command,newCollectingOutputReceiver(commandCompleteLatch),40000); commandCompleteLatch.await(40L,TimeUnit.SECONDS); System.out.println("PullUIXMLsnapshotfromdevice...1212"); idevice.getSyncService().pullFile("/data/local/tmp/qianhui.xml",path,SyncService.getNullProgressMonitor()); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } |
在MyDeviceManager构造方法中执行的是创建monkey对象:
publicMyDeviceManager(IDeviceiDevice){
this.mIDevice=iDevice;
this.mAdbChimpDevice=newAdbChimpDevice(iDevice);
/*Stringwidth=mAdbChimpDevice.getProperty("display.width");
System.out.println(width);
Stringheight=mAdbChimpDevice.getProperty("display.height");
System.out.println(height);
sWidth=Integer.parseInt(width);
sHeight=Integer.parseInt(height);*/
}
当我执行上面的代码时报错:
06-0117:06:47.897:E/AndroidRuntime(3007):***FATALEXCEPTIONINSYSTEMPROCESS:main 06-0117:06:47.897:E/AndroidRuntime(3007):java.lang.IllegalStateException:UiAutomationServiceandroid.accessibilityservice.IAccessibilityServiceClient$Stub$Proxy@421baa38alreadyregistered! 06-0117:06:47.897:E/AndroidRuntime(3007):atandroid.os.Parcel.readException(Parcel.java:1473) 06-0117:06:47.897:E/AndroidRuntime(3007):atandroid.os.Parcel.readException(Parcel.java:1419) 06-0117:06:47.897:E/AndroidRuntime(3007):atandroid.view.accessibility.IAccessibilityManager$Stub$Proxy.registerUiTestAutomationService(IAccessibilityManager.java:342) 06-0117:06:47.897:E/AndroidRuntime(3007):atandroid.app.UiAutomationConnection.registerUiTestAutomationServiceLocked(UiAutomationConnection.java:175) 06-0117:06:47.897:E/AndroidRuntime(3007):atandroid.app.UiAutomationConnection.connect(UiAutomationConnection.java:72) 06-0117:06:47.897:E/AndroidRuntime(3007):atandroid.app.UiAutomation.connect(UiAutomation.java:188) 06-0117:06:47.897:E/AndroidRuntime(3007):atcom.android.uiautomator.core.UiAutomationShellWrapper.connect(UiAutomationShellWrapper.java:32) 06-0117:06:47.897:E/AndroidRuntime(3007):atcom.android.commands.uiautomator.DumpCommand.run(DumpCommand.java:74) 06-0117:06:47.897:E/AndroidRuntime(3007):atcom.android.commands.uiautomator.Launcher.main(Launcher.java:83) 06-0117:06:47.897:E/AndroidRuntime(3007):atcom.android.internal.os.RuntimeInit.nativeFinishInit(NativeMethod) 06-0117:06:47.897:E/AndroidRuntime(3007):atcom.android.internal.os.RuntimeInit.main(RuntimeInit.java:271) 06-0117:06:47.897:E/AndroidRuntime(3007):atdalvik.system.NativeStart.main(NativeMethod) 06-0117:06:47.907:E/ServiceManager(3007):erroringetService 06-0117:06:47.907:E/ServiceManager(3007):android.os.RemoteException:Unknownbindererrorcode.0xfffffff7 06-0117:06:47.907:E/ServiceManager(3007):atandroid.os.BinderProxy.transact(NativeMethod) 06-0117:06:47.907:E/ServiceManager(3007):atandroid.os.ServiceManagerProxy.getService(ServiceManagerNative.java:123) 06-0117:06:47.907:E/ServiceManager(3007):atandroid.os.ServiceManager.getService(ServiceManager.java:55) 06-0117:06:47.907:E/ServiceManager(3007):atandroid.app.ActivityManagerNative$1.create(ActivityManagerNative.java:2152) 06-0117:06:47.907:E/ServiceManager(3007):atandroid.app.ActivityManagerNative$1.create(ActivityManagerNative.java:2150) 06-0117:06:47.907:E/ServiceManager(3007):atandroid.util.Singleton.get(Singleton.java:34) 06-0117:06:47.907:E/ServiceManager(3007):atandroid.app.ActivityManagerNative.getDefault(ActivityManagerNative.java:76) 06-0117:06:47.907:E/ServiceManager(3007):atcom.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:86) 06-0117:06:47.907:E/ServiceManager(3007):atjava.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) 06-0117:06:47.907:E/ServiceManager(3007):atjava.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) 06-0117:06:47.907:E/ServiceManager(3007):atdalvik.system.NativeStart.main(NativeMethod) 06-0117:06:47.917:I/Process(3007):Sendingsignal.PID:3007SIG:9 06-0117:06:47.917:E/AndroidRuntime(3007):Errorreportingcrash 06-0117:06:47.917:E/AndroidRuntime(3007):java.lang.NullPointerException 06-0117:06:47.917:E/AndroidRuntime(3007):atcom.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:86) 06-0117:06:47.917:E/AndroidRuntime(3007):atjava.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) 06-0117:06:47.917:E/AndroidRuntime(3007):atjava.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) 06-0117:06:47.917:E/AndroidRuntime(3007):atdalvik.system.NativeStart.main(NativeMethod) |
而当我把
manager=newMyDeviceManager(idevice);
getUIHierarchy(idevice);
的位置调换一下,执行成功。所以我怀疑monkeyrunner在启动的时候已经创建了uiautomator的对象,才会造成上面的提示错误,所以我试图去查看一下monkeyrunner到底有没有做这件事。
查看AdbChimpDevice创建的源码,发现
Stringcommand=newStringBuilder().append("monkey--port").append(port).toString();
executeAsyncCommand(command,newLoggingOutputReceiver(LOG,Level.FINE));
这一步是打开monkey,在cmd下执行该命令就能知道: