为手机减负 ——“软件臃肿”知多少

发布时间:2022-04-11浏览次数:959

从早晨的闹钟响起,到深夜的熄灯入睡,我们每天都会打开各种app来满足一日生活所需。可是随着越来越多的功能特性、设备支持等模块集中在单一的手机软件,软件臃肿使得用户体验感逐渐下降。

当你打开支付宝,想要出示健康码的时候,功能复杂且入口不明确的界面大大延长了操作时间。



当你打开运动世界校园,准备进行锻炼的时候,却发现那些非必须的功能占据了大量内存。



当你打开网易云音乐,打算播放一首音乐放松心情的时候,却迷失于短视频、直播、聊天等功能而忘记了听歌的初衷。





软件臃肿software bloat)是指计算机程序由于多次版本更迭,使得运行速度显著降低的过程,它通常伴随着占用更多内存空间、损耗更高功率、需要更优硬件支持的现象,导致实际用户体验感不佳。对于长期运营的软件,它服务于大面积的、多种多样的、拥有不同需求的市场环境,使其更加容易出现软件臃肿的现象。在大多数用户看来,他们只需要软件部分有用的功能,而将其他东西视作不必要的“臃肿”,即使不同的用户有着不同的需求。源自https://en.wikipedia.org/wiki/Software_bloat


在实际开发过程中,由于考虑到开发生产力、其他抽象层级的引入等其他因素,使得开发者对于软件效率的重视程度比较靠后,为达到更快运行速度的目的,对用户硬件需求提出了更高要求。

如何降低软件臃肿,已经成为迫在眉睫的问题和挑战。信息学院唐宇田课题组研发了一种新方法,可有效对抗安卓应用臃肿化。该成果以“XDebloat: Towards Automated Feature-Oriented App Debloating”为题发表在软件工程领域顶级期刊IEEE Transactions on Software Engineering。该期刊同时也是中国计算机学会(CCF)推荐的A类期刊。



| XDebloat 完整框架图


唐宇田课题组长期致力于软件开发、系统安全等的相关研究。课题组针对安卓软件臃肿化问题开发了XDebloat框架,实现了基于功能切割和基于功能模块化的安卓软件去臃肿化方案。此方案提供了3种自动化标注功能模块的方法,允许开发者将不需要的功能模块进行标注,并将其从原始安卓App中删除。此外,该方案允许将移动应用按照模块重构,并使用App Bundle框架进行封装,可为开发者大大节约时间,提高开发效率(注:谷歌要求从20218月起所有新上架的应用必须采用App Bundle)。



出于对这项研究成果的兴趣,inSIST媒体部的同学们邀请到了信息学院唐宇田教授接受采访,就各自想了解的内容提出了问题,让我们来一睹为快吧!


Q1: 降低软件臃肿是否能释放更多内存,延长手机使用寿命?

A: 从我们的研究上来看,经过去臃肿处理的app相对于原有app 而言,使用了更少的内存,对CPU的需求也有所减缓,耗电量也更少。理论上,是可以帮助延长手机使用寿命的。


Q2:  是否有方法对开发者的行为进行监督(例如故意不标注某些恶意模块)?

A: 我们的研究主要帮助开发者将不再需要的臃肿功能模块从app中去除。当然,这也可以用在去除有安全漏洞的模块。这里我们的主要假设是开发者并不是有意的开发恶意模块,而是由于一些疏漏导致模块有安全隐患。那么,开发者可以用这种方法将含有安全隐患的模块去除。


Q3:  进行功能切割和功能模块化的指标是什么?

A: 已经有一些研究表明,理论上,并不存在对于如何定义一个app中功能的统一方法。由于,每一个app的场景不同、内容不同、功能也不同,每一个app理论上都需要开发者来定义其中的功能模块。因此,并不存在一个适用于所有app的功能模块化方法。我们研究也是旨在寻求一些合理的功能模块化方法。其目的是为了帮助我们验证我们的框架。


Q4:  相较于之前的研究,这篇文章最主要的创新点是什么?

A: 本文的主要创新是我们研究允许开发者自己定义要去除的功能模块。之前的研究主要关注于对于死代码(dead code)的去除、冗余第三方库、冗余资源文件的去除。对于开发者而言,他们无法自己定义想要去除的功能的。本文的研究有效地解决了这一问题。


Q5:  以修剪为基础的去臃肿策略中,是否存在删除过多导致功能失常的可能,如何判断与验证(浅显说明)

A:在去除功能的过程中,可能会导致原app功能的执行逻辑被破坏。这可能会导致功能的执行逻辑被破坏。例如,我们使用手机支付,第一步可能是需要验证身份,第二步才是支付。例如,我们去掉了第一步的身份验证功能,app就会直接进行支付。这是有可能的。所以,还是需要我们回到第三个问题,只有一个完全正确的功能模块挖掘方法才能完全解决这一问题。但这需要app的开发程序员进行设计,并且需要有关于这个app的完整的背景知识。但这对于一个自动化工具而言并不适合。虽然我们并不能完全保证功能的执行逻辑不被破坏,但我们可以保障不会出现错误的逻辑。例如,一个计算器可以计算1+1=2,在我们进行去臃肿功能处理后,还是可以保障1+1=2 而不是其他。


Q6:  原先策略(one-size-fit-all)的优劣势?新框架下的优劣势或适用场景?

A: One-size-fit-all 的优势就是可以适用于更多的用户,支持更多的场景但是它的缺点也很明显就是体积过大、更新速度缓慢、执行速度缓慢等等。Google新的app bundle框架很好的解决了这一问题就是运行app通过模块(module)的形式进行组织。用户可以在需要使用某些功能的时候再请求下载这些模块。为用户节省了空间。