【问题标题】:Any faster way to dump UI hierarchy?有更快的方法来转储 UI 层次结构吗?
【发布时间】:2014-12-02 18:59:29
【问题描述】:

现在我正在使用 uiautomator 像这样转储 UI:

adb shell uiautomator dump

它运行良好,只是执行它需要大约 3 秒。所以我想知道是否有更快的方法来做到这一点?比如创建一个转储 UI 的服务,还是需要同样长的时间?

【问题讨论】:

    标签: android android-layout android-ui android-uiautomator


    【解决方案1】:

    我想我应该回答我自己的问题,因为我找到了更好的方法。我发现这个项目将 uiautomator 与轻量级 rpc 服务器一起使用,因此您可以向设备发送命令:

    https://github.com/xiaocong/android-uiautomator-server#build

    这几乎可以立即进行倾倒,并且效果非常好。如果您想了解如何进行 rpc 调用,他还有一个 python 项目:

    https://github.com/xiaocong/uiautomator

    但我在这里创建了一个小例子。

    启动服务器:

    # Start the process
    process = subprocess.Popen(
            'adb shell uiautomator runtest '
            'bundle.jar uiautomator-stub.jar '
            '-c com.github.uiautomatorstub.Stub', stdout=subprocess.PIPE, shell=True)
    # Forward adb ports 
    subprocess.call('adb forward tcp:9008 tcp:9009')
    

    调用命令的函数(“ping”、“dumpWindowHierarchy”等):

    def send_command(self, method_name, *args):
        """
        Send command to the RPC server
    
        Args:
            method_name(string): Name of method to run
            *args: Arguments
        """
        data = {
            'jsonrpc': '2.0',
            'method': method_name,
            'id': 1,
        }
        if args:
            data['params'] = args
        request = urllib2.Request(
            'http://localhost:{0}/jsonrpc/0'.format(self.local_port),
            json.dumps(data),
            {
                'Content-type': 'application/json'
            })
        try:
            result = urllib2.urlopen(request, timeout=30)
        except Exception as e:
            return None
        if result is None:
            return None
        json_result = json.loads(result.read())
        if 'error' in json_result:
            raise JsonRPCError('1',
                               'Exception when sending command to '
                               'UIAutomatorServer: {0}'.format(
                                   json_result['error']))
        return json_result['result']
    

    请注意,您必须先将文件(bundle.jar 和uiautomator-stub.jar)从第一个项目推送到设备,并将它们放在“/data/local/tmp/”中

    【讨论】:

      【解决方案2】:

      似乎是一个旧线程,但这是一个更新的解决方案。 这可以通过使用以下 npm 模块在 JS/Node 应用程序中简单地实现。此模块使用与上述答案中提到的相同的服务器,但它看起来很简单。

      npm install uiautomator-server
      

      然后在你的项目中添加以下代码:

      const UIAutomator = require('uiautomator-server');
      
      const myDevice = new UIAutomator((err, currDevice) => {
      
          if (err) {
      
          console.log(`Error starting UI Automator server : ${err}`);
      
          }
          console.log(`UI Automator server started`);
      
          currDevice.dump(false, (error, xmlDump) => {
      
            if (error) {
      
             console.log(`Error while getting dump : ${error}`);
      
            }
            console.log(`xmlDump in as string: ${xmlDump}`);
      
        });
      
      });
      

      启动服务器(创建新的自动化对象)可能需要一些时间(大约 1 秒),但是一旦启动服务,转储和其他操作非常快,即大多数情况下小于 300 毫秒案例。 您可以创建一个新的 UIAutomator 对象,然后在以后使用相同的实例进行所有操作

      【讨论】:

        【解决方案3】:

        现在2021年了,用起来更方便https://github.com/openatx/uiautomator2

        pip install --upgrade --pre uiautomator2
        python
        >>> import uiautomator2 as u2
        >>> d=u2.connect()
        >>> d.dump_hierarchy()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-03
          • 1970-01-01
          • 1970-01-01
          • 2014-07-23
          • 2011-04-24
          • 2011-09-06
          • 2015-02-23
          • 1970-01-01
          相关资源
          最近更新 更多