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  节总结全文并展望未来研究方向.
   133   134   135   136   137   138   139   140   141   142   143