Page 144 - 《软件学报》2026年第6期
P. 144
刘姝琪 等: 组件感知的安卓应用崩溃自动复现方法 2463
13. scores w = getPageReachScore(w cans , next_com, after_com, CTG, scores w )
14. RETURN TR com
以图 2(a) 为例, 当进入被测应用主页时, 当前组件为 DeckPicker, 目标崩溃组件为 MultimediaEditFieldActivity.
通过 CTG 检索, 从当前组件 DeckPicker 到崩溃组件 MultimediaEditFieldActivity 的多条可达路径包括“DeckPicker→
NoteEditor→MultimediaEditFieldActivity”“DeckPicker→CardBrowser→NoteEditor→MultimediaEditFieldActivity”和
“DeckPicker→Reviewer→NoteEditor→MultimediaEditFieldActivity”等. 基于标题关键操作和路径距离, 选取
“DeckPicker→NoteEditor→MultimediaEditFieldActivity”为最佳路径, 如图 5 所示的可达路径. 根据此路径, 由于下
一个可达页面 NoteEditor 不是崩溃组件, 计算 GUI 控件与 NoteEditor 及 MultimediaEditFieldActivity 组件的语义
相似度, 并结合 GUI 控件与崩溃组件前驱组件 NoteEditor 的语义相似度, 得到页面可达分数作为最终控件分数.
根据分数, 选择控件“Add”进行操作. 以此类推, 当点击“Add image”后, 被测应用转换为目标组件 Multimedia-
EditFieldActivity, CReDroid 仅计算当前页面所有候选控件与标题关键操作的语义相似度, 以确定控件分数. 考虑
在自然语言理解任务中表现出卓越的语义建模能力, 本文采用预训练的 BERT 模型 [25] 计算语义相似度分数.
① GUI 组件
可达路径: DeckPicker → NoteEditor → MultimediaEditFieldActivity ③ 标题
② 类依赖+标题
图 5 自适应计算控件得分的示例
2.3.2 探索优化分数
自适应控件评分可能存在一定的不准确性, 影响崩溃复现的有效性. 为了解决这一问题, 我们将强化学习引入
全局驱动的场景中, 将崩溃复现建模为一个马尔可夫决策过程 (Markov decision process, MDP). 通过引入 Q-learning
方法 [26] 优化探索得分, 从而提升整体探索规划的准确性, 弥补预测 GUI 控件触发崩溃的不足.
具体而言, 探索过程被定义为一个 MDP 实例, 形式化为一个四元组<S, A, P, R>, 其各部分定义如下.
S: 状态集 (states). 被测应用的每个 GUI 页面被定义为一个独立的状态, 其中布局着可供操作的 GUI 控件, 用
于实现特定功能.
A: 动作集 (actions). 每个状态下可执行的事件构成动作集. CReDroid 在每个页面中提取布局层次并分析 GUI
控件属性获取所有可交互控件, 与控件的交互 (如单击、长按或输入文本) 构成可执行事件集. 每个事件被记录为
Q-table 中的状态-动作对 (s, a), 其中 a 表示为状态 s 的一个可执行事件. 为了在崩溃探索的过程中打破局部最优
陷阱, CReDroid 采纳 ϵ-贪婪策略 [27] 选择下一个动作, 这是 Q-learning 的标准方法. 具体而言, CReDroid 以概率 1− ϵ
选择 Q 值最高的动作, 或以剩下的 ϵ 概率随机选择一个 Q 值较低的动作进行探索. 根据先前的经验 [8,28] , 在初始阶
段, 为了专注于当前最优 GUI 控件的探索, ϵ 被设置为一个接近 0 的数值. 然而, 在崩溃探索的过程中, 错误选择某
个最优 GUI 控件可能导致探索陷入重复. 在这种情况下, CReDroid 将会动态调整 ϵ 接近 1 的数值, 从而提升较低
得分动作的探索机会, 避免局部最优.
P: 转换函数 (transition function). 转换函数描述动作执行后被测应用状态的转换. 当执行一个动作 a t 后, 被测
s t a t s t+1 >, 并存储在转换函数
应用将从当前状态 s t 转换为新状态 s t+1 . 该转换记录为三元组< , , P 中.
R: 奖励函数 (reward function). 当执行一个动作 a t 之后, 奖励函数 R 将生成一个数值用于评估所执行动作 a t
的质量. 例如, 所交互的 GUI 控件是否与崩溃或者崩溃报告标题相关. 为了有效地优化崩溃探索的过程, CReDroid
为每个动作设计了奖励和惩罚策略. 奖励函数被定义为以下几个方面奖励的总和.
● 触发崩溃奖励. 当某动作触发崩溃时, 通过崩溃日志验证该动作是否覆盖目标崩溃组件或涉及崩溃 API、
类以及异常语句. 验证通过时, 该动作将获得极大正向奖励, 这表明该动作很可能与目标崩溃相关联. 当被测应用
再次到达该状态时, CReDroid 会优先选择该动作执行, 从而进一步提高触发目标崩溃的可能性.

