@inproceedings{huang2017ui,
title={UI driven Android application reduction},
author={Huang, Jianjun and Aafer, Yousra and Perry, David and Zhang, Xiangyu and Tian, Chen},
booktitle={2017 32nd IEEE/ACM International Conference on Automated Software Engineering (ASE)},
pages={286--296},
year={2017},
organization={IEEE}
}
UI Driven Andorid Application Reduction
0 Abstract
- 现代移动应用APP包含许多很少使用的功能。如应用包含广告或包含其它功能(如天气APP上讲故事的功能)。这些功能对APP不必要,但会消耗电量,CPU周期和带宽。
- 本文设计了一种UI驱动的,通过删除不需要功能定制化Andorid APP的方法。
- 具体的,我们的技术展示了UI,并且允许用户选择想要移除的表达了功能的元素。
- 使用这些信息,我们的技术自动的移除所有与所选功能关联的代码元素,包括相关的背景任务
- 内在的分析是一种标记系统,每个代码元素被标记是否可以被移除。通过UI建议,我们的技术推断所有代码元素的标记,并根据此进行简化。
- 我们实现了方法原型,并在10个真实的现实世界的安卓APP上进行了评估。结果现实,我们的方法可以准确的发现可以移除的代码元素,在简化程序中节省了大量的资源
1 Introduction
1.1 背景
-
APP包括很多很少使用的功能:
-
- 广告出现在超过50%的应用上[2],其引入的第三方库增加隐私和安全风险[3]。先前研究已经证实敏感信息会暴露在广告网络上[4,5],广告很容易引起传播攻击[6]。
-
- 用户不期望的应用的其它功能。如天气APP提供的新闻功能(见 Section IV-B2)
- 除过不相关的功能,也有与应用目的相关但复杂的功能,这被用户认为是多余的或分散注意力的。如购物APP根据购物历史和浏览记录的推荐功能,一些用户可能希望关掉
-
-
这些功能除了视觉上的影响,还会导致电池,CPU周期,带宽等的额外消耗。先前的研究已经正式使用广告的APP显著消耗更多网络数据和能源消耗[7]。
-
因此,现在急需一种自动化定制移动APP来满足不同用户人群的不同需求。
- 企业和政府机构需要不包含第三方库的APP
- 常使用或户外使用的用户希望减少电池消耗。
- 甚至普通用户也希望定制应用。如家长希望屏蔽对孩子的不合适的内容。
-
然而,如果没有可用的自动化工具,app定制化和私人化对于人类的开发者团队很昂贵
1.2 解决
- 本文,我们提出了一种UI驱动的APP定制技术,可以移除安卓APP中与给定UI元素相关的不需要的功能。具体的
-
- 我们技术需要用户首先明确想要移除的表达功能的UI元素
-
- 然后我们的技术自动化辨别指定元素对应的代码和变量的位置
-
- 随后我们的技术监视UI元素相关的使用,及相关的后端任务代码,如从远程服务器获取的数据
- 尽管UI相关的代码元素可以直接移除,与后端任务相关的代码需要更多的分析判断是否可以移除。
- 我们的技术检查后端任务察省的数据是否仅仅只流向指定的用户界面,如果是的那么这个后端任务被认为是可移除的。否则(即产生的数据传输到了其它组件)不可删除。
- 深层的分析是一个标记系统,每个代码元素被标记是否可以被删除。推断系统推断所有与UI提示相关的代码元素。最后,我们的技术依据推断的类型简化APP.
-
- 我们的技术可以使用在APP开发的最后一个阶段,产生大量的定制化版本来应对不同的需求。此外,我们的技术不需要源代码。
- 我们在10个常用安卓应用上评估了我们的原型,我们的结果展示了在各种资源上可观的简化。
- 平均移除不需要功能的UI组件可以节省 28.1%数据使用,34.1%CPU时间,26.2%Wi-Fi运行时间,37.6% 计算电力使用。
- 我们实现的结果证明了我们UI驱动的应用简化的优点
1.3 贡献
- 我们的工作作出了以下贡献:
-
- 我们提出了一个UI驱动的方法,来移除安卓应用中用户指定的UI组件相关的不想要的功能。我们的技术以一个标记系统为特点,标记了相关的代码元素指示它们是否可以删除。
-
- 我们实现了一个原型,并在一组真实世界的安卓应用上进行评估。结果显示我们的方法准确的发现了可以移除的代码元素,并且简化引起了客观的资源节省。
-
2 Motivation
-
我们使用 WeatherBug[8],真实的安卓应用来激励我们的技术。
- 直觉上,当APP挂起,用户期望得到即时的天气情况,然而,主页通常提供一些额外的信息,如图1示,APP主页包括即时天气情况,天气新闻和横幅广告。如果我们继续向下滚动,该页包括了更多不相关的信息如其他用户的图片,the closest spark strike 等
- 直觉上,当APP挂起,用户期望得到即时的天气情况,然而,主页通常提供一些额外的信息,如图1示,APP主页包括即时天气情况,天气新闻和横幅广告。如果我们继续向下滚动,该页包括了更多不相关的信息如其他用户的图片,the closest spark strike 等
-
除了不相关的信息淹没了用户外,这些组件爷消耗了额外的能源和网络数据。因此,这里需要定制化或重构应用来移除一些对客户端不必要的功能。
- 例如,为了阻止视觉干扰,减少潜在的隐私缺失和恶毒行为(在企业环境中)[9,3,6],同时为了减少能量和网络数据消耗(在复杂环境如户外)。
-
我们工作的首要想法是通过辨别UI上不需要的特征来定制APP来满足不同用户的需求
-
假设现在用户想要移除WeatherBug上不需要的UI组件和其相关功能。具体地,用户先要移除Weather News组件,图1中高亮部分。
- 图2展示了工作流简化表示后的代码片段,分为n个顺序运行部分,当组件被加载时,安卓操作系统调用
- (1)onCreateView 方法,充入第4行的静态布局文件,以保存组件的内容。同时,一个StoriesAdapter被创建并加入组件。着提供了从具体组件数据到展示界面的绑定,如所有内在组件的图片和标题。随后安卓OS调用
- (2)onActivityCreated方法,其最终会挂起一个后端功能来从远程服务器获取数据。当数据加载完成后,后端任务调用其回调函数
- (3)onRequestCompleted。在后调方法中,数据被传输到一个线程,线程在运行队列中排队。随后安卓OS
- (4)运行这个线程。在运行过程中,在第30行数据被取回并保存在共享数据集中。接下来,在31行线程告知StoriesAdapter关于数据集的变化。最终,数据集的变化通知引发了
- (5)onCreateViewHolder 和 (6)onBindViewHolder的运行。前者方法创建了带有充气视图的视图支架,后者方法再45行从共享数据集中获取数据展示在膨胀视图上。
- 图2展示了工作流简化表示后的代码片段,分为n个顺序运行部分,当组件被加载时,安卓操作系统调用
-
在我们的驱动例子中,4,37,43行与不想要的UI组件相关。我们的技术可前瞻性地追踪相关变量地使用,如图2中展示的,我们识别出了 行7,45是将数据推送到具体地组件上的。
- 第7行绑定StoriesAdapter到UI组件上,以响应数据变化并显示内容。内容,其作用类似于动作处理程序。
- 第45行展示了给定的数据中图1中展示的相关图片的简短描述。从第45行开始,我们沿着onRequestCompleted向后收集数据,然后在后台功能(代码中省略)中跟踪数据生成点。我们在更远的地方发现了调用后端功能的位置在第12行。接下来,我们检查生成的数据是否仅用于具体的UI组件,通过向后地追踪数据使用。
- 如图二示,在这个例子中,我们发现没有其它组件使用这些数据,因此这些数据是这个UI组件特定的数据。然而,我们发现这个后端功能是一个公共组件会被其它功能使用,包括这个数据生成点。最终,我们的技术移除了其他未在后端功能中出现的代码,并且迭代地移除了合适的方法和类。
-
为了展示代码简化的效果,我们的技术在onCreateViem中用一个代替视图替换了原来的视图并删除了可移除的代码啊组件。更改后的代码片段及运行时截屏如图3展示。代替视图如高亮部分描述。
-
在Section IV中,移除Weather News组件减少了9%的数据使用和20%的电量消耗。
3 Design
-
本节讨论我们UI驱动的方法来发现安卓APP中可以删除的代码元素。
-
图4展示了我们方法的工作流,正如Section 2中讨论的:在收到用户确定的UI元素并找到程序中与他们相关的具体部位后(Step0),我们的方式进行4步来检测潜在可移除代码元素
-
- 前瞻地发现确定的UI组件使用地部分
-
- 向后追踪UI组件使用的数据
-
- 从数据产生点开始,找到所有数据的使用地方
-
- 基于数据追踪结果,迭代地移除代码元素
-
-
0,1步在Section Ⅲ-C中讨论,Section Ⅲ-D讨论2,3步,Section Ⅲ-E讨论4步
-
我们在整个章节使用图5中的代码片段来说明方法的细节。假设id0,id1指代不需要的UI元素,但id2不是。BgTask表示一种后台功能,它从远程服务器获取输入数据并将结果存储到data中。第13行通过getInputData函数抽象了获取输入数据的操作。一个具体的例子是HttpClient.execute(),它通常在安卓应用中用于从Web服务器获取远程数据。数据获取任务在两个位置启动:第3,7行。数据在第5,9,11行显示在UI元素上。
4 EVALUATION
5 RELATED WORK
- 目前有许多计数检测第三方库,包括安卓中的广告库。
- 基于简单技术如:流行广告库的白名单命名空间[15,16]
- [17]使用hierarchical clustering 区分应用的主要和非主要功能
- [18]基于代码特征和包依赖关系为广告检测开发了分类器
- [19]基于API频率
- [20]提出了一种抗混淆的广告检测技术,通过提取对常见混淆技术具有弹性的配置文件,并依赖于类层次结构而不是代码
- 相比之下,我们的技术更通用,其专注于移除用户在UI上选择的特征而不仅是广告。且不依赖于特定的代码样式
- 检测应用中冗余的技术。[21,22,23,24]。它们的目的是使软件系统更能抵抗故障,并利用重复的代码作为测试预言。它们与我们的技术支持互补,因为可以移除/替换冗余代码以提高质量。它们从程序中的错误组件开始发现冗余代码,而我们的方法从用户指定的UI信息开始。
- 此外,许多研究工作旨在提高能源效率
- [25,26]Gottschalk等人通过识别能源效率低下的模式,检测并移除了Android应用程序中的能源浪费代码
- [27]Sahin等人研究了移动应用程序中代码混淆引起的能源消耗
- [28]Gui等人测量了移动广告的能源消耗
- [29]Banerjee等人提出了一种重构Android应用程序的技术,以遵循一系列指导方针来增强能源效率
- [30]Wu等人使用预定义的能耗模式静态检测应用程序UI中的能源缺陷
- 作者提出的方法不依赖于代码模式,也不需要领域知识就可以正常工作。由于移除了选定的不需要的功能,因此节省了能源。
- 使用UI信息进行安全性保护
- AsDroid [34]使用UI信息来确认程序行为是否为应用程序用户所预期
- SUPOR [35],UIPicker [36]和BidText [37]利用UI信息检查在UI上显示或输入的数据敏感性
- 特别是,BidText [37]通过将文本信息识别为类型并沿数据流执行类型传播,实现了信息泄露检测的类型系统。
- Ernst等人开发的基于类型的污点分析系统预定义了一些安全类型,并检查到达程序点的类型是否兼容[38]。
6 CONCLUSION
- 我们提出了一种静态技术来移除Android应用程序中的代码元素。这些代码元素与用户指定的不需要的UI(用户界面)元素相关。
- 该方法识别直接引用特定UI元素的程序位置,并应用类型系统来推断可移除的代码元素。每个可达的代码元素都被标记了一个传播的类型。这些类型被用来确定相应的代码元素是否可以移除。除了移除与指定UI元素相关的代码元素外,我们的技术还能够发现相关的后台功能,并对后台功能中的相应代码元素进行类型化,以便它们也可以被移除。
- 我们实现了一个原型并在10个现实世界的Android应用程序上进行了评估。结果表明,我们的方法可以准确地识别与指定UI元素相关的可移除代码元素,移除这些功能可以节省大量资源。
个人总结
- 本文讲述了一个UI驱动的简化方法,应用在安卓APP上,不需要基于源代码。
- 简化方法:
- 通过用户确定一个UI组件,找到其调用的相关前端代码,前后端连接代码。
- 对于前端代码可以直接删除,对于前后端连接代码需要确定改代码仅用于该前端组件才能删除。