掌桥专利:专业的专利平台
掌桥专利
首页

Android应用界面数据丢失缺陷分析和检测方法

文献发布时间:2023-06-19 18:58:26


Android应用界面数据丢失缺陷分析和检测方法

技术领域

本发明属于程序静态分析与软件缺陷检测领域,具体涉及一种Android应用界面数据丢失缺陷的分析和检测方法。

背景技术

如现如今,智能手机已经成为现代人生活不可或缺的一部分。其中,Android操作系统占据了当前全球智能手机操作系统的最高份额,因此Android应用程序是当今互联网应用程序的一个重要类别,约占据移动Web和应用程序流量的40-50%。Google的开放市场提供了140多万个Android应用程序,每月增加的应用程序也达到数万个。但与此同时,随着安卓应用不断发展,开发者已经不只只是需要提供给用户更多的功能,更需要考虑应用的使用友好性,而数据丢失缺陷就是影响应用使用友好性的一个重要方面。

作为一种事件驱动的程序,安卓应用在运行过程中会经历一系列的生命周期变化,而一些使用场景下的生命周期变化将会导致应用在不以关闭为前提的条件下经历销毁,引起数据丢失缺陷。具体地,这一类型的生命周期变化将迫使运行中的应用实例遭到破坏然后重新实例化,典型案例包括接听电话、在应用程序之间切换以及旋转手机更改布局等。然而,应用实例中包含很多和界面显示相关的变量,实例的销毁会导致这些变量被系统回收,所以重新实例化的过程就需要开发者负责恢复这些变量的值。但是,存在非常多的应用并不能很好地处理这一生命周期变化,从而引起重新实例化后的应用的界面和销毁前的状态不一致,例如原有对话框的消失、已输入文本的消失,已关闭菜单的重现等等,这会迫使用户与应用重复地进行一些先前已完成的交互,严重影响用户使用体验。

现有工作中存在着对Android应用界面数据丢失缺陷检测的研究,但仍存在着许多不足。因为没有对界面数据的精准识别和建模,现有的少部分静态分析工具对于这类缺陷的检测效果欠佳,其结果会产生大量的假阳性;而现有的动态测试工具也因为代码覆盖率、有限的数据丢失缺陷触发事件等因素而效果欠佳,且检测过程十分耗时。

发明内容

本发明的目的在于提供一种Android应用界面数据丢失缺陷的静态检测方法,用于有效、高效地检测Android应用程序中的界面数据丢失缺陷。

实现本发明目的的技术解决方案为:一种Android应用界面数据丢失缺陷的静态检测方法,以Android应用的APK文件作为输入,以检测出的应用界面数据丢失缺陷的详细信息作为输出结果,具体步骤如下:

步骤1,利用Apktool工具和Soot工具对APK文件进行预处理得到静态资源文件和代码中间层表示的Jimple文件,并结合资源文件分析Jimple文件得到需要保存与恢复的界面数据;

步骤2,根据识别到需要保存与恢复的界面数据,分析Jimple文件确定其所对应的变量以及变量之间的关系,并构造为保存-恢复二分图;

步骤3,利用FlowDroid工具的污点分析方法构造与保存-恢复二分图中变量的保存或者恢复操作相关的数据流,并生成对应的数据流摘要;

步骤4,基于构造的保存-恢复二分图和数据流摘要,分析得到数据丢失缺陷的详细信息,输出检测结果得到包含数据丢失缺陷详细信息的报告文件。

第二方面,本发明提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面所述的方法的步骤。

第三方面,本发明提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面所述的方法的步骤。

第四方面,本发明提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现第一方面所述的方法的步骤。

本发明与现有技术相比,其显著优点有:(1)针对Android应用的界面数据丢失问题的检测,首次提出了保存-恢复二分图对界面数据进行建模,避免了大量不相关的变量和控件属性,方法更加有效;(2)它是一种全自动的静态分析方法,无需运行app,相比于动态测试,具有检测更快、代码覆盖率更广的显著优势。

附图说明

图1是本发明提供的Android应用界面数据丢失缺陷工具的概览图。

图2是APK文件预处理的输出结果示例。

图3是生成的Jimple文件示例。

图4是应用BeeCount的一个数据丢失缺陷及其修复代码示例。

图5是常用的数据存储与读取相关的类的示例。

图6是数据流分析构造的数据流摘要示例。

图7是应用BeeCount的一个数据丢失缺陷报告示例。

图8是数据丢失缺陷检测结果报告文件示例。

具体实施方式

本发明提出一种Android应用界面数据丢失缺陷的自动化检测方法,以Android应用的APK文件作为输入,以检测出的界面数据丢失缺陷类别以及详细信息作为输出结果,具体步骤如下:

步骤1,利用Apktool工具和Soot工具对APK文件进行预处理得到静态资源文件和代码中间层表示的Jimple文件,并结合资源文件分析Jimple文件得到需要保存与恢复的界面数据;

