Page 138 - 《软件学报》2026年第6期
P. 138
刘姝琪 等: 组件感知的安卓应用崩溃自动复现方法 2457
件转换图 (component transition graph, CTG), 并结合组件转换相关的意图 (Intent) 发送摘要和堆栈跟踪的动态异常
信息来定位目标崩溃组件. 然后, CReDroid 通过以下 3 方面为当前 GUI 页面上的可操作控件分配分数: (1) 页面可
达分数, 从 CTG 中检索从当前页面到达崩溃组件的所有可达路径并进行排序, 基于最佳路径预测控件触发的目标
组件来计算匹配分数; (2) 语义相似度分数, 利用崩溃报告标题中的关键操作和堆栈跟踪中的类依赖, 匹配最可能
导致崩溃的 GUI 控件; (3) 探索优化分数, 基于强化学习结合交互记录来分配分数, 调整页面可达分数和语义相似
分数可能不准确的情况, 实现全局探索优化. 另外, CReDroid 结合当前页面所属组件与崩溃组件的上下文关系, 设
计一种自适应评分策略, 以综合页面可达分数和语义相似度分数来选择最优控件触发操作, 以针对性地进行崩溃
复现. 整个过程以迭代方式执行, 直至触发目标崩溃, 并最终生成自动重放脚本和附带人类可读图片解释的文本描
述复现步骤.
Crash on add picture from camera on Android 7 #4586 崩溃报告标题
异常类型 异常信息
android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/img_202411280309351433179182.jpg exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
at android.net.Uri.checkFileUriExposed(Uri.java:2346)
at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8909)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8894)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)
at android.app.Activity.startActivityForResult(Activity.java:4224)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:4183)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at com.ichi2.anki.AnkiActivity.startActivityForResult(AnkiActivity.java:175)
at com.ichi2.anki.multimediacard.fields.BasicImageFieldController$2.onClick(BasicImageFieldController.java:125) 崩溃点
at android.view.View.performClick(View.java:5610)
at android.view.View$PerformClick.run(View.java:22265)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
图 1 AnkiDroid 中问题 ID 为 4586 崩溃报告对应的崩溃堆栈跟踪示例
为评估 CReDroid 的有效性和效率, 我们在 3 个数据集中收集了 74 个崩溃报告, 并与传统的自动化测试工具
[8]
Monkey [17] 、APE [18] 及最先进的崩溃复现工具 CrashTranslator [14] 、ReCDroid 和 [9] ReproBot 进行了对比实验. 实验
结果表明, CReDroid 成功复现了 57 个崩溃报告, 分别比 CrashTranslator、ReCDroid、ReproBot、Monkey 和 APE
多复现 13、25、27、30 和 17 个. 在复现效率上, CReDroid 成功复现相同崩溃的平均用时分别比 CrashTranslator、
ReCDroid、ReproBot、Monkey 和 APE 减少 26.71%、94.96%、71.65%、84.72% 和 88.56%.
本文的主要贡献总结如下.
● 提出了一种组件感知的安卓应用崩溃自动复现方法 CReDroid, 能够结合崩溃报告的标题信息和堆栈跟踪
来有效地复现崩溃.
● 通过构建 CTG, 结合静态组件交互信息和堆栈跟踪的动态异常信息定位崩溃组件, 设计基于组件上下文关
系的自适应评分策略为控件分配选择优先级, 并结合强化学习优化动态探索过程以减轻预测不准确的影响.
● 在 3 个数据集的 74 个崩溃报告上进行了实验评估, 结果表明 CReDroid 在崩溃复现的有效性和效率方面均
优于现有最先进技术.
本文第 1 节通过引入一个示例介绍本文研究的动机. 第 2 节详细介绍提出的组件感知的安卓应用崩溃自动复
现方法. 第 3 节描述实验设置. 第 4 节分析实验结果以验证所提方法在崩溃复现中的性能. 第 5 节讨论方法的局限
性及潜在的有效性威胁. 第 6 节介绍崩溃复现领域的相关工作. 第 7 节总结全文并展望未来研究方向.

