本发明涉及计算机技术领域,特别涉及一种应用版本异常修复的跟踪方法和系统。
背景技术:
随着智能电子设备的普及,基于android及ios的智能手机、平板,智能android设备等成为了日常生活中必不可少的电子设备。在电子设备使用过程中,经常会出现应用程序运行异常问题,在出现上述问题时会导致设备应用异常退出。设备出现异常退出问题时则需要反馈并复现定位问题,目前,或者生成异常日志文件后通常需要开发人员手动从众多的日志文件中查找异常日志,并人为地对该异常日志进行仔细分析以确定异常日志产生的原因。
于20190222公开的,公开号为cn109376056a的中国发明揭示了一种异常日志分析方法、装置、存储介质、移动终端及服务器。方法包括:当检测到异常日志分析事件被触发时,获取所述移动终端的异常日志;将所述异常日志发送至服务器,所述异常日志用于指示所述服务器确定所述异常日志的异常来源,并将所述异常来源发送至所述移动终端;接收所述异常来源,并显示所述异常来源。该发明直接将移动终端运行异常时产生的异常日志发送服务器,使服务器根据异常日志,准确、快速地确定出异常日志的异常来源,并及时反馈给移动终端,但是当在同一设备上重复发生相同异常时,该方案不会防止重复上报相同的异常信息,而且不具有异常修复的跟踪功能。
于20151104公开的,公开号为cn105025318a的中国发明公开了一种应用程序的异常日志信息的反馈方法及装置,一种应用程序的异常日志信息的反馈方法包括:在应用程序出现异常情况时,启动针对应用程序的日志信息收集功能,并启动对异常情况的监测功能;在监测到异常情况复现后,关闭日志信息收集功能,并将收集到的日志信息保存为应用程序的异常日志信息;将异常日志信息反馈给预设服务器。其是仅将应用程序的异常日志信息反馈给预设服务器,针对性较好,方便开发人员对应用程序的异常情况进行分析和处理。但同样的,当在同一设备上重复发生相同异常时,该方案不会防止重复上报相同的异常信息,而且不具有异常修复的跟踪功能。
于20151230公开的,公开号为cn105204969a的中国发明提供一种异常日志处理方法及异常日志处理装置。该异常日志处理方法包括检测应用异常信号,并根据应用异常信号,记录应用异常时的移动终端的系统信息、应用信息以及调用栈信息;根据移动终端的系统信息、应用信息以及调用栈信息,生成与应用异常信号相关的异常日志,并将异常日志存储在移动终端内;以及在应用启动时,读取并显示异常日志。其还提供一种异常日志处理装置,根据应用异常信号生成异常日志,并直接将该异常日志存储在移动终端内,应用测试人员可方便的对异常日志进行查看,提高了应用异常的处理效率。但同样的,当在同一设备上重复发生相同异常时,该方案不会防止重复上报相同的异常信息,而且不具有异常修复的跟踪功能。
技术实现要素:
本发明要解决的技术问题,在于提供一种异常日志信息自动收集的方法和系统,一方面可以有效防止相同异常的重复上报,另一方面还具有异常修复的跟踪功能。
第一方面,本发明提供了一种应用版本异常修复的跟踪方法,包括下述步骤:
s1、当设备的应用发生异常时,捕获异常信息,包括异常源码信息和异常信息描述;
s2、设备根据所述异常源码信息和异常信息描述生成异常id;
s3、设备根据异常id生成异常日志的文件名,该文件名包括异常id、应用版本信息、设备id和日志文件生成时间的信息;
s4、设备根据异常id判断所述异常日志是否上传到日志服务器,若是,则忽略;若否,则将所述异常日志上传到日志服务器,若上传成功则在设备本地记录对应的异常id,若上传失败则将异常日志保存在设备本地,等待下一次补传;
s5、所述日志服务器收到所述异常日志后,在数据库中新建异常,置异常id为当前应用版本号下的打开状态,并生成该异常id的异常日志跟踪记录信息;直接根据异常id,应用版本号来分类过滤,直接从异常日志的应用版本号分析每个应用版本的异常类型数,并从异常日志的异常信息内容判断具体的异常位置及原因;
s6、所述日志服务器对应异常id建立新的应用版本号,当异常得到排查或解决时,将对应异常id在新的应用版本下设置为已解决状态,并生成对应异常id在各应用版本号下的解决及打开记录,还提供根据异常id或应用版本号查询所有异常出现和解决情况。
第二方面,本发明提供了一种应用版本异常修复的跟踪系统,包括:
捕获模块,用于当设备的应用发生异常时,捕获异常信息,包括异常源码信息和异常信息描述;
异常id生成模块,用于设备根据所述异常源码信息和异常信息描述生成异常id;
文件名生成模块,用于设备根据异常id生成异常日志的文件名,该文件名包括异常id、应用版本信息、设备id和日志文件生成时间的信息;
上传模块,用于设备根据异常id判断所述异常日志是否上传到日志服务器,若是,则忽略;若否,则将所述异常日志上传到日志服务器,若上传成功则在设备本地记录对应的异常id,若上传失败则将异常日志保存在设备本地,等待下一次补传;
异常状态设置模块,用于所述日志服务器在收到所述异常日志后,在数据库中新建异常,置异常id为当前应用版本号下的打开状态,并生成该异常id的异常日志跟踪记录信息;还用于在异常得到排查或解决时,将对应异常id在新的应用版本下设置为已解决状态;
异常过滤分析模块,用于所述日志服务器直接根据异常id,应用版本号来分类过滤,直接从异常日志的应用版本号分析每个应用版本的异常类型数,并从异常日志的信息内容判断具体的异常位置及原因;
跟踪模块,当异常得到排查或解决时,所述日志服务器对应异常id建立新的应用版本号,并生成对应异常id在各应用版本号下的解决及打开记录,还提供根据异常id或应用版本号查询所有异常出现和解决情况。
本发明实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:在设备端,先根据捕获的异常源码信息和异常信息描述生成异常id,即可根据异常id关键字来区分各种不同异常,每个异常id表示某种不同的异常内容,因此可基于异常id进行过滤,有效避免了异常日志的重复上报;在服务器端,在收到异常日志后,可直接根据异常id,应用版本号来分类过滤,自动新建或打开bug情况,便于查看异常日志服务器上的异常信息,排查及解决相应的异常;并能根据异常信息(包含源码文件名,函数名,行号,异常调用栈信息)快速定位相关的异常问题,能有效减轻日志分析工作;当异常得到排查或解决时,所述日志服务器在数据库建立新的应用版本号,并将异常的出现记录、解决记录、解决情况,异常内容信生成至所述异常日志跟踪记录信息中,为所述异常日志跟踪记录信息提供异常id和/或应用版本号的查询条件,大大方便了应用版本异常修复的跟踪。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
下面参照附图结合实施例对本发明作进一步的说明。
图1为本发明系统的框架示意图;
图2为本发明实施例一中方法中的流程图;
图3为本发明实施例二中装置的结构示意图;
图4为本发明实施例三中电子设备的结构示意图;
图5为本发明实施例四中介质的结构示意图。
具体实施方式
本申请实施例通过提供一种异常日志信息自动收集的方法和系统,一方面可以有效防止相同异常的重复上报,另一方面还具有异常修复的跟踪功能。
本申请实施例中的技术方案,总体思路如下:在设备端,先根据捕获的异常源码信息和异常信息描述生成异常id,基于异常id进行过滤,有效避免了异常日志的重复上报;在服务器端,在收到异常日志后,可直接根据异常id,应用版本号来分类过滤,自动新建或打开bug情况,便于查看异常日志服务器上的异常信息,排查及解决相应的异常;并能根据异常信息(包含源码文件名,函数名,行号,异常调用栈信息)即快速定位相关的异常问题,能有效减轻日志文件分析工作;当异常得到排查或解决时,所述日志服务器在数据库建立新的应用版本号,将异常的出现记录、解决记录、解决情况,异常内容信息生成至所述异常日志跟踪记录信息中,为所述异常日志跟踪记录信息提供异常id和/或应用版本号的查询条件,大大方便了应用版本异常修复的跟踪。
在介绍具体实施例之前,先介绍本申请实施例方法所对应的系统框架,如图1所示,系统大概分两个部分:
设备,安装应用程序,当应用程序发生异常时,生成异常id和异常日志的文件名,基于异常id对异常日志进行过滤后上报给日志服务器。
日志服务器,用于接收异常日志,在数据库中直接根据异常id,应用版本号来分类过滤后自动新建或打开bug详情,并能根据异常信息(包含源码文件名,函数名,行号,异常调用栈信息)即快速定位相关的异常问题,当异常得到排查或解决时,所述日志服务器建立新的应用版本号,并生成异常的相关信息得到跟踪记录信息,以供根据异常id和/或应用版本号进行查询跟踪。
实施例一
如图2所示,本实施例提供一种应用版本异常修复的跟踪方法,包括下述步骤:
s1、当设备的应用发生异常时,捕获异常信息,包括异常源码信息和异常信息描述;所述异常源码信息包括源码文件名、函数名、行号和异常调用栈;
s2、设备根据所述异常源码信息和异常信息描述生成异常id;所述异常id的生成规则是:由所述源码文件名、所述函数名和所述异常信息描述组成字符串,再由所述字符串生成md5值,则该md5值的字符串形式即为所述异常id;
所述异常日志文件名为:<异常id>_<应用版本号>_<设备id>_<日志文件生成时间>.log;其中,
对于有注册用户的应用,所述设备id为用户id,对于无注册用户的应用,所述设备id为设备mac地址;
所述日志文件生成时间的格式为yyyymmddhhmmss,所述yyyy为四位数年份,所述mm为两位数月份,所述dd为两位数日期,所述hh为两位数小时,所述mm为两位数分钟,所述ss为两位数秒钟。
s3、设备根据异常id生成异常日志的文件名,该文件名包括异常id、应用版本信息、设备id和日志文件生成时间的信息;
s4、设备根据异常id判断所述异常日志是否上传到日志服务器,若是,则忽略;若否,则将所述异常日志上传到日志服务器,若上传成功则在设备本地记录对应的异常id,若上传失败则将异常日志保存在设备本地,等待下一次补传;
s5、所述日志服务器收到所述异常日志后,在数据库中新建异常,置异常id为当前应用版本号下的打开状态,并生成该异常id的异常日志跟踪记录信息;直接根据异常id,应用版本号来分类过滤,直接从异常日志的应用版本号分析每个应用版本的异常类型数,并从异常日志的异常信息内容判断具体的异常位置及原因;
s6、所述日志服务器对应异常id建立新的应用版本号,当异常得到排查或解决时,将对应异常id在新的应用版本下设置为已解决状态,并生成对应异常id在各应用版本号下的解决及打开记录,还提供根据异常id或应用版本号查询所有异常出现和解决情况。包括:异常开始出现在哪个应用版本号中,中间有几个应用版本号解决过该异常后又复现过该异常,最终解决的版本号是哪个。
其中,作为本实施例的一种更优的实现方式或更为具体的实现方式,还可包括下述步骤:
s7、当设备的应用进行版本升级时,清除设备本地已上传异常日志的异常id,当相同的异常在新版本中复现时,重新上传一次异常日志。
如图3所示,所述s5中,所述日志服务器收到所述异常日志后,先判断对应的异常id是否存在服务器本地,若否,则新建异常,并置异常id为当前应用版本号下的打开状态,并生成该异常id的日志跟踪记录信息,若是,则:
判断异常id是否在当前应用版本号下的打开状态,若是,则忽略,若否,则将异常id在此应用版本号下的打开状态,并生成该异常id的异常日志跟踪记录信息。
异常状态说明:每个异常id的异常状态分为各个应用版本号下的:“打开状态”,“已解决状态”,其中,已解决状态是指开发人员解决了某个异常后,把它在解决了此异常id的应用版本号中置成“已解决状态”,日志服务器会生成解决记录;打开状态是指日志服务器根据设备应用上报的异常id和应用版本号,自动新建/或打开相应版本下的异常状态,日志服务器会生成问题发生记录。
设备的应用上报异常到日志服务器:上报的内容包括异常id信息,异常版本号,设备id及异常信息内容(源码位置(源码文件名,函数名,行号),异常信息描述,异常调用栈信息);示例:
如:某个应用的版本为101,在源码文件stringutils.java的函数名bmptostring(),代码第76行发生attempttoinvokevirtualmethod'booleanandroid.graphics.bitmap.compress(android.graphics.bitmap$compressformat,int,java.io.outputstream)'onanullobjectreference异常时,异常id的计算方法为:md5(“stringutils.java:bmptostring:attempttoinvokevirtualmethod'booleanandroid.graphics.bitmap.compress(android.graphics.bitmap$compressformat,int,java.io.outputstream)'onanullobjectreference”),计算出的异常id为:52a5be57a1adc1bc8524ffcbe0e66539,异常调用栈信息为:
若设备id为13055234567,当前系统时间为20201219102030,则生成的异常文件名为:52a5be57a1adc1bc8524ffcbe0e66539_101_13055234567_20201219102030.log,异常日志文件里面的内容为:
异常日志内容生成规则及异常日志分析示例:
抓取到异常发生的源码位置(源码文件名,函数名,行号),异常信息描述,异常调用栈信息。
如:下面这个异常日志文件,表示异常发生位置(stringutils.java文件,bmptostring函数,第76号),异常信息为(attempttoinvokevirtualmethod'booleanandroid.graphics.bitmap.compress(android.graphics.bitmap$compressformat,int,java.io.outputstream)'onanullobjectreference),异常调用栈信息为整个日志文件的内容。
所述日志服务器收到所述异常日志后,置异常id为当前应用版本号下的打开状态,即可通过人工进行查看及处理异常,过程如图4所示:
开发人员查看已打开的异常相关bug详情,包括:异常id,应用版本号、异常信息;
(1)所述日志服务器建立新的应用版本号,当人工解决异常后,将异常id对应的异常的新的应用版本号,并由日志服务器生成此异常id在新应用版本上作上“已解决状态”的标记,方便后续异常跟踪;
因为日志服务器上的异常信息内容包含了具体的异常问题,包括源码位置(源码文件名,函数名,行号),异常信息描述,异常调用栈信息,开发人员根据日志服务器上的异常信息,能很方便地解决相应的问题,并在日志服务器上新建应用版本号,将解决相应异常id的应用版本号对应选择上,日志服务器会生成此异常id在新应用版本上”已解决状态”的异常,方便后续异常跟踪。
项目跟踪人员跟踪异常:查看异常的出现记录、解决记录、解决情况,异常内容信息等,可以根据异常id跟踪其开始出现在哪个应用版本号,中间解决了几个版本号还复现了,最终解决的版本号是哪个;也可以根据某个应用版本号查询所有异常出现/解决的情况。
日志服务器自动跟踪异常的过程如图3示:设备上报异常id、应用版本号及其它异常信息后,日志服务器判断此异常id是否已经存在于异常日志服务器中,如果不存在则日志服务器新建异常并置此异常id为当前应用版本下“打开状态”;若异常id存在于日志服务器中,则判断此异常id在当前应用版本号下是否为”打开状态”,如果是打开状态则表示此异常已处理过,服务器忽略此次异常上报;如果不是打开状态则日志服务器在此应用版本号中把它置成”打开状态”,并生成异常日志记录信息。
基于同一发明构思,本申请还提供了与实施例一中的方法对应的系统,详见实施例二。
实施例二
如图5所示,在本实施例中提供了一种应用版本异常修复的跟踪系统,包括:
捕获模块,用于当设备的应用发生异常时,捕获异常信息,包括异常源码信息和异常信息描述;所述异常源码信息包括源码文件名、函数名和行号;
异常id生成模块,用于设备根据所述异常源码信息和异常信息描述生成异常id;所述异常id生成模块采用的异常id的生成规则是:由所述源码文件名、所述函数名和所述异常信息描述组成字符串,再由所述字符串生成md5值,则该md5值的字符串形式即为所述异常id;
所述异常日志文件名为:<异常id>_<应用版本号>_<设备id>_<日志文件生成时间>.log;其中,
对于有注册用户的应用,所述设备id为用户id,对于无注册用户的应用,所述设备id为设备mac地址;
所述日志文件生成时间的格式为yyyymmddhhmmss,所述yyyy为四位数年份,所述mm为两位数月份,所述dd为两位数日期,所述hh为两位数小时,所述mm为两位数分钟,所述ss为两位数秒钟。
文件名生成模块,用于设备根据异常id生成异常日志的文件名,该文件名包括异常id、应用版本信息、设备id和日志文件生成时间的信息;
上传模块,用于设备根据异常id判断所述异常日志是否上传到日志服务器,若是,则忽略;若否,则将所述异常日志上传到日志服务器,若上传成功则在设备本地记录对应的异常id,若上传失败则将异常日志保存在设备本地,等待下一次补传;
异常状态设置模块,用于所述日志服务器在收到所述异常日志后,在数据库中新建异常,置异常id为当前应用版本号下的打开状态,并生成该异常id的异常日志跟踪记录信息;还用于在异常得到排查或解决时,将对应异常id在新的应用版本下设置为已解决状态;
异常过滤分析模块,用于所述日志服务器直接根据异常id,应用版本号来分类过滤,直接从异常日志的应用版本号分析每个应用版本的异常类型数,并从异常日志的异常信息内容判断具体的异常位置及原因;
跟踪模块,用于所述日志服务器对应异常id建立新的应用版本号,当异常得到排查或解决时,将对应异常id在新的应用版本下设置为已解决状态,并生成对应异常id在各应用版本号下的解决及打开记录,还提供根据异常id或应用版本号查询所有异常出现和解决情况。包括:异常开始出现在哪个应用版本号中,中间有几个应用版本号解决过该异常后又复现过该异常,最终解决的版本号是哪个。
其中,作为本实施例的一种更优的实现方式(更为具体的实现方式),所述方法还包括:
清理模块,当设备的应用进行版本升级时,用于清除设备本地已上传异常日志的异常id,当相同的异常在新版本中复现时,重新上传一次异常日志。
所述异常状态设置模块具体是:用于所述日志服务器收到所述异常日志后,先判断对应的异常id是否存在服务器本地,若否,则在数据库中新建异常,并置异常id为当前应用版本号下的打开状态,并生成该异常id的日志跟踪记录信息,若是,则:
判断异常id是否在当前应用版本号下的打开状态,若是,则忽略,若否,则将异常id在此应用版本号下的打开状态,并生成该异常id的异常日志跟踪记录信息。
异常状态说明:每个异常id的异常状态分为各个应用版本号下的:“打开状态”,“已解决状态”,其中,已解决状态是指开发人员解决了某个异常后,把它在解决了此异常id的应用版本号中置成“已解决状态”,日志服务器会生成解决记录;打开状态是指日志服务器根据设备应用上报的异常id和应用版本号,自动新建/或打开相应版本下的异常状态,日志服务器会生成问题发生记录。
设备的应用上报异常到日志服务器:上报的内容包括异常id信息,异常版本号,设备id及异常信息内容(源码位置(源码文件名,函数名,行号),异常信息描述,异常调用栈信息);示例:
如:某个应用的版本为101,在源码文件stringutils.java的函数名bmptostring(),代码第76行发生attempttoinvokevirtualmethod'booleanandroid.graphics.bitmap.compress(android.graphics.bitmap$compressformat,int,java.io.outputstream)'onanullobjectreference异常时,异常id的计算方法为:md5(“stringutils.java:bmptostring:attempttoinvokevirtualmethod'booleanandroid.graphics.bitmap.compress(android.graphics.bitmap$compressformat,int,java.io.outputstream)'onanullobjectreference”),计算出的异常id为:52a5be57a1adc1bc8524ffcbe0e66539,异常调用栈信息为:
若设备id为13055234567,当前系统时间为20201219102030,则生成的异常文件名为:52a5be57a1adc1bc8524ffcbe0e66539_101_13055234567_20201219102030.log,异常日志文件里面的内容为:
异常日志内容生成规则及异常日志分析示例:
抓取到异常发生的源码位置(源码文件名,函数名,行号),异常信息描述,异常调用栈信息。
如:下面这个异常日志文件,表示异常发生位置(stringutils.java文件,bmptostring函数,第76号),异常信息为(attempttoinvokevirtualmethod'booleanandroid.graphics.bitmap.compress(android.graphics.bitmap$compressformat,int,java.io.outputstream)'onanullobjectreference),异常调用栈信息为整个日志文件的内容。
所述日志服务器收到所述异常日志后,置异常id为当前应用版本号下的打开状态,即可通过人工进行查看及处理异常,过程如图4所示:
开发人员查看已打开的异常相关bug详情,包括:异常id,应用版本号、异常信息;
(2)所述日志服务器建立新的应用版本号,当人工解决异常后,选择异常id对应的异常被解决的新应用版本号,并由日志服务器生成此异常id在新应用版本上作上“已解决状态”的标记,方便后续异常跟踪;
因为日志服务器上的异常信息内容包含了具体的异常问题,包括源码位置(源码文件名,函数名,行号),异常信息描述,异常调用栈信息,开发人员根据日志服务器上的异常信息,能很方便地解决相应的问题,并在日志服务器上新建应用版本号,将解决相应异常id的应用版本号对应选择上,日志服务器会生成此异常id在新应用版本上”已解决状态”的异常,方便后续异常跟踪。
项目跟踪人员跟踪异常:查看异常的出现记录、解决记录、解决情况,异常内容信息等,可以根据异常id跟踪其开始出现在哪个应用版本号,中间解决了几个版本号还复现了,最终解决的版本号是哪个;也可以根据某个应用版本号查询所有异常出现/解决的情况。
日志服务器自动跟踪异常的过程如图3示:设备上报异常id、应用版本号及其它异常信息后,日志服务器判断此异常id是否已经存在于异常日志服务器中,如果不存在则日志服务器新建异常并置此异常id为当前应用版本下“打开状态”;若异常id存在于日志服务器中,则判断此异常id在当前应用版本号下是否为”打开状态”,如果是打开状态则表示此异常已处理过,服务器忽略此次异常上报;如果不是打开状态则日志服务器在此应用版本号中把它置成”打开状态”,并生成异常日志记录信息。
由于本发明实施例二所介绍的系统,为实施本发明实施例一的方法所采用的系统,故而基于本发明实施例一所介绍的方法,本领域所属人员能够了解该装置的具体结构及变形,故而在此不再赘述。凡是本发明实施例一的方法所采用的装置都属于本发明所欲保护的范围。
本申请实施例中提供的技术方案,至少具有如下技术效果或优点:在设备端,先根据捕获的异常源码信息和异常信息描述生成异常id,基于异常id进行过滤,有效避免了异常日志的重复上报;在服务器端,在收到异常日志后,可直接根据异常id,应用版本号来分类过滤,在数据库自动新建或打开bug情况,便于查看异常日志服务器上的异常信息,排查及解决相应的异常;并能根据异常信息(包含源码文件名,函数名,行号,异常调用栈信息)即快速定位相关的异常问题,能有效减轻日志文件分析工作;当异常得到排查或解决时,所述日志服务器建立新的应用版本号,并将异常的出现记录、解决记录、解决情况,异常内容信息生成至所述异常日志跟踪记录信息中,并为所述异常日志跟踪记录信息提供异常id和/或应用版本号的查询条件,大大方便了应用版本异常修复的跟踪。
本领域内的技术人员应明白,本发明的实施例可提供为方法或系统,可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。