步骤2,根据识别到需要保存与恢复的界面数据,分析Jimple文件确定其所对应的变量以及变量之间的关系,并构造为保存-恢复二分图;

步骤3,利用FlowDroid工具的污点分析方法构造与保存-恢复二分图中变量的保存或者恢复操作相关的数据流,并生成对应的数据流摘要;

步骤4,基于构造的保存-恢复二分图和数据流摘要,检测出缺少保存或者恢复操作、保存或者恢复操作不正确的数据,输出检测结果得到包含数据丢失缺陷详细信息的报告文件。

作为一种具体示例,如步骤1中所述,利用Apktool工具和Soot工具对APK文件进行预处理得到静态资源文件和代码中间层表示的Jimple文件,并结合资源文件分析Jimple文件得到需要保存与恢复的界面数据,具体步骤如下:

步骤1-1,使用Apktool工具对APK文件解码,得到其中的.xml资源文件,并分析资源文件得到应用包名、注册的活动类、静态绑定的用户交互回调;

步骤1-2,使用Soot工具解析APK文件,将其中的.dex文件反编译得到应用的Jimple类型中间形式代码,并根据应用包名和类继承关系筛选分析对象;

步骤1-3,遍历所有分析对象的Jimple文件,在不同的回调函数中搜索是否存在控件设置相关的API调用,识别出需要保存和恢复的界面数据。

作为一种具体示例,如步骤2所述,根据识别到需要保存与恢复的界面数据,分析Jimple文件确定其所对应的变量以及变量之间的关系,并构造为保存-恢复二分图,具体步骤如下:

步骤2-1,基于步骤1中识别到的控件设置API的调用,提取该调用语句的参数或者控制该调用语句执行的条件语句中的条件变量作为界面数据对应的变量;

步骤2-2,基于提取界面数据的对应变量的回调,将识别到的变量分别放入保存-恢复二分图的两个集合;具体地,从界面初始化回调中识别到的变量放入恢复变量集合,从用户交互回调中识别到的变量放入保存变量集合;

步骤2-3,根据变量用于界面显示的载体控件是否是同一个,确定保存变量集合和恢复变量集合之间的关系,并完成保存-恢复二分图的构建。

作为一种具体示例,如步骤3所述,利用FlowDroid工具的污点分析方法构造与保存-恢复二分图中变量的保存或者恢复操作相关的数据流,并生成对应的数据流摘要,具体步骤如下:

步骤3-1,收集Android中所有可用于数据存储与读取的类及其相关API;

步骤3-2,从提取保存变量集合中变量的代码上下文,识别变量的相关赋值语句,并将变量、赋值语句作为保存信息二元组,存至保存变量信息集合中;类似的,从提取恢复变量集合中变量的代码上下文,识别变量的相关赋值语句,并将变量、赋值语句作为恢复信息二元组,存至恢复变量信息集合中;

步骤3-3,基于保存变量信息集合定义source,将数据存储的API方法签名定义为sink,使用FlowDroid构造source和sink之间连通的保存操作的数据流;把数据读取的API方法签名定义为source,基于恢复变量信息集合定义sink,使用FlowDroid构造source和sink之间连通的恢复操作的数据流。

作为一种具体示例,如步骤4所述,基于构造的保存-恢复二分图和数据流摘要,检测出缺少保存或者恢复操作、保存或者恢复操作不正确的数据,输出检测结果得到包含数据丢失缺陷详细信息的报告文件,具体步骤如下:

步骤4-1,分析保存-恢复二分图中保存变量集合和恢复变量集合之间的关系,一个集合中的变量和另一个集合中的变量必须存在对应关系;不满足该条件的变量,其对应的数据被判定为缺少保存或恢复操作,存在数据丢失缺陷;

步骤4-2,对于满足步骤4-1中所属对应关系的所有变量,分析生成的数据流中是否包含其相关source或sink定义,从而判断相应的保存或恢复操作是否正确;若基于某一变量及其相应的赋值语句定义的source或sink,未存在于任一条连通的数据流中,则判定该变量对应的数据的保存或者恢复操作不正确,存在数据丢失缺陷。

步骤4-3,对于前两步骤中均为报告出数据丢失缺陷,且其保存和恢复操作是仅基于ViewModel实现的变量,进一步分析其在ViewModel实例中所关联的域变量是否有被外存相关的数据存储、读取API的调用语句使用,实现变量值的保存与恢复;若不存在,则被判定为数据丢失缺陷;

步骤4-4,输出所有上述三个步骤中判定未存在数据丢失缺陷的数据及其相关受影响的界面控件至检测报告文件,并转储为本地表格文件。

下面结合实施例和附图对本发明进行详细说明。

实施例

本实施例为一种Android应用界面数据丢失缺陷的自动化检测方法,通过对Android应用进行检测,生成该应用中界面数据丢失缺陷的检测结果,具体工作的构成如图1所示。首先,对一个具体的待检测应用的APK文件预处理,提取资源文件和Jimple文件后,分析得到该应用中需要保存与恢复的界面数据;接着,分析Jimple文件确定界面数据所对应的程序变量以及变量之间的关系,并构造为保存-恢复二分图;然后,利用污点分析等数据流分析方法构造变量的保存或者恢复操作相关的数据流;最后,分析得到的保存-恢复二分图和数据流摘要,得出数据丢失缺陷检测结果。

