Page 143 - 《软件学报》2026年第6期
P. 143
2462 软件学报 2026 年第 37 卷第 6 期
外的特定事件序列, 这些事件可能未在崩溃报告标题中记录, 例如在步骤 3 中的上传附件按钮操作与标题“Crash
on add picture from camera on Android 7”无直接关联. 为解决此问题, 我们利用 CTG 构建探索路径的搜索空间, 从
而到达崩溃发生的页面. 正如第 2.2 节所述, CTG 描述了组件间的交互关系. 基于此, 我们设计一种自适应评分策
略, 为当前页面的 GUI 控件分配分数, 驱动探索过程. 首先, 通过 CTG 检索从当前页面到达崩溃组件的路径找到
崩溃相关的 GUI 页面. 然后, 借助标题的关键操作选择页面中的 GUI 控件尝试触发崩溃. 此外, 为应对自适应控件
评分可能产生的不精确匹配, 设计强化学习驱动崩溃探索过程以实现全局搜索, 进一步优化探索方向来触发
崩溃.
2.3.1 自适应控件评分
被测应用的 GUI 页面通常包含大量可操作控件, 而选择最可能触发崩溃的控件是一项具有挑战性的任务. 尽
管崩溃报告的标题中提供了关键操作信息, 其内容精简可能未涵盖所有相关操作. 同时, 尽管目标崩溃组件为探索
提供了方向, 但被测应用中存在大量可达路径, 开发人员难以全面检查所有路径 [23,24] . 因此, 我们基于当前页面与
目标崩溃组件的上下文关系, 设计了一种自适应评分策略, 结合页面可达分数和语义相似度分数, 为 GUI 控件分
配优先级分数, 以确定操作顺序.
算法 2 描述了自适应控件评分的过程, 输入为组件转换图 CTG、标题关键操作 title_actions、崩溃组件 TR com
和崩溃相关类 TR class , 输出为 GUI 控件分数 scores w . 首先, 初始化所有 GUI 控件的分数 scores w (第 1 行). 其次, 获
取被测应用当前 GUI 页面的层次结构, 提取所有可操作候选控件信息, 并通过安卓调试桥 (Android debug bridge,
ADB) 命令获取当前组件信息 (第 2, 3 行). 然后, 根据当前组件与目标崩溃组件的上下文关系, 结合自适应策略对
候选控件进行评分 (第 4–13 行). 具体而言, 若当前组件即为崩溃组件 TR com , 通过计算控件名称与标题关键操作
的语义相似度作为控件分数 (第 4, 5 行); 若当前组件不为目标崩溃组件时, 则根据直接可达页面是否为崩溃组件,
采用不同策略对控件进行评分 (第 6–13 行). 在此过程中, CReDroid 从 CTG 中检索当前组件与崩溃组件之间的候
选可达路径, 并基于路径中组件与标题关键操作的语义相关度及路径长度排序, 选取相关度高且距离较短的最佳
路径 (第 7, 8 行). 基于最佳路径, 若下一个可达组件为崩溃组件, 结合堆栈类依赖信息和标题关键操作计算 GUI
控件的语义相似度分数 (第 9–11 行); 若下一个可达组件非崩溃组件, 结合控件与后两个可达组件及目标崩溃组件
前驱组件的匹配度, 计算页面可达分数 (第 13 行).
算法 2. 自适应控件评分.
输入: 组件转换图 CTG; 标题关键操作 title_actions, 崩溃发生组件 TR com , 崩溃相关类 TR class ;
输出: GUI 控件分数 scores w .
1. scores w = {} /*初始化页面 GUI 控件分数*/
2. w cans = getCandidates() /*获取当前 GUI 页面的所有候选 GUI 控件*/
3. cur_com = getCurCom()/*获取当前 GUI 页面的组件信息*/
4. IF cur_com == TR com do /*如果当前组件为目标崩溃组件, 计算语义相似度分数*/
5. scores w = getSemanticScore(w cans , title_actions, scores w )
6. ELSE /*否则推断可达页面*/
7. path = getReachPath(cur_com, TR com , CTG) /*根据 CTG 检索从当前组件到崩溃组件的可达路径*/
8. path = rankPath(path, title) /*结合距离和语义信息对可达路径重新排序*/
9. next_com, after_com = getNextCom(path) /*从排序后的最佳路径中推断后两个可达组件*/
10. IF next_com == TR com do /*如果下一个可达组件为崩溃组件, 则根据堆栈类依赖信息和崩溃标题计算语义相
似度分数*/
11. scores w = getSemanticScore(w cans , title_actions, TR class , scores w )
12. ELSE /*否则根据后两个可达组件计算页面可达分数*/

