SCI论文(www.lunwensci.com)
摘要:本文提出了一种移动应用线上问题远程诊断与热修复方法。诊断功能包括,通过长连接远程下发指令至移动客户端,并设置触发条件,若发现线上问题,采集以下信息:设备和用户基本信息、堆栈信息、网络请求接口的流水信息、内存中的变量值。其中触发条件为一段返回布尔值的代码字符串,移动客户端接收到指令后通过轻量级的解释器将字符串解析成可执行的代码,并嵌入客户端附着执行。代码执行后若条件满足,即发生了指定的问题,采集上述调试信息以供诊断使用。热修复功能包括,当诊断到问题所在后,下发字符串代码至指定的方法或函数,并通过解释器解析成可执行的代码后整体或部分替代原方法或函数,替代的过程通过AOP实现。该方法通过下发预置触发条件的指令并结合解释器实现了一套完整的远程诊断和修复功能,提高了问题诊断以及修复的效率,且该方法能够顺利通过各移动平台严格的审核。
关键词:软件开发,移动应用,线上问题,远程诊断,热修复
【Abstract】:This paper presents a method for remote diagnosis and hotfix of online issues in mobile applications.The diagnostic functionality includes remotely sending instructions to the mobile client through a persistent connection and setting trigger conditions.If an online problem is detected,the following information is collected:device and user basic information,stack trace information,sequential information of network request interfaces,and variable values in memory.The trigger condition is a code string that returns a boolean value.Upon receiving the instructions,the mobile client parses the string into executable code using a lightweight interpreter and embeds it for execution.If the condition is satisfied after code execution,indicating the specified problem has occurred,the aforementioned debugging information is collected for diagnostic purposes.The hotfix functionality involves sending code strings to the designated methods or functions once the problem is diagnosed.The code strings are parsed into executable code by the interpreter and used to partially or entirely replace the original methods or functions,which is accomplished through aspect-oriented programming(AOP).This method provided a complete remote diagnosis and repair solution by sending preconfigured trigger condition instructions and utilizing an interpreter.It enhances the efficiency of problem diagnosis and repair while successfully passing strict auditing processes on various mobile platforms.
【Key words】:software development;mobile applications;online issues;remote diagnostics;hotfix
引言:移动应用随着用户量增加后会由于用户使用环境的复杂性和不可知性,出现一些难以在测试端重现的问题,这些问题通常会在特定用户群或者特定设备上出现,在交付测试阶段很难模拟出现问题的环境,而且用户在描述问题时只是简单的现象描述,因此排查问题时可用信息甚少,造成问题诊断困难且周期长[1,2],即便侥幸查到问题所在,修复问题仍然需要依赖发版[3]。现有技术中,虽也有热修复功能的开源技术,比如JSPatch,但近年来苹果公司针对运用这些JavaScript(JS)脚本相关的热修复技术加强了审核,大部分使用该技术实现热修复功能的产品都遭遇苹果公司的下架处理[4,5]。
为解决现有技术存在的不足,本文首先对已经发布上线的版本出现的在测试端难以模拟和重现的问题,提供了一种远程诊断的方法,通过下发指令至目标设备,抓取排查问题所需的环境和调试信息用于研发人员调查问题出现的原因;然后本文提供了一种轻量级的热修复方案,通过代码解释器解决了热修复的规则限制,使具有热修复功能的产品能顺利通过各移动平台严格的审核。
1系统组成与方法流程
移动应用远程诊断与热修复系统组成包括监控告警模块、信息组合模块、信息上传模块和热修复模块。其中监控告警模块分为应用状态管理(Application Performance ManagementAPM)监控和异常预警,异常发生时将自动上传预置的埋点日志。信息组合模块为诊断信息所需的必要构成,包括设备基本信息、设备运行信息、用户信息、调试日志等。上传组成(下发埋点触发规则)则是在发生问题时用于从用户端获取特定的诊断信息。热修复模块则是通过解释器将下发字符串转成代码以实现动态修复。
远程诊断与热修复方案总体流程为预先在App埋点日志,当发生APM预警或者异常状态时触发日志上传。另外,当用户反馈问题时,可通过静默推送下发埋点并在指定规则满足的状态下触发获取用户设备环境下的各类诊断日志信息。除此之外,在分析定位到问题后,也可下发代码通过解释器实现热修复。如图1所示为系统组成与方案流程示意图。
2远程诊断
诊断指令格式为JavaScript Object Notation(JSON)文本,通过长连接下发至移动应用客户端。如图2所示为远程诊断系统总体方案流程示意图。诊断指令包含9类信息,用于完整描述所需诊断的版本信息、设备信息以及环境信息。具体指令内容如下所示:
(1)当前诊断指令所针对的客户端版本号;
(2)当前诊断指令的ID;
(3)当前诊断指令所针对的客户端bundleId;
(4)当前诊断指令是单次生效或是持久生效;
(5)当前诊断指令所嵌入的代码块类名;
(6)当前诊断指令所嵌入的代码块方法或函数;
(7)当前诊断指令嵌入方法或函数中的执行时机(原方法或函数执行前/后执行或替代执行);
(8)当前诊断指令的触发条件;
(9)当前诊断指令所需采集的信息。
其中,当前诊断指令所需采集的信息又包含三方面的内容:1)所需采集的程序执行中的变量值或方法/函数的返回值。数组格式,元素为代码字符串;2)需要上传的调试信息。数组格式,元素为调试信息的枚举值,包括设备和用户基本信息、堆栈信息、用户网络请求接口的流水信息;3)网关名。数组格式,元素为网关接口名,设置后只采集指定网关请求接口的流水。
移动客户端接收到诊断指令后,其执行步骤为:判断诊断指令所针对的客户端bundleId和版本号,只有在这两个都匹配上的情况下才会执行诊断指令;判断诊断指令是单次生效或是持久生效,若是持久生效则将指令保存到本地,在应用每次运行时诊断指令都会执行;获取诊断指令的触发条件,若是多个条件,则遍历执行。指令的触发条件为返回布尔值的表达式,字符串格式,通过解释器解析成可执行的表达式代码;获取诊断指令条件代码所需嵌入的类和方法名,并使用AOP的方式Hook住该类中的方法(比如可使用开源库Aspects),当该方法执行时附着执行诊断条件代码;诊断指令条件代码嵌入的方法或函数执行时,根据诊断指令中的执行时机/方式执行诊断触发的条件代码,若条件满足,则触发诊断信息的采集。
诊断信息采集的条件触发后,获取诊断指令中所需采集的内容。若需要采集程序执行中的变量值,则读取该变量值的变量名,并通过runtime(安卓平台为反射)的方式获取该变量值;若需要采集具有返回值的单个步骤或多个步骤的方法或函数,则通过解释器将字符串解析成代码并执行获取返回值。获取所需采集的调试信息,包括:(1)设备和用户基本信息,如设备名称、系统版本号、设备类型、UUID、应用版本号、内存/CPU/磁盘使用率、用户信息、登录名、用户ID、账号状态;(2)堆栈信息;(3)获取诊断指令中指定的网关名,上传网关名对应接口的请求参数和返回内容的记录。对于网络请求的流水,其实施流程如下:
客户端接收诊断指令后,读取需要记录的网关名,每次网络请求时,遍历需要记录的网关列表,若该次网络请求的网关在列表中,则将网络请求数据记录到本地,同一个网关最多记录3条,超过3条,先进先出。当诊断采集信息的条件触发后,读取本地保存的网关数据请求记录并上传。对于诊断指令下发的目标和范围,通常情况下,用户遇到的问题不会是孤立情况,某一个用户遇到的问题,其他用户也可能会遇到,因此下发的规则不仅仅可以下发给反馈问题的用户,还需要能够下发给其他用户(灰度下发),一旦有用户遇到相同的问题即触发诊断日志的上传。
另外一方面,客户端可以同时接收并记录多个诊断指令,当这些诊断信息采集的条件满足的时候分别触发所需采集的调试信息并上传。诊断信息采集后,由客户端调用接口上传至服务器,服务器接收到采集的信息后通过MIS系统进行展示。当发现某次下发的诊断指令存在问题时,系统需要能够通过下发撤销诊断的指令用于删除之前下发的诊断指令。撤销诊断的指令内容为所需撤销的诊断指令的ID,为数组格式,可一次性撤销多个诊断指令。
3热修复
热修复指令同诊断指令,格式为JSON文本,通过长连接下发至移动应用客户端。指令包含7类信息,用于描述热修复的环境和执行信息。具体指令内容如下所示:
(1)当前热修复指令所针对的客户端版本号;
(2)当前热修复指令的ID;
(3)当前热修复指令所针对的客户端bundleId;
(4)当前热修复指令是单次生效或是持久生效;
(5)当前热修复指令所嵌入的代码块类名;
(6)当前热修复指令所嵌入的代码块方法或函数;
(7)当前热修复指令需要执行的代码字符串。
移动客户端接收到热修复指令后,其执行步骤为:判断热修复指令所针对的客户端bundleId和版本号,只有在全部匹配的情况下才会执行热修复指令;判断热修复指令是单次生效或是持久生效,若是持久生效则将指令保存至本地,在应用每次运行时热修复指令均会执行;获取热修复指令执行代码的字符串,通过解释器将字符串转换成可执行的代码,解释器的原理为匹配代码关键字,如点符号为setter或getter方法、if字符为条件判断、[]为执行方法,可直接转换成performSelector方法执行(安卓平台类似机理);获取热修复指令代码所需嵌入的类和方法名,使用AOP的方式Hook该类中的方法,当该方法执行时附着执行热修复代码;和诊断指令相同的,热修复指令也支持撤销操作。
4应用实例
在实际应用中,根据问题出现的类和方法所在位置,指定诊断条件与修复内容。如用户在使用App过程中发现页面布局错乱,其指令内容可根据指定的类名和方法名,通过Method Swizzling技术Hook相应执行方法,并将修复的代码通过推送下发,再结合解释器解析成代码插入原先方法体中。执行方式可在方法执行前/后插入,或者整体替换原方法。推送下发的远程诊断指令内容及释义如表1所示。
表2为修复该问题的热修复指令。修复方法为将布局变量current_y的值增加44。具体为通过Method Swizzling技术Hook类MainOrderInfoHeadView中的drawRect:方法,并在其中添加代码执行内容self.current_y+=44;。热修复指令内容与释义如表2所示。
5结语
本文提出了一种移动应用线上问题远程诊断和热修复的方法。远程诊断方案流程为首先通过长连接下发指令至移动客户端,设置触发条件,若发现线上问题,则分别采集设备、环境和堆栈信息,用于问题的诊断与排查。其中触发条件为代码字符串,移动客户端接收到指令后通过轻量级的解释器将字符串解析成可执行的代码,并嵌入客户端附着执行。代码执行后若条件满足,即发生了指定的问题,采集上述调试信息以供诊断使用。另一方面,当诊断到问题所在后,进一步通过热修复功能对问题进行修复,通过解释器解析热修复代码,整体或部分替代原方法或函数,替代的过程通过AOP实现。实践表明,本文提出的移动应用远程诊断与热修复方法灵活、高效、扩展性强,具有较高实际应用价值。参考文献
[1]宓云軿,孙轶康,钱虹.移动医疗应用程序产品安全性评价研究进展[J].中国医学装备,2021,18(2):162-165.
[2]季莹莹,王月领,虞成磊,等.移动应用程序安全监测检测平台研究[J].中国新通信,2023,25(7):110-112.
[3]任远,丁玲,戚伟.Uni-App移动应用开发技术分析[J].电子技术与软件工程,2023(3):41-44.
[4]杜帅,鄂海红,许可.混合移动应用开发模式的新策略[J].软件,2015,36(6):12-17.
[5]熊建芳.Android App功能插件化机制的研究与实现[J].智能计算机与应用,2019,9(1):235-238.
关注SCI论文创作发表,寻求SCI论文修改润色、SCI论文代发表等服务支撑,请锁定SCI论文网! 文章出自SCI论文网转载请注明出处:https://www.lunwensci.com/jisuanjilunwen/74483.html