本实施中,该方法包括以下步骤:

步骤1,对于一个待测的Android应用,通过静态分析识别其中的界面数据,具体步骤如下:

步骤1-1,使用Apktool工具对APK文件解码得到.xml资源文件,并分析资源文件得到应用包名、注册的活动类、静态绑定的用户交互回调,如图2所示;

步骤1-2,使用Soot工具解析APK文件的.dex文件,通过反编译得到应用的Jimple类型中间形式代码,并根据应用包名和类继承关系筛选分析对象,如图3所示;

步骤1-3,遍历所有分析对象的Jimple文件,在onCreate()、onStart()、onResume()、onRestoreInstanceState()等界面初始化生命周期回调,以及onClick()、onLongClick()、onOptionsItemSelected()等处理用户交互的回调函数中搜索是否存在控件设置相关的API调用,识别出需要保存和恢复的界面数据。

步骤2,分析Jimple文件确定界面数据所对应的程序变量以及变量之间的关系,并构造为保存-恢复二分图,具体如下:

步骤2-1,基于步骤1中识别到的控件设置API的调用,提取该调用语句的参数或者控制该调用语句执行的条件语句中的条件变量作为界面数据对应的变量,如图4所示,第26行setProjectName()的调用语句将完成控件project_name的界面显示,提取参数name作为界面数据“Notes”输入文本的对应变量;

步骤2-2,将从界面初始化回调中识别到的变量放入恢复变量集合,从用户交互回调中识别到的变量放入保存变量集合;因此,上述从onCreate()回调的函数调用链上提取到的变量name放入恢复变量集合,而从onSaveInstanceState()回调的函数调用链上提取到的第43行的返回值将放入保存变量集合;

步骤2-3,根据变量用于界面显示的载体控件是否是同一个,确定保存变量集合和恢复变量集合之间的关系,并完成保存-恢复二分图的构建;上述变量name和第43行的返回值,均对应于界面控件enw.project_name,因此二者之间存在关联;

步骤3,利用污点分析等数据流分析方法构造变量的保存或者恢复操作相关的数据流,具体如下:

步骤3-1,收集Android中所有可用于数据存储与读取的类及其相关API,如图5所示;

步骤3-2,从提取保存变量集合中变量的代码上下文,识别变量的相关赋值语句,并将变量、赋值语句作为保存信息二元组,存至保存变量信息集合中;类似的,从提取恢复变量集合中变量的代码上下文,识别变量的相关赋值语句,并将变量、赋值语句作为恢复信息二元组,存至恢复变量信息集合中;

步骤3-3,基于保存变量信息集合定义source,将数据存储的API方法签名定义为sink,使用FlowDroid构造source和sink之间连通的保存操作的数据流;把数据读取的API方法签名定义为source,基于恢复变量信息集合定义sink,使用FlowDroid构造source和sink之间连通的恢复操作的数据流;并生成相应的数据流摘要,如图6所示;

步骤4,基于构造的保存-恢复二分图和数据流摘要,检测出缺少保存或者恢复操作、保存或者恢复操作不正确的数据,输出检测结果得到包含数据丢失缺陷详细信息的报告文件,具体步骤如下:

步骤4-1,分析保存-恢复二分图中保存变量集合和恢复变量集合之间的关系,一个集合中的变量和另一个集合中的变量必须存在对应关系;不满足该条件的变量,其对应的数据被判定为缺少保存或恢复操作,缺陷详情如图7所示;

步骤4-2,对于满足步骤4-1中所属对应关系的所有变量,分析生成的数据流中是否包含其相关source或sink定义,从而判断相应的保存或恢复操作是否正确;若基于某一变量及其相应的赋值语句定义的source或sink,未存在于任一条连通的数据流中,则判定该变量对应的数据的保存或者恢复操作不正确。

步骤4-3,对于前两步骤中均为报告出数据丢失缺陷,且其保存和恢复操作是仅基于ViewModel实现的变量,进一步分析其在ViewModel实例中所关联的域变量是否有被外存相关的数据存储、读取API的调用语句使用,实现变量值的保存与恢复;若不存在,则被判定为数据丢失缺陷;

步骤4-4,输出所有上述三个步骤中判定未存在数据丢失缺陷的数据及其相关受影响的界面控件至检测报告文件,并转储为本地表格文件,如图8所示。

综上可知,本发明能够有效、高效地检测出Android应用是否存在界面数据丢失缺陷。

相关技术
  • 一种彩膜基板缺陷的分析方法、检测修复方法及装置
  • 缺陷来源的分析方法及分析系统、缺陷检测装置
  • 缺陷来源的分析方法及分析系统、缺陷检测装置
技术分类

06120115751418