Skip to content

GAutomator最隐藏功能 手游录制回放

Xumh edited this page Dec 4, 2017 · 3 revisions

1 隐藏的录制功能

GAutomator SDK在CommandHandler下有一个函数NotifyTouchElement。当开启录制模式后,会拦截用户的touch事件,并获取本次touch事件会操作的对应的GameObject。Android端的录制工具,一般只能录制touch事件。可记录控件的录制工具,一般需要通过PC端来进行录制。GAutomator的录制功能包含以下特点: 1、录制数据丰富:场景名、操作控件名、多点触控信息 2、实时:无延迟感受,可脱离PC

1.1 录制记录

GAutomator记录的一次touch事件的数据格式如下所示,因为多点触控,所以同一时刻可能会存在多个touch事件:

录制记录信息 传输的json数据如下所示:

{
    "touches": [
        {
            "y": 288, 
            "deltatime": 12771616, 
            "relativeY": 0.266666680574417, 
            "relativeX": 0.173958331346512, 
            "phase": 2, 
            "x": 334, 
            "fingerId": 0
        }
    ], 
    "scene": "main", 
    "name": "/Canvas/Panel/Sample"
}

1.2 录制过程

录制过程无非是拦截touch事件,获取录制记录对应的数据的过程。录制过程如下所示: 录制过程

  1. 拉起游戏开启录制功能后,等待用户操作游戏。触摸到手机屏幕后,即产生一个输入事件
  2. 判断输入事件阶段(begin、move、up),如果是Begin,查找操作的对应控件。
  3. 合并触屏操作,begin、move、up,begin事件与up事件间隔在200ms以内且begin、move、up的坐标均在50pix以内的合并为一个click事件。begin、move、up,begin事件与up事件间隔大于200ms且begin、move、up的坐标均在50pix以内的合并为一个press事件。其他的,采样move合并为一个swipe事件。(该部分工具目前交由PC端完成)
  4. 获取游戏场景,发送至录制工具
  5. 如果录制为结束,游戏未退出返回1。否则结束录制。

1.3 PC端记录录制过程

提供了录制回放的python demo,record.py中包含记录

import wpyscripts.manager as manager

class Record(object):
    ENTER_RECORD = 500
    LEAVE_RECORD = 501

    def __init__(self,path):
        self.engine = manager.get_engine()
        self.socket = self.engine.socket
        self.record_file=open(path,"w")

    def send_record(self):
        self.socket.send_command(Record.ENTER_RECORD)

    def format_touches(self,touches):
        t_str=[]
        for touch in touches:
            str="{{phase:{phase},fingerid:{fingerId},x:{x},y:{y},relativeX:{relativeX},relativeY:{relativeY},deltatime:{deltatime}}}".format(**touch)
            t_str.append(str)

        res=",".join(t_str)

        return res

    def format_record(self, record):
        touches_str=self.format_touches(record["touches"])
        record_str="{0},{1},[{2}]\n".format(record["scene"],record["name"],touches_str)
        return record_str

    def recv_record(self):
        self.socket.socket.settimeout(None)
        while True:
            record = self.socket._recv_data()
            print record
            record_str=self.format_record(record)
            #print record_str
            self.record_file.write(record_str)
            self.record_file.flush()


if __name__ == '__main__':
    record = Record("record1.txt")
    record.send_record()
    record.recv_record()

2 回放

根据录制内容进行回放可以有很多种算法,这里讲述其中一种方法。主要利用GAutomator提供的get_touchable_elements_bound接口,获取当前游戏界面的场景名称,可操作控件来选择放回内容。 录制记录的touch时间中包含,deltatime游戏开始到现在的时长,touch事件只包括down与up。录制的记录较为原子,所以在回放之前可以对这部分录制记录进行预处理,进行转换(event.py中的RecorderParser) 回放处理

回放过程。获取当前游戏的包名、场景名称、可操作控件集合,根据一定的策略进行回放操作。以往的回放只根据录制的操作序列,该算法以最优匹配作为回放策略,能够极大概率跳过弹出框等异常情况继续执行回放操作。回放的策略如下图所示,相关代码(play_back.py,decision_tree.py): 回放算法与策略

3 使用详解

下载附件中的GAutomator,包含一个autotest的文件即为录制回放相关的内容。可利用sample下的wetest_demo.apk进行录制回放的尝试。 录制步骤: step 1:拉起集成SDK的游戏 step 2:设置录制的文件名称,在record.py的Record类的初始化参数 step 3:运行record.py step 4:玩游戏进行录制(轻适当放慢操作)

回放过程: step 1:拉起游戏 step 2:设置好录制记录文件,在play_back.py中 step 3:运行play_back.py,直接进行回放

录制回放示例代码