最近研究了一下monkeyrunner的源码,发现它其实是依赖chimpchat实现的,跟了一下代码,最主要的原理就是在使用了adb forward和adb shell monkey --port两个命令后,通过socket将自定义格式的命令从PC端发送给设备上的monkey,让monkey去执行。对应的代码在MonkeySourceNetwork和MonkeySourceNetworkViews两个类中。
SDK文档说The monkeyrunner tool is not related to the UI/Application Exerciser Monkey,其实他们两个关系非常密切。
我直接在命令行执行forward和monkey --port命令后,用telnet去输入那些命令,这里就遇到问题了,像press,touch,key这些命令都能执行并得到回馈,但是如果执行listviews或者queryview这样的命令,就会没反应,如果是直接调试PC端这边的chimpchat,可以发现这边的代码是一直阻塞在readLine()方法。
想请教一下高手,有些命令为什么直接在telnet里面无法执行,是还需要其他的命令还配合还是什么?
下面是命令列表,大家可以试一下static {
        // Add in all the commands we support
        COMMAND_MAP.put("flip", new FlipCommand());
        COMMAND_MAP.put("touch", new TouchCommand());
        COMMAND_MAP.put("trackball", new TrackballCommand());
        COMMAND_MAP.put("key", new KeyCommand());
        COMMAND_MAP.put("sleep", new SleepCommand());
        COMMAND_MAP.put("wake", new WakeCommand());
        COMMAND_MAP.put("tap", new TapCommand());
        COMMAND_MAP.put("press", new PressCommand());
        COMMAND_MAP.put("type", new TypeCommand());
        COMMAND_MAP.put("listvar", new MonkeySourceNetworkVars.ListVarCommand());
        COMMAND_MAP.put("getvar", new MonkeySourceNetworkVars.GetVarCommand());
        COMMAND_MAP.put("listviews", new MonkeySourceNetworkViews.ListViewsCommand());
        COMMAND_MAP.put("queryview", new MonkeySourceNetworkViews.QueryViewCommand());
        COMMAND_MAP.put("getrootview", new MonkeySourceNetworkViews.GetRootViewCommand());
        COMMAND_MAP.put("getviewswithtext",
                        new MonkeySourceNetworkViews.GetViewsWithTextCommand());
        COMMAND_MAP.put("deferreturn", new DeferReturnCommand());
    }        //queryview [id type] [id(s)] [command]
        //queryview viewid button1 gettext
        //queryview accessibilityids 12 5 getparent