葛 兴,李云飞,何小虎,阴国富
(渭南师范学院 计算机学院,陕西 渭南 714099)
安卓操作系统最初由Andy Rubin开发,2005年8月由Google收购注资。2007年11月,Google以Apache开源许可证的授权方式,发布了安卓操作系统的源代码。第一部安卓智能手机T-Mobile G1发布于2008年10月。2021年6月,安卓12 Beta版正式发布。经过10余年的发展,目前安卓操作系统已经在移动平台得到了广泛应用,2019年市场占有率已经达到87%。
随着安卓应用软件(APP,Application)的规模愈加扩大,逻辑愈加复杂,其可靠性也愈加难以保证。市场上的安卓应用软件多有可靠性低、安全性低、程序优化差、程序越权等缺点。在市场快速扩张的时代,客户对软件可靠性的需求不明确,开发者在可靠性方面投入不足,往往只注重开发速度、交付速度、程序正确性和用户界面(UI,User Interface)的友好性等,忽略了安卓应用软件的可靠性。开发者大量使用开源代码和公用模块,缺陷率普遍偏高,可被利用的已知和未知缺陷较多,软件运行不稳定,使用寿命短,安全性差,占用资源多,难以升级和更新换代。有调查显示,普通软件公司开发的软件缺陷(bug)密度为4~40个缺陷/千行代码,高水平软件公司开发的软件缺陷密度为2~4个缺陷/千行代码,美国NASA开发的软件缺陷密度为0.1个缺陷/千行代码。[1]安卓软件作为直接提供用户服务,与用户交互最多的环节,其可靠性对用户体验的影响非常大,甚至会高于安卓系统对用户造成的影响。不过,安卓软件正在逐渐从初期的“野蛮生长”慢慢走向规范化、模块化、正规化。由于各个应用软件之间竞争激烈,在各方均实现了基本功能后,哪家公司的产品能在可靠性、安全性上展现出优势,其产品就会在市场竞争中获得消费者的青睐。政府、军队、大学、国防科研部门的对外采购尤其重视可靠性和安全性。国家的监管也日趋严格和规范,要求企业开展数据活动必须履行数据安全保护义务、承担社会责任。因此,安卓可靠性是今后安卓软件开发技术的一个重要研究方向,为了提高安卓可靠性,需要从技术和管理的角度共同制定解决方案。
现阶段安卓软件高可靠性设计处于一个快速发展的阶段。有很多高可靠性设计的“点”,例如采用某个函数、某个技术可以避免某种缺陷;也有一些高可靠性设计的“线”,例如在需求分析中考虑到高可靠性需求,但整个高可靠性设计并没有一个从头到尾、从需求分析到运行维护、从技术到管理皆包含的“面”。本文的目标是,分析研究高可靠性设计一个个孤立的技术点,归纳总结高可靠性设计的多种技术路线,最终提出完整的高可靠性软件开发模型,形成一个“面”。这是一个技术和管理相融合的软件工程模型,真正将高可靠性设计融入安卓软件开发中的每一步与每一个细节,注重软件可靠性设计,强调量化风险控制,更加科学、专业和规范。
LYVAS等[2]讨论了安卓劫持攻击,该类攻击会对用户的数据机密性产生很大威胁,提出了一种操作系统级防御机制,该机制会监控安卓应用程序活动时访问的资源,并在其内置数字签名,以对用户和开发人员透明。MERL等[3]讨论了安卓应用程序重新打包的问题。通过重新打包,攻击者可以诱使移动用户安装重新打包的(可能是恶意的)应用程序,用以替换原始应用程序。HAMDI等[4]研究了移动应用程序开发中重构对代码异味(code smell)的影响,通过分析5个开源 Android 应用程序的652个版本和9 600次重构操作,发现一般的重构并不能有效地消除代码异味。WANG等[5]使用机器学习算法检测安卓恶意软件,使用了一个多维、基于内核特征的框架和基于特征权重的检测方法,旨在对安卓恶意软件和良性应用程序的特征进行分类和理解。GARG等[6]提出了一个全面而合理的分类法来回顾安卓安全中使用的最先进方法。强调了不同分析方法的趋势和模式,确定了目标、分析方法的关键技术、代码表示、使用工具和框架,并展望了未来工作的研究领域。GAVIRIA DE LA PUERTA等[7]创建了一种方法来分析任何类型的移动应用程序发送的网络数据包,以验证其行为。为了解决这个问题,使用监督学习系统对网络数据包的通信模式进行建模。DA COSTA等[8]探索使用静态分析和动态分析来提高挖掘沙箱法(mine sandboxes)识别安卓恶意软件的性能。FRANKE等[9]提出了一种移动软件质量模型(Mobile Software Quality Model),该模型主要从软件的兼容性(Flexibility)、可扩展性(Extensibility)、适应性(Adaptability)、便携性(Portability)、可用性(Usability)和运行效率(Efficiency)来考察移动软件的质量。LI等[10]基于软件功能模块重用可靠性分析,提出了一种新的软件可靠性早期预测方法。该方法将不同模块的重用分为不同的权重,并基于权重进行加权分析。SUN等[11]使用复杂网络理论(complex network theory)研究了安卓操作系统内核与功能组件之间的交互关系,通过将操作系统建模为复杂网络来研究安卓操作系统内核的交互问题。STAVROU[12]阐述了安卓编程技术以及如何高效安全地实现安卓编程。RUBINOV等[13]讨论了安卓应用程序测试中动态实例组件仍然被现有技术所忽视。何凤军等[14]将软件可靠性设计分为软件体系架构设计、冗余设计、健壮性设计、容错设计、避错设计、错误恢复设计及重用设计等。马振宇等[15]围绕测试运行方式以及验证指标类型对软件可靠性验证测试方法的基本原理进行分析,归纳总结出各验证测试方法的适用特点。王金勇等[16]对开源软件可靠性模型参数估计、可靠性和评测标准进行了论述。张威[17]分析了软件可靠性评估的现状和问题,并介绍了极值统计模型、基于BootStrap重抽样技术的软件可靠性模型和基于故障注入技术和加速寿命试验原理的软件可靠性评估模型。刘洋等[18]提出了以系统危险为基础的软件安全性与可靠性分析策略,并结合实例对这一策略的实际应用进行了深入探讨。闫永权等[19]梳理了软件老化问题并进行了软件抗衰研究。
在软件安全设计领域,主要采用4种模型进行软件安全设计,第一种是微软的软件安全开发生命周期模型(Security Development Lifecycle,SDL)[20],第二种是MCGRAW GRAY提出的软件内建安全开发模型[21],第三种是NIST的软件内建安全开发模型[22],第四种是OWASP的软件安全开发模型[23]。
长期以来,软件可靠性(Software Reliability)作为衡量软件的重要特性受到特别重视。GB/T 11457—2006《信息技术 软件工程术语》将软件可靠性定义为:(1)在规定条件下,在规定的时间内软件不引起系统失效的概率。该概率是系统输入和系统使用的函数,也是软件中存在缺陷的函数。系统输入将确定是否会遇到已存在的缺陷(如果缺陷存在的话)。(2)在规定的时间周期内所述条件下程序执行所要求的功能的能力。[24]
软件可靠性最重要的度量指标有3个,分别为软件可靠度、软件失效强度和软件平均失效时间。[17]
(1)软件可靠度。软件可靠度是指,软件在特定条件下,在时间t内不间断完成某设定功能的概率。用变量t表示发生失效的时刻,f(t)为失效概率密度函数,F(t)为分布函数,R(t)为可靠度函数,P(0≤t≤T)表示从开始时刻到T时刻软件发生失效的概率,则有
(1)
(2)
(2)软件失效强度。软件失效强度是指,已工作到时刻t但尚未失效的软件,在时刻t后发生失效的概率,记作λ(t)。失效强度函数与失效概率密度函数、可靠度函数之间的关系为
(3)
(3)软件平均失效时间(Mean Time to Failure,MTTF)。设N0个不可恢复的系统在同样的条件下进行试验,测得其全部失效时间为t1,t2,…,tN0,其MTTF为
(4)
当N0趋向于无穷时,MTTF为系统失效时间的数学期望,则有
(5)
安卓软件存在风险有其必然性,首先,计算机系统的结构决定了软件漏洞是不可避免的。其次,软件趋向大型化,第三方扩展增多,软件使用面临更多威胁。再次,新技术、新应用产生之初缺乏可靠性、安全性考虑。最后,现阶段对开发者软件可靠性重视不够,软件开发者不具备实现可靠性的知识和能力。
安卓软件可靠性设计的一般原则可分为业务功能的可靠性设计、数据源的可靠性设计和占用资源的可靠性设计。业务功能的可靠性设计包括:合理分配执行任务;设计任务同步与并发;任务负载的均衡,多个业务执行流有序执行;生命周期的闭合;良好的用户交互和提示。数据源的可靠性设计包括:核心的数据和文件应有备份和容错设计;外部输入数据的合法性判断;向外发起的服务请求,要有超时和有限重试设计;对外部发起的攻击性请求,例如通知、广播,要有防护设计。占用资源的可靠性设计包括:分配的资源必须在确定的地方释放;使用资源必须有明确的上界,包括内存、磁盘、文件、线程等。
在整个安卓软件开发流程中,漏洞是会积累和传递的,软件运维过程中出现的一些“先天性问题”就是这种漏洞积累和传递的体现,所以在设计之初就要尽量把漏洞消除在前期阶段。软件产生漏洞的方式可以归纳为两种:一是程序代码引入漏洞,二是开发过程引入漏洞。程序代码具有长度、算法和语句结构等特性,程序的代码越长,数据结构越复杂,函数越多,可靠性越难保证。
微软推出的安全开发生命周期(SDL)是一套针对软件开发过程进行安全保障的方案,旨在尽量减少设计、代码和文档中安全相关漏洞的数量。微软的实践证明,从需求分析阶段就开始考虑安全问题,可以大大减少软件产品漏洞的数量,虽然会在一定程度上增加成本,但整体上能够提高它的性价比。[25]
安卓软件工程受限于严格的成本控制和有限的开发时间,往往需要在可用性、经济性、时效性、可靠性等性能之间做出一定的取舍,而可靠性经常是被牺牲的,主要有以下两个方面的原因:(1)安卓软件编程人员没有经过专门的可靠性开发培训,缺乏可靠性编程意识和能力。(2)在现有的安卓软件产品开发中,通常在开发流程后期才进行测试,以消除编码中的错误或缺陷。这种方式对于减少软件产品中的漏洞数量有一定的作用,但对于用户需求、系统架构上存在的缺陷和错误是无能为力的,而这些前期需求和设计阶段的缺陷往往会大幅度增加软件发布后的维护成本,给开发商和用户都带来巨大风险。
因此,为了提高安卓软件的可靠性,应将安卓可靠性的思想融入安卓软件瀑布开发法中的每一步中,即为了开发高可靠的安卓软件,把可靠性加固活动融入安卓软件生命周期的各个阶段中去。
软件瀑布开发法是最典型的软件开发方法,也称为线性模型,结合瀑布开发法和SDL开发流程,再融入高可靠性开发的思维,最终形成了本文的安卓软件高可靠性开发模型。共分为7个阶段,每个阶段都有其对应的高可靠性活动,如图1所示。
图1 基于SDL的安卓软件高可靠性开发模型
在安卓软件开发的初始阶段,应针对团队成员进行高可靠性意识和能力培训,使之了解基础知识和最新趋势,提升团队能力,保障软件开发,让管理者、设计者、开发者、测试者、运维者从始至终将“高可靠”贯穿在整个开发周期之中,所有人都有较强的可靠性观念。基本培训应涵盖的基础内容包括:(1)高可靠性设计培训。其主题为减少攻击面、纵深防御、最小权限原则和默认安全配置。(2)威胁建模培训。其主题为威胁建模概述、威胁建模的设计意义和基于威胁建模的编码约束。(3)高可靠性编码培训。其主题为缓冲区溢出、整数溢出、SQL注入等漏洞。(4)弱加密安全测试培训。其主题为高可靠性测试与功能测试的区别、风险评估和测试方法。(5)隐私保护培训。其主题为隐私敏感数据的类型、隐私设计最佳实践、风险评估、隐私开发最佳实践和隐私测试最佳实践。(6)高级概念培训。其主题为高级安全设计和体系结构、可信用户界面设计、安全漏洞细节以及威胁缓解。
除了对开发团队进行培训以外,还要对管理进行改进。管理者应当认识到,在未来的软件市场竞争中,对员工进行高可靠性培训,对软件进行高可靠性设计,在前期虽然投入了更多成本,但最终会是“利大于弊”的。高可靠性并非仅仅锦上添花的附加卖点,而是和业务功能密不可分的基础要求。因此,管理者要提供足够的时间和资源来保证高可靠性培训的贯彻落实。
在高可靠性需求分析阶段,开发团队确定安卓软件的相关标准和要求,建立可靠、安全和隐私的最低采用标准。开发团队通过判断缺陷等级来设定可靠性的最低采用标准。在项目开始时定义这些标准可加强对可靠性问题相关风险的理解,并有助于团队在开发过程中发现和修复可靠性缺陷。项目团队必须协商确定每个开发阶段的质量门(例如,必须在嵌入代码之前审查并修复所有的编译器警告),随后将质量门交由可靠性顾问审批,可靠性顾问可以根据需要添加特定于项目的说明及更加严格的可靠性要求。
软件高可靠性分析的目的是描述为了实现信息安全目标,软件系统应该做什么才能有效地提高软件产品的可靠性,减少软件可靠性漏洞。一个缺少高可靠性需求分析的软件开发项目,将威胁到信息的保密性、完整性和可用性以及一些其他重要的安全属性。
软件的可靠性需求主要分为外部可靠性需求和内部可靠性需求。外部可靠性需求通常是指法律、法规等遵从性要求,包括国家和地区相关技术与管理的法规、标准及要求等。这些法律法规往往是已有可靠性威胁的经验性对策总结,因而遵循这些要求既是法规制度上的要求,也是软件可靠性保障的要求。内部可靠性需求通常包括两个方面:一是开发团队内部的政策、标准、指南和实践模式,二是与软件业务功能相关的可靠性需求。
软件业务功能相关的可靠性需求获取的相关方包括业务负责人、最终用户、客户、可靠性需求分析人员和安全技术支持等。业务负责人、最终用户和客户在安全需求确定时应发挥重要作用,应当积极参与安全需求的采集和分析过程。业务负责人是业务风险的最终责任人,负责确定可接受的风险阈值,明确哪些风险是可以接受的,因此他们应当了解软件的可靠性漏洞,协助可靠性需求分析人员和软件开发团队考虑风险的优先顺序,权衡决定哪些风险是重要的。可靠性需求分析人员要负责软件可靠性需求的收集和分析,并帮助软件开发团队将安全需求转化为功能说明。为了保证可靠性需求活动的有效展开,相关方面人员必须进行充分的沟通与合作,特别是在相关方是非技术人员的情况下。一些常见的可靠性需求获取方法包括头脑风暴、问卷调查和访谈、策略分解、数据分析、主/客体关系矩阵、使用用例和滥用用例建模,以及软件可靠性需求跟踪矩阵。
在高可靠性设计阶段,从可靠性和安全性的角度定义软件的总体结构。通过分析攻击面,设计相应的功能和策略,降低并减少不必要的安全风险,同时通过威胁建模,分析软件或系统安全威胁,提出缓解措施。在进行高可靠性设计时,应当遵循8条设计原则,如图2所示。
图2 高可靠性设计的8条原则
软件受攻击面原则是指用户、程序或潜在的攻击者都能够访问到的所有功能和代码的总和,它是一个混合体,不仅包括代码、接口和服务,也包括对所有用户提供服务的协议,尤其是那些未被验证的或远程用户都可以访问到的协议。一个软件的攻击面越大,其可靠性风险就越大。减少软件受攻击面就是移除、禁止一切不需要使用的模块、协议和服务,其目的是减少攻击者可以利用的漏洞。
最小权限原则是指系统仅授予主体(用户、管理员、进程等)完成规定任务所必需的最小权限,并且该权限的持续时间也刚好够用。最小权限原则可使恶意的或过失的特权不正当使用的可能性降到最低,从而确保系统安全。如果没有很高的权限,那么很多程序是无法实现其破坏功能的。不仅要防止程序被攻击,还要尽可能地防止程序被攻击之后的后续破坏行为的实施,将损失尽可能降到最低。
纵深防御原则是指在软件设计中加入层次化的安全控制和风险防御方案。纵深防御原则有助于减少系统的单一失效点。它强调不依赖单一的高可靠性解决方案,而是采用多种互相保障的可靠性功能,即使一个点失效,也不会导致整个系统崩溃。纵深防御原则还可以威慑试探性的攻击者,当他们遇到一层又一层的阻滞时,可能会知难而退,放弃攻击。
默认高可靠配置原则是指为系统提供默认的高可靠性措施,包括默认权限、默认策略等,尽可能让用户不需要额外配置就可以安全地使用。默认高可靠配置原则也是保持系统简单化的重要方式。
保护最弱一环原则是指保护系统中最弱的组件。类似于“木桶原理”,攻击者通常会尝试攻击系统中最薄弱的环节,这些薄弱的环节可能是代码、服务、接口,甚至是人,比如使用社会工程学技巧攻击管理员。
可靠性性价比原则是指以合适的开发成本生产具有较高可靠性的软件产品。可靠性性价比原则并不是要求压缩在可靠性上的投入。因为高可靠性设计并不是业务功能之外的华而不实的功能,而是业务功能之内的系统基本保障。微软SDL实践也表明,软件安全开发方法并不会增加成本,相反因为减少了用户的损失和后期的运行维护费用而降低了总成本。
可靠性心理可接受原则是指可靠性机制要设置得简单、易用,尽可能让可靠性机制对用户“透明”,不给用户使用带来不便和麻烦,用户才会认同和使用高可靠机制。
完全控制原则是指要求每一次访问受保护对象的行为都应当尽可能地进行细粒度的检查。
在高可靠性实施阶段,按照设计要求,对软件进行编码和集成,实现相应的安全功能、策略及缓解措施。在该阶段通过安全编码和禁用不安全的API,可以减少编程时导致的安全问题和由编码引入的安全漏洞,并通过静态代码分析等措施来确保安全编码规范的实施。具体措施有:(1)使用统一标准的开发工具——所有开发者只能使用统一标准的开发工具及其关联的安全检查表,如编译器、链接器的警告。此列表应由团队的可靠性顾问进行批准。一般情况下,开发者应尽量使用稳定版本的开发工具,使用开发工具的安全分析功能和保护措施。(2)放弃使用不可靠的函数——一些编程中常用的函数与API(应用编程接口)并不可靠。开发者应当分析安卓软件编码过程中使用的所有函数和API,对函数和API进行可靠性识别,禁用不可靠的函数和API,并使用最新最可靠的函数和API作为替代。(3)静态代码分析——开发者应对源代码执行静态分析。静态代码分析本身通常不足以替代人工代码分析,开发者应了解静态分析工具的工作模式、优点和缺点,并辅以人工代码分析,平衡工作效率和代码覆盖率。
在高可靠性验证阶段,通过动态分析和测试手段,检测软件的安全漏洞,全面核查攻击面,检查各个关键因素上的威胁缓解措施是否得以正确实现。(1)动态程序分析。此验证任务采用动态分析工具,监控应用安卓软件在运行时是否存在内存泄漏、程序越权等可靠性问题。(2)模糊测试。模糊测试是一种专门形式的动态分析,它通过故意向应用程序引入不良格式或随机数据而诱发程序故障。模糊测试策略的制定以应用程序的预期用途、功能和设计规范为基础。可靠性顾问可以要求进行额外的模糊测试,或扩大模糊测试的范围并增加持续时间。(3)威胁模型和攻击面评析。实际完成的安卓应用程序可能会与软件开发项目需求阶段和设计阶段所设定的功能和结构不完全一致。因此,在高可靠性实施后,分析软件的攻击面评估,对软件进行威胁模型演练评估是非常有必要的。威胁建模的一般流程如图3所示。
图3 威胁建模过程
一般的高可靠性验证框架为:(1)制定高可靠性验证策略。明确软件验证的目标、范围、标准、风险控制要素、验证资源、成本与效益、验证人员、验证时间,制定软件高可靠性验证基本原则,特别是对于第三方验证,明确验证的约束条件、知道验证的边界是非常重要的。验证策略也可以用于验证软件产品的可接受程度。(2)规范化的高可靠性需求。软件可靠性需求是验证的主要内容,通过分析验证对象的可靠性特点,生成测试用例。(3)软件结构风险分析。在成本约束下,将验证适当聚焦于可靠性领域问题。(4)执行软件可靠性验证。使用黑盒测试、白盒测试等方法,对软件可靠性功能进行验证。(5)环境管理。设置稳定、可控的验证环境,保证每一个被提交的漏洞都能准确重现。如果是在用户环境下进行渗透测试,那么在渗透测试结束之后需要对现场进行复原,保证系统恢复测试前的状态。(6)验证数据管理。软件可靠性测试用例、验证结果和验证报告等都需要进行电子归档,以保证测试能够有效地帮助发现软件存在的可靠性问题,并不断改进。
在高可靠性发布阶段,对软件进行最终可靠性核查。该阶段将每个开发阶段的文件、过程和数据都进行归档,准备进行发布与维护。这些文件、过程和数据包括所有的法律法规、行业标准、软件需求文档、概要设计文档、详细设计文档、软件源代码、注释、二进制文件、专用符号等。
在安卓软件发布之前,最后一件事是进行最终可靠性核查。最终可靠性核查是指在即将发布前全面检查软件的所有可靠性功能。最终可靠性核查由专业的可靠性顾问在开发人员的协助下执行,这并不是“查找与修补”的活动,而是对需求和设计阶段提出的可靠性需求进行最终检查。最终可靠性核查有3种结果:一是通过,这证明所有的可靠性需求和设计都已经被正常实现;二是通过但有异常,这证明主要的可靠性需求和设计都已经被正常实现,但仍有部分可靠性需求和设计并未被正确实现,不过这种问题可以在后续版本更新中尽快修复;三是未通过,即软件的关键可靠性需求和设计未被实现且难以在短时间内修复,这种状况下软件不能被批准,不能按时发布。软件必须返工重修,或上报高级管理层进行抉择。
在高可靠性响应阶段,响应安全事件与漏洞报告,实施漏洞修复和应急响应。同时发现新的问题与安全问题模式,并将它们用于安卓软件可靠性的持续改进中。即使在发布时软件不包含任何已知的漏洞,也并不意味着软件就绝对安全可靠,仍会面临日后出现的新威胁。
高可靠性响应计划应包括以下方面:(1)组建专业的运维团队。如果开发团队太小以至于没有专门的运维团队,那么也应制定紧急运维团队预案,开发者、市场营销、管理人员应充当紧急运维团队成员。(2)对于不同类型的事件,要做好分类和分级,确保响应及时有效,能够处理紧急事件。(3)做好软件的回滚、重新部署、增量更新等预案。(4)做好如何处理第三方代码的预案。
为了验证本文所提出的安卓软件高可靠开发模型,设计对照实验,由两组学生分别使用安卓软件瀑布开发模型和本文提出的安卓软件高可靠性开发模型,分别开发同一个安卓项目——手机安全卫士。开发参考资料为《Android项目实战——手机安全卫士》[26]。开发小组1使用典型的安卓软件瀑布开发模型,项目命名为MPSG_FALL。开发小组2使用安卓软件高可靠开发模型,项目命名为MPSG_HRD。
开发小组2,按照安卓软件高可靠开发模型的流程,即按照高可靠性培训、高可靠性需求分析、高可靠性设计、高可靠性实施、高可靠性验证、高可靠性发布、高可靠性响应的流程进行开发。
3.1.1 高可靠性培训
在进行MPSG_HRD开发之前,先对参与开发的所有人员进行培训。首先将本文提出的安卓软件高可靠开发模型讲授给开发人员,让开发人员从始至终将“高可靠”思想贯穿在整个开发周期之中。
用2周时间,共计20个课时对开发小组2进行培训,培训内容为高可靠性设计培训、威胁建模培训、高可靠性编码培训、弱加密安全测试培训、隐私保护培训、高级概念培训。
3.1.2 高可靠性需求分析
随着安卓系统的普及,用户需要保护自己的隐私、知晓自己的手机流量的详细使用情况以及如何拦截骚扰电话,以便在享受手机带来的方便的同时尽可能减少损失。
为了解决手机的安全隐患,设计开发一款手机安全卫士软件,该软件可以管理手机中安装的软件、保护用户隐私、拦截骚扰电话、清理垃圾、查杀病毒、监控流量与网速等。便捷的操作、友好的用户体验以及极强的实用性是手机安全卫士软件必备的。极高的可靠性和手机安全卫士本身的安全性更是需求中的重中之重。软件应符合GB/T 18336—2015标准,必须在嵌入代码之前审查并修复所有的编译器警告(0 error,0 warning)。
3.1.3 高可靠性设计
MPSG_HRD主要设计有7大功能,分别为手机清理、骚扰拦截、病毒查杀、软件管理、程序锁、网速测试、流量监控。具体功能模块设计如图4所示。
图4 MPSG_HRD功能模块设计
手机清理模块包含扫描垃圾和清理垃圾功能。骚扰拦截模块包含骚扰拦截列表、黑名单列表和联系人列表功能。病毒查杀模块主要实现病毒查杀信息显示与病毒查杀进度显示功能。软件管理模块的功能是对手机中的各类软件进行启动、卸载、设置权限。程序锁模块的目的是设置密码和输入密码进行解锁。网速测试模块用来测试上传和下载文件的网速以及显示测试报告界面。流量监控模块包括流量监控信息、套餐流量设置和本月流量详细报告功能。
3.1.4 高可靠性实施
MPSG_HRD开发时间为4周,JDK版本为8.0,开发环境和调试环境分别为Android Studio 3.2和Android 8.0操作系统荣耀手机,使用SQLite数据库,API版本为27,使用基于Java的Android语言实现程序编码。MPSG_HRD代码结构如图5所示,其中HomeAdapter.java是主界面的布局填充器,用于填充界面中的所有功能图标与文字信息。VersionEntity.java是封装版本信息的实体类,主要包含字段versioncode、description、apkurl。DownLoadUtils.java是用于从服务器下载APK的工具类。MyUtils.java用于获取应用程序的版本信息,并实现新版本APK的安装。VersionUpdateUtils.java是用于进行版本更新的工具类。SplashActivity.java用于展示欢迎界面以及版本信息。HomeActivity.java用于展示程序主界面以及实现各个功能图标的点击事件。
图5 MPSG_HRD代码结构
3.1.5 高可靠性验证
高可靠性验证主要针对保密性、完整性、可用性、可认证性、可审计性进行验证。验证流程为:先完成每个单元模块的测试,再进行集成功能测试。对于保密性,主要检查数据验证算法和数据加密函数。对于完整性,主要检查数据完整性和系统完整性。对于可用性,主要检查手机安全卫士的有效性、效率和用户满意度。对于可认证性,主要检查用户账户的命名规范、密钥的储存和认证凭证的管理。对于可审计性,则聚焦于软件性能监控、事件监控和日志分析。
经过测试,发现并修改如下错误:(1)MPSG_HRD在应用进程退出时,高频率注册时长1 s的定时器,定时器到时立即启动该应用及关联应用。如果系统反复清理该应用,该应用会反复自启动,导致操作系统严重卡顿。(2)由于编程错误,MPSG_HRD反复注册了数百个应用管理权限管理的AppOps Listener,在执行callback的时候直接导致system_server进程global reference table overflow,即溢出错误,造成系统错误重启。(3)MPSG_HRD收到消息通知之前,需要获取通话状态。如果短时间内收到通知消息特别多,会将system_server的binder线程全部占满,致使其他应用和服务无法与system_server通信,导致系统重启。(4)兼容性问题,如果使用更高版本的Android操作系统,那么MPSG_HRD会频繁闪退,无法使用。
3.1.6 高可靠性发布
最终发布前,对MPSG_HRD的所有需求分析文档、设计文档、软件代码、测试用例、Bug集合、中间代码等所有项目相关的文件和数据都进行集中归档,并进行代码混淆、项目打包、项目加固。进行最终可靠性核查,所有的可靠性需求和设计都已经被正常实现,通过核查。将MPSG_HRD发布到手机应用市场,如小米应用商店、华为应用商店、360应用商店等,通过审核后,MPSG_HRD就可在应用商店供用户下载使用。发布的MPSG_HRD 软件界面如图6所示。
3.1.7 高可靠性响应
组建运维团队,制定应急响应预案,项目主持人、指导教师、参与的学生均为紧急运维团队成员。应急响应预案流程如图7所示。
图7 应急响应预案流程图
当系统发生故障后,运维人员立即响应,并向相关人员了解系统故障情况。接下来,运维人员根据了解到的系统故障情况进行分析,判定是软件故障还是硬件故障,以确定采用哪种处理方式。如果是软件故障,则通过查看系统日志、应用日志等方式找出软件出错原因;如果是硬件故障,则通过硬件错误信息提示找出错误原因。之后由运维人员根据现场的实际情况,在与用户协调后,进行故障解决。故障解决后,运维人员需要书写详细的故障报告归档总结,以不断迭代提高运维水平。
使用安卓软件高可靠性开发模型与安卓软件瀑布开发模型开发相同的手机安全卫士项目,分别命名为MPSG_HRD和MPSG_FALL,其性能参数对比如表1所示。
表1 MPSG_HRD与MPSG_FALL性能参数对比
经过实验测试对比,MPSG_HRD在可靠性、缺陷/千行代码、平均失效时间等参数性能上显著优于MPSG_FALL。
MPSG_HRD通过了模糊测试和渗透测试,而MPSG_FALL则未通过。虽然所占用内存稍大、所消耗电量稍高,但几乎不存在内容泄露问题,不会出现安卓软件长时间使用后出现的卡顿和死机问题。另外,MPSG_HRD在服务器端进行了二级容灾备份,并且有专门的应急响应预案,当数据信息由于各种原因丢失时,MPSG_HRD可以快速启动应急响应,恢复数据信息。综上所述,MPSG_HRD在综合性能,特别是可靠性上明显优于MPSG_FALL,验证了基于SDL的安卓软件高可靠性开发模型的有效性。
本文分析了当前安卓软件可靠性的背景、研究现状和相关工作,研究了软件可靠性度量指标、影响因素和常见的可靠性故障及其原因分析,论证了安卓软件可靠性的重要性、紧迫性和经济性。之后,基于微软SDL软件安全开发生命周期模型提出了一种新型高可靠安卓软件开发模型,该模型的核心思想是将“高可靠性”设计思想融入安卓软件设计开发的每一个步骤中,在安卓软件设计的7个步骤——培训、分析、设计、实施、验证、发布、响应中,均融入高可靠性思想,从技术、管理和经济等多个方面对模型进行了说明和论证,为安卓软件可靠开发提出了一个具备可行性的全过程开发模型。该模型需要在可靠性方向投入较多资源,因此更适合于有着充足资源的大型企业和大型软件开发团队,其可靠性收益可以显著超过可靠性成本。对于大型企业和大型软件开发团队有较好的推广应用价值。该高可靠性软件开发模型也对其他强调可靠性、安全性的高可靠性软件开发模型有一定的借鉴和参考意义。
在未来,应针对开发周期短、资金投入少、开发者技术相对较低的小微企业和小微软件开发团队,设计性价比高、可行性高的安卓高可靠性软件开发模型。进一步研究软件高可靠性设计和软件高可靠性实施,提高模型的实用性和经济性。同时,助力高校和企业科研项目,让高可靠性软件开发模型在安卓软件开发中得到切实应用与实践反馈,不断地修改和完善。