InputManager
本部分旨在解释 Kea 的中的策略及输入控制器类 InputManager 的设计与实现。
功能设计与实现
InputManager类是事件生成器的控制类,负责启动、停止事件的生成, 并负责根据指定的输入策略生成和发送事件,支持随机探索策略、主路径引导策略和LLM策略。 该类提供了灵活的事件管理机制,允许用户自定义事件生成策略,并能够根据应用的运行状态动态调整事件发送。 InputManager所包含的主要方法有:
获取当前测试用户所选择的探索策略。
添加事件到设备的执行事件列表等待执行。
使用当前探索策略开始生成事件进行测试。
停止生成事件,结束此次测试。
InputManager 类的组成
备注
为了便于读者理解,本文中提供的代码段简化版本仅对核心流程进行抽象并展示,实际代码与简化的参考代码不完全一致。
类属性
DEFAULT_POLICY: 默认的输入策略名称。RANDOM_POLICY: 随机输入策略名称。DEFAULT_EVENT_INTERVAL: 默认事件间隔时间。DEFAULT_EVENT_COUNT: 默认生成事件的数量。DEFAULT_TIMEOUT: 默认超时时间。DEFAULT_DEVICE_SERIAL: 默认设备序列号。DEFAULT_UI_TARPIT_NUM: 默认UI陷阱数量。
InputManager类中的数据结构
device
device是Device的对象,用于记录当前测试的设备信息,便于后续对设备的交互操作。
app
app是App的对象,用于记录当前所测试的移动应用的信息。
policy & policy_name
policy_name是string类型,用于存储用户所选择的探索策略名。policy是具体探索策略类的对象。
event_count & event_interval & number_of_events_that_restart_app
这三个成员变量均为整型。event_count记录从测试开始到现在生成的事件个数;event_interval记录了用户设置的两个事件之间停顿的时间; number_of_events_that_restart_app为多少个事件后需要重启应用程序。
kea
kea为Kea类的对象,用于生成事件过程中从Kea类中取出记录数据来完成对应用性质的测试。
enabled
enabled为bool类型,用于记录当前事件生成器是否需要继续生成事件,默认值为True。
generate_utg
enerate_utg为bool类型用于记录用户所设置的是否生成UI转移图的参数,便于生成事件的过程中判断是否应该生成UI转移图。
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。
- 核心流程:
初始化日志记录器。
设置事件发送参数。
根据策略名称初始化输入策略。
设置相似度计算器。
获取探索策略的方法
get_input_policy
get_input_policy 方法根据用户所选择的policy_name来实例化对应的探索策略对象。 实例化的对象存储在policy成员变量里。支持的策略包括:随机探索策略、主路径引导策略和LLM策略。
- 参数:
device: Device实例。app: App实例。
- 返回:
本次测试使用的策略实例。
- 核心流程:
根据策略名称判断使用哪种输入策略。
创建对应的输入策略实例。
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
事件生成器的控制方法
start
start 方法用于启动所选定的探索策略。
- 核心流程:
记录开始发送事件的日志。
根据输入策略开始发送事件。
处理键盘中断,确保优雅退出。
def start(self): try: if self.policy is not None: self.policy.start(self) except KeyboardInterrupt: pass self.stop()
stop
stop 方法用于结束探索过程。
- 核心流程:
终止事件发送。
清理事件发送相关的资源。
记录停止发送事件的日志。
def stop(self): self.enabled = False
add_event
add_event添加一个事件到事件列表,并将该事件发送给移动设备。
- 参数:
event: 要添加的事件,应为AppEvent的子类。
- 核心流程:
将事件添加到事件列表。
创建事件日志记录器。
根据事件间隔时间发送事件到设备。
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方法停止生成事件。