Page 142 - 《软件学报》2026年第6期
P. 142

刘姝琪 等: 组件感知的安卓应用崩溃自动复现方法                                                        2461


                 利用 CTG 中的意图发送摘要信息和节点信息, 初步定位潜在的崩溃发生组件                       (第  3–5  行). 若初步定位未能确定崩
                 溃组件, 则进一步解析应用的         AndroidManifest 文件, 提取所有活动组件    A, 结合崩溃堆栈信息, 通过基于正则表达
                 式的活动名称匹配扩展推断潜在的崩溃组件 (第                6–9  行) . 最终返回定位的崩溃组件      TR com , 为后续崩溃复现提供
                 动态探索的方向.


                                                                  崩溃组件
                          <source name="com.ichi2.anki.multimediacard.activity.MultimediaEditFieldActivity"
                                type="Activity">
                              ...
                            <destination ICCType="implicit"
                                    name="android.media.action.IMAGE_CAPTURE, "
                                    edgeType="Act2Class"                  崩溃点
                                    method="<com.ichi2.anki.multimediacard.fields.BasicImageFieldController$2:
                                                                  void onClick(android. view. View)>"
                                    instructionId="4"
                                    unit="virtualinvoke$r11.<com.ichi2.anki. multimediacard.activity.Multimedia
                                                                 EditFieldActivity:  void startActivityForResult(android.content. Intent,int)>(r2, 2)"
                                    action="android.media. action.IMAGE_CAPTURE"
                                    extras="Parcelable-output"
                                    flags=""/>
                           </source>
                                               图 4 一种隐式    Intent 发送摘要示例

                    以图  1  中的崩溃堆栈为例, 通过分析可确定          com.ichi2.anki.multimediacard.fields.BasicImageFieldController$2
                 为崩溃相关的关键类. 进一步解析           CTG  的意图发送摘要, 发现      BasicImageFieldController$2  在处理用户交互事件
                 时调用了   startActivityForResult 方法, 并构造了指向  MultimediaEditFieldActivity  的隐式  Intent. 因此, 可以确定崩
                 溃组件   TR co 为  com.ichi2.anki.multimediacard.activity.MultimediaEditFieldActivity. 通过综合分析组件交互场景,
                          m
                 包括隐式   Intent、内部类调用, 以及结合崩溃堆栈和应用配置等多种信息源, CReDroid                 能够更准确地定位崩溃组
                 件, 为后续动态探索提供确切的指导方向.

                 算法  1. 定位崩溃组件.
                 输入: 应用信息    app_info, 崩溃堆栈  TR, 崩溃相关  API 集合 TR API , 组件转换图  CTG;
                 输出: 崩溃组件    TR com .

                 1. TR com  =  ∅ /*初始化崩溃发生组件*/
                 2. TR lastclass , TR class  = GetTraceClass(app_info.pkg, TR, TR API ) /*从堆栈中获取崩溃相关类和最后一个崩溃相关类*/
                 3. C CTG_s  = GetComOfSummary(CTG.Summary, TR lastclass ) /*根据意图发送摘要定位崩溃组件*/
                 4. C CTG_n  = GetComOfSummary(CTG.Nodes, TR lastclass ) /*根据  CTG  组件定位崩溃组件*/
                 5. TR com  = TR com ∪C CTG_s ∪C CTG_n  /*将通过  CTG  定位的崩溃组件加入  TR com */
                 6. IF len(TR com ) == 0 /*若尚未成功定位到崩溃发生组件, 则进一步扩展*/
                 7.  A = GetAllActivities(apk.manifestXml) /*分析  AndroidManifest 获取所有活动组件*/
                 8.  C TR  = GetComOfTR(A, TR) /*根据应用活动和崩溃堆栈定位崩溃组件*/
                 9.  TR com  = TR com ∪C TR  /*将定位的崩溃组件加入  TR com */

                 10. RETURN TR com
                  2.3   强化学习驱动的崩溃探索
                    强化学习驱动的崩溃探索旨在通过所定位的崩溃组件和崩溃报告的关键操作信息, 结合被测应用的                                  CTG  来
                 全局搜索可能触发崩溃的事件序列. 为了触发崩溃, 可与崩溃报告标题中相似的                        GUI 控件进行交互. 例如, 在步骤      4
                 中点击“Add image”, 在步骤  5  中点击“CAMERA”尝试启动相机, 如图        2(a) 所示. 然而, 到达崩溃页面可能还需要额
   137   138   139   140   141   142   143   144   145   146   147