Page 141 - 《软件学报》2026年第6期
P. 141
2460 软件学报 2026 年第 37 卷第 6 期
● 标题关键操作. 与复现步骤类似, 崩溃报告的标题可能包含关键的 GUI 控件信息, 这些信息能够揭示触发崩
溃的上下文信息并有效指导动态探索. 然而, 用户提交的标题格式多样, 给全面提取标题中的关键 GUI 控件信息
带来了挑战. 考虑到生成式 AI 模型 [19] 的快速发展, 这些模型可以通过特定的指令或提示中回答, 为研究人员和开
发人员提供指导. 我们利用预训练 LLM 来提取标题中包含的 GUI 控件信息. 具体而言, 我们向 LLM 提供报告的
标题, 并要求其输出标题中与 GUI 控件相关的关键操作信息. 为此, 我们依照常规的提示模板 [20,21] , 经过 3 个作者
的共同编写和讨论, 最终确定了适用于该任务的提示模式 (如表 1 所示). 以图 1 中的报告标题为例, 当输入标题
“Crash on add picture from camera on Android 7”后, 向 LLM 提问“Which words in the title are likely to be related to
the app UI elements?”, LLM 将预测并提取关键操作“add picture”和“camera”.
表 1 提示生成规则的示例
任务 提示 实例 预测
The crash report title is: Crash on add picture from
预测标题关 The crash report title is: <Title>. Which words in the camera on Android 7. Which words in the title are add picture,
键操作 title are likely to be related to the app UI elements? camera
likely to be related to the app UI elements?
为了进一步提高模型提取关键操作的准确性, 我们构建了一个涵盖多种交互场景的数据集用于微调 LLM. 具
体来说, 我们从 GitHub 上收集了 50 个不同类型的应用程序, 以覆盖广泛的使用场景, 并提取真实用户报告中带有
明显崩溃标识 (如包含“Crash”“can not”等词汇) 的标题. 通过人工标注这些标题中的关键操作信息, 帮助 LLM 学
习不同的标题语法模式并推测所需关键操作. 需要注意的是, LLM 的微调过程仅需进行一次, 微调完成后的模型
可直接应用于不同应用的标题关键操作预测任务.
● 崩溃相关 API. 堆栈跟踪提供了关于应用异常的信息, 我们提取堆栈跟踪中包含被测应用包名的行, 以定位
与崩溃相关的 API. 例如, 在图 1 中的堆栈跟踪中, 提取到的崩溃相关 API 包括“com.ichi2.anki.Anki Activity.
startActivityForResult”和“com.ichi2.anki.multimediacard.fields.BasicImageFieldController$2.onClick”.
2.2 崩溃组件定位
Android 应用由活动 (activity)、服务 (service)、广播接收器 (broadcast receiver) 和内容提供方 (content
provider) 这 4 大基本组件构成. 这些组件通常通过 Intent 机制实现相互转换与通信. Intent 作为一种声明式对象,
不仅可以指明当前组件需要执行的具体动作, 还可以在不同组件之间传递数据, 从而协作以实现应用的复杂功能.
然而, 传统 Android 应用自动化测试工具通常模拟事件交互以覆盖尽可能多的可执行路径, 这种方式在与崩溃无
关的路径上浪费了大量测试资源, 难以快速生成触发目标崩溃的有效事件序列. 为了解决这一问题, 我们引入组件
转换图对被测应用进行建模, 捕获组件间的转换关系, 并通过 Intent 与组件的触发关系确定目标崩溃组件.
● CTG 构造. CTG 是应用探索的重要特征之一, 用于描述组件之间的转换和交互关系. 在一个 CTG 中, 节点
集表示 Android 应用的基本组件 (activity、service、broadcast receiver 和 content provider) 及其特定上下文状态,
边集表示组件之间的交互关系, 并分为显式边 (explicit) 和隐式边 (implicit). 每条边携带详细的交互属性 (如 action、
extras 和 flags 等), 用于描述 Intent 调用的细节. 我们采用 ICCBot [22] 工具构建 CTG, 这是一种广泛使用的动态探索
工具. 图 4 展示了 ICCBot 对 AnkiDroid 构建 CTG 的示例, 具体对应图 2 中“step 5”的操作, 即点击“CAMERA”按
钮的 Intent 发送摘要. 示例中, 起点 source 为 com.ichi2.anki.multimediacard.activity.MultimediaEditFieldActivity, 表
示触发事件的初始组件为一个 activity, 终点 destination 为目标 android.media.action.IMAGE_CAPTURE, 通过匹
配 Intent 的 action 和参数触发, 类型为系统相机功能. 隐式边类型 Act2class 表示通过 action 匹配的间接调用关系.
● 定位目标崩溃组件. 为了高效定位崩溃组件, 我们结合堆栈跟踪的动态异常信息和静态分析的组件转换信
息, 确定崩溃页面. 算法 1 描述了定位崩溃组件的过程, 输入为编译被测应用 APK 文件后可获得的应用信息 app_info、
崩溃堆栈 TR、 崩溃相关 API 集合 TR AP 和组件转换图 CTG, 输出为崩溃组件 TR com . 首先, 初始化崩溃组件
I
TR com (第 1 行) . 其次, 结合崩溃相关 API 集合 TR API , 基于应用包名从崩溃堆栈中筛选出与崩溃相关的类 TR class , 由
于最后一个类通常是直接导致崩溃的触发点, 提取最后一个崩溃相关类 TR lastclas 以缩小定位范围 (第 2 行). 然后,
s

