InputManager

本部分旨在解释 Kea 的中的策略及输入控制器类 InputManager 的设计与实现。

功能设计与实现

InputManager类是事件生成器的控制类,负责启动、停止事件的生成, 并负责根据指定的输入策略生成和发送事件,支持随机探索策略、主路径引导策略和LLM策略。 该类提供了灵活的事件管理机制,允许用户自定义事件生成策略,并能够根据应用的运行状态动态调整事件发送。 InputManager所包含的主要方法有:

  • 获取当前测试用户所选择的探索策略。

  • 添加事件到设备的执行事件列表等待执行。

  • 使用当前探索策略开始生成事件进行测试。

  • 停止生成事件,结束此次测试。

../../_images/input_manager.png

InputManager 类的组成

备注

为了便于读者理解,本文中提供的代码段简化版本仅对核心流程进行抽象并展示,实际代码与简化的参考代码不完全一致。

类属性

  • DEFAULT_POLICY: 默认的输入策略名称。

  • RANDOM_POLICY: 随机输入策略名称。

  • DEFAULT_EVENT_INTERVAL: 默认事件间隔时间。

  • DEFAULT_EVENT_COUNT: 默认生成事件的数量。

  • DEFAULT_TIMEOUT: 默认超时时间。

  • DEFAULT_DEVICE_SERIAL: 默认设备序列号。

  • DEFAULT_UI_TARPIT_NUM: 默认UI陷阱数量。

InputManager类中的数据结构

  1. device

    device是Device的对象,用于记录当前测试的设备信息,便于后续对设备的交互操作。

  2. app

    app是App的对象,用于记录当前所测试的移动应用的信息。

  3. policy & policy_name

    policy_name是string类型,用于存储用户所选择的探索策略名。policy是具体探索策略类的对象。

  4. event_count & event_interval & number_of_events_that_restart_app

    这三个成员变量均为整型。event_count记录从测试开始到现在生成的事件个数;event_interval记录了用户设置的两个事件之间停顿的时间; number_of_events_that_restart_app为多少个事件后需要重启应用程序。

  5. kea

    kea为Kea类的对象,用于生成事件过程中从Kea类中取出记录数据来完成对应用性质的测试。

  6. enabled

    enabled为bool类型,用于记录当前事件生成器是否需要继续生成事件,默认值为True。

  7. generate_utg

    enerate_utg为bool类型用于记录用户所设置的是否生成UI转移图的参数,便于生成事件的过程中判断是否应该生成UI转移图。

  8. sim_caculator

    sim_caculator为Similarity的对象,用于计算上一个界面状态与当前界面状态之间的相似性。

InputManager类中的成员方法

构造函数

__init__ 方法用于初始化InputManager实例,设置事件发送的基本参数,并根据提供的策略名称初始化对应的输入策略。

参数:
  • device: Device实例,表示目标设备。

  • app: App实例,表示目标应用。

  • policy_name: 字符串,指定生成事件的策略名称。

  • random_input: 布尔值,指示是否使用随机输入。

  • event_interval: 事件间隔时间。

  • event_count: 事件生成数量,默认为``DEFAULT_EVENT_COUNT``。

  • profiling_method: 分析方法,用于性能分析。

  • kea: Kea实例,用于性质测试。

  • number_of_events_that_restart_app: 重启应用的事件数量。

  • generate_utg: 布尔值,指示是否生成UTG。

核心流程:
  1. 初始化日志记录器。

  2. 设置事件发送参数。

  3. 根据策略名称初始化输入策略。

  4. 设置相似度计算器。

获取探索策略的方法

  1. get_input_policy

    get_input_policy 方法根据用户所选择的policy_name来实例化对应的探索策略对象。 实例化的对象存储在policy成员变量里。支持的策略包括:随机探索策略、主路径引导策略和LLM策略。

    参数:
    • device: Device实例。

    • app: App实例。

    返回:
    • 本次测试使用的策略实例。

    核心流程:
    1. 根据策略名称判断使用哪种输入策略。

    2. 创建对应的输入策略实例。

    def get_input_policy(self, device, app):
        if self.policy_name == POLICY_NONE:
            input_policy = None
        elif self.policy_name == POLICY_GUIDED:
            input_policy = GuidedPolicy(device,app,self.kea,self.generate_utg)
        elif self.policy_name == POLICY_RANDOM:
            input_policy = RandomPolicy(device, app, self.kea, self.number_of_events_that_restart_app, True, self.generate_utg)
        elif self.policy_name == POLICY_LLM:
            input_policy = LLMPolicy(device, app, self.kea, self.number_of_events_that_restart_app, True, self.generate_utg)
        else:
            input_policy = None
        return input_policy
    

事件生成器的控制方法

  1. start

    start 方法用于启动所选定的探索策略。

    核心流程:
    1. 记录开始发送事件的日志。

    2. 根据输入策略开始发送事件。

    3. 处理键盘中断,确保优雅退出。

    def start(self):
        try:
            if self.policy is not None:
                self.policy.start(self)
        except KeyboardInterrupt:
            pass
        self.stop()
    
  2. stop

    stop 方法用于结束探索过程。

    核心流程:
    1. 终止事件发送。

    2. 清理事件发送相关的资源。

    3. 记录停止发送事件的日志。

    def stop(self):
        self.enabled = False
    
  3. add_event

    add_event添加一个事件到事件列表,并将该事件发送给移动设备。

    参数:
    • event: 要添加的事件,应为AppEvent的子类。

    核心流程:
    1. 将事件添加到事件列表。

    2. 创建事件日志记录器。

    3. 根据事件间隔时间发送事件到设备。

    def add_event(self, event):
        if event is None:
            return
        self.events.append(event)
        event_log = EventLog(self.device, self.app, event)
        event_log.start()
        while True:
            time.sleep(self.event_interval)
            if not self.device.pause_sending_event:
                break
        event_log.stop()
    

使用方法

InputManager类的主要作用是控制事件生成器并管理应用运行期间的事件发送。 用户可以通过构造函数初始化InputManager实例,并设置相应的参数,如测试设备、被测应用、策略名称等。 然后,可以通过start方法启动事件生成器。通过add_event方法添加单个事件,并发送。通过stop方法停止生成事件。