公开/公告号CN103440337A
专利类型发明专利
公开/公告日2013-12-11
原文格式PDF
申请/专利权人 百度在线网络技术(北京)有限公司;
申请/专利号CN201310404766.1
发明设计人 周建龙;
申请日2013-09-09
分类号G06F17/30(20060101);G06F9/445(20060101);
代理机构11286 北京铭硕知识产权代理有限公司;
代理人张川绪;王兆赓
地址 100085 北京市海淀区上地十街10号百度大厦三层
入库时间 2024-02-19 21:23:12
法律状态公告日
法律状态信息
法律状态
2017-01-11
授权
授权
2014-01-15
实质审查的生效 IPC(主分类):G06F17/30 申请日:20130909
实质审查的生效
2013-12-11
公开
公开
技术领域
本发明涉及操作系统领域,更具体地,涉及一种针对操作系统中的应用 程序的应用程序接口(API)兼容性扫描方法和API兼容性扫描装置。
背景技术
随着诸如Google的Android操作系统、苹果公司的iOS操作系统的系统 版本越来越多,操作系统的应用程序接口(API)的版本兼容性问题越来越突 出。例如,当某API要求运行在iOS操作系统的5.0版本以上,而某个应用 程序(APP)使用这个API运行在iOS操作系统的4.3版本时,如果不判断系统 的版本则有可能导致APP崩溃或功能异常。又例如,如果某系统API在 Android 4.0以上版本已废弃,而开发者调用该API时忘记增加版本判断,则 该APP对4.0以上版本的Android操作系统的适配就存在隐患。
因此,需要提供一种能够自动扫描出APP的API的兼容性问题的方法和 装置。
发明内容
本发明的一方面提供一种用于应用程序的API兼容性扫描方法,包括: 获取操作系统的API的版本兼容性规则,并建立包括API的引入版本信息和 废弃版本信息的系统API兼容性规则库;针对将被检查API兼容性的应用程 序,获取应用程序的代码语法树;解析代码语法树以获取应用程序所使用的 API;基于API兼容性规则库中与获取的API对应的废弃版本信息来确定应 用程序的API的兼容性隐患。
根据本发明的一方面,如果在应用程序的代码语法树中存在版本判断代 码,则不执行确定API的兼容性隐患的步骤。
根据本发明的一方面,自动从操作系统的官方网站获取最新的API的版 本兼容性规则,或者手动设置API的版本兼容性规则。
根据本发明的一方面,API兼容性扫描方法还包括:在解析代码语法树 之前对代码语法树进行遍历以得到精简的代码语法树。
根据本发明的一方面,API兼容性扫描方法还包括:基于API兼容性规 则库中与获取的API对应的引入版本信息和应用程序的最低支持版本来确定 应用程序的API的兼容性隐患。
根据本发明的一方面,API兼容性扫描方法还包括:基于确定的API的 兼容性隐患生成兼容性隐患报告,兼容性隐患报告包括关于存在兼容性隐患 的API被调用的次数以及在代码中的位置的信息。
本发明的另一方面提供一种用于扫描应用程序的API兼容性的API兼容 性扫描装置,包括:API兼容性规则库单元,获取操作系统的API的版本兼 容性规则,并建立包括API的引入版本信息和废弃版本信息的系统API兼容 性规则库;代码语法树获取单元,用于针对将被检查API兼容性的应用程序, 获取应用程序的代码语法树;API抓取单元,用于解析代码语法树以获取应 用程序所使用的API;API兼容性确定单元,用于基于API兼容性规则库中 与获取的API对应的废弃版本信息来确定应用程序的API的兼容性隐患。
根据本发明的另一方面,如果API兼容性确定单元确定在应用程序的代 码语法树中存在版本判断代码,则不执行确定API的兼容性隐患的操作。
根据本发明的另一方面,API兼容性规则库单元自动从操作系统的官方 网站获取最新的API的版本兼容性规则,或者根据用户的设置来手动地设置 API的版本兼容性规则。
根据本发明的另一方面,API兼容性扫描装置还包括:代码语法树遍历 单元,用于在API抓取单元解析代码语法树之前对代码语法树进行遍历以得 到精简的代码语法树。
根据本发明的另一方面,API兼容性确定单元还基于API兼容性规则库 中与获取的API对应的引入版本信息和应用程序的最低支持版本来确定应用 程序的API的兼容性隐患。
根据本发明的另一方面,API兼容性扫描装置还包括:兼容性报告生成 单元,基于确定的API的兼容性隐患生成兼容性隐患报告,兼容性隐患报告 包括关于存在兼容性隐患的API被调用的次数以及在代码中的位置的信息。
附图说明
通过下面结合附图进行的描述,本发明的上述和其他目的和特点将会变 得更加清楚,其中:
图1是示出根据本发明实施例的用于应用程序(APP)的应用程序接口 (API)兼容性扫描方法的流程图;
图2是示出根据本发明实施例的用于扫描应用程序(APP)的API兼容性 的装置的示图。
具体实施方式
下面提供参照附图进行的描述以有助于全面理解如权利要求及其等同物 所限定的本发明的示例性实施例。所述描述包括各种详细的细节以有助于理 解,而这些描述将被认为仅为示例性的。因此,本领域的普通技术人员将意 识到在不脱离本发明的范围和精神的情况下可做出在此描述的各种改变和变 型。另外,为了清晰和简洁,可省略对公知功能和构造的描述。
图1示出的是根据本发明实施例的用于应用程序(APP)的应用程序接口 (API)兼容性扫描方法的流程图。
如图1所示,首先,在步骤S101,获取操作系统的所有API的版本兼容 性规则,并建立系统API兼容性规则库。具体地,以iOS操作系统或Android 操作系统为例,可以从iOS操作系统的官方网站或Android操作系统的官方 网站自动获取iOS操作系统的API或Android操作系统的API的版本兼容性 规则。API的版本兼容性规则包含操作系统的API的软件开发工具包(SDK) 的引入版本信息和废弃版本信息。例如,Android官网给出的某API “android.service/textservice”的引入系统版本信息为:Added in API level 14, 这说明该API仅兼容Android os14以上版本。
通过获取所有的API的版本兼容性规则,可建立起API兼容性规则库, 其基本结构如下:
如以上的表所示,API兼容性规则库包括系统OS字段、系统API字段、 引入版本字段、废弃版本字段和备注字段。系统OS字段用于表示操作系统 的名称、系统API字段用于表示API的名称,引入版本字段用于表示API被 引入的版本,废弃版本字段表示API被废弃的版本。如果废弃版本字段的值 为空(Null),则表示该API在最新的版本的操作系统中仍然被使用。如果废弃 版本字段的值不为空而具有特定的值,则表示在该值所指定的版本中该API 已经被放弃,也就是说,在最新的版本的操作系统中该API已经不再被使用。
可按照预定周期自动地执行步骤S101以获取最新的API兼容性信息, 或者可手动地设置S101的执行时间。
接下来,在步骤S103,针对将被检查API兼容性的APP工程,获取APP 工程的代码语法树。例如,对于iOS操作系统,可以基于clang编译器的 libtooling库,以Vistor模式访问APP的源码文件语法树中的节点。对于 Android操作系统,可基于JDT编译插件获取APP的代码语法树。
然后,可选择地,在步骤S105,可对在步骤S103获取的APP工程的代 码语法树进行遍历,以获得精简的代码语法树。通过步骤S105,可以去除原 始的代码语法树中的重复和无用的信息,从而可以提高API抓取的效率。
以iOS操作系统为例,LibTooling工具提供一个通用的访问语法树的方 式:RecursiveASTVisitor。通过继承这个类并实现相应的Visit方法,即可访 问需要的语法树节点。下面给出遍历代码语法树的伪代码的示例:
1、创建一个工厂对象,注册到libtooling工具中
2、创建一个继承自ASTConsumer的子类GodEyesASTConsumer,并且 实现一个HandleTranslationUnit方法,这样每一次访问到一个源码文件都会回 调这个方法。在这里调用Visitor的traverse方法即可遍历所有语法树节点。
接下来,在步骤S107,解析代码语法树以抓取APP工程所使用的全部 API。
然后,在步骤S109,基于API兼容性规则库来确定抓取的APP工程的 API的兼容性隐患。具体地,如果抓取的API在API兼容性规则库中对应的 废弃版本字段显示为Null,则确定该API不存在兼容性隐患。否则,如果抓 取的API的对应的废弃版本字段不是Null,则确定该API存在兼容性隐患。
另外,根据优选实施例,如果在APP的代码语法树中存在版本判断代码, 则可不执行步骤S109。这是因为APP的开发者已经意识到了APP的API兼 容性问题而加入了版本判断的代码以消除兼容性问题,所以本发明可以不用 再次执行步骤S109来确定API的兼容性。
下面给出检查是否包括判断版本的代码的伪代码的示例:
另外,根据本发明的实施例,在步骤S111,还可基于APP工程中设置的 系统最低支持版本来确定该API是否存在兼容性隐患。具体地,如果APP工 程的某一API的引入版本高于该APP工程支持的最低版本,则该API存在兼 容性隐患。通过将API兼容性规则库中相应的API的引入版本与APP工程设 置的最低兼容版本进行比较,确定是否存在兼容性隐患。例如,可根据以下 的伪代码来进行查找:
最后,在步骤S113,根据在步骤S109和S111中得到的至少一个兼容性 隐患结果,生成最终的兼容性隐患报告。下面给出最终的兼容性隐患报告的 格式。
下面将参照图2来说明根据本发明实施例的用于扫描API兼容性隐患的 装置200。
如图2所示,根据本发明实施例的用于扫描API兼容性隐患的装置200 包括API兼容性规则库单元210、代码语法树获取单元220、代码语法树遍历 单元230、API抓取单元240、API兼容性确定单元250和兼容性报告生成单 元260。
API兼容性规则库单元210获取操作系统的所有API的版本兼容性规则, 并建立系统API兼容性规则库。具体地,以iOS操作系统或Android操作系 统为例,API兼容性规则库单元210可以从iOS操作系统的官方网站或 Android操作系统的官方网站自动获取iOS操作系统的API或Android操作系 统的API的版本兼容性规则。API兼容性规则库单元210可按照预定周期自 动地从官网上获取最新的API兼容性规则信息,或者可根据用户的设置来手 动地获取API兼容性规则。
代码语法树获取单元220针对将被检查API兼容性的APP工程,获取 APP工程的代码语法树。例如,对于iOS操作系统,代码语法树获取单元220 可以基于clang编译器的libtooling库,以Vistor模式访问APP的源码文件语 法树中的节点。对于Android操作系统,代码语法树获取单元220可基于JDT 编译插件获取APP的代码语法树。
可选择地,代码语法树遍历单元230可对代码语法树获取单元220获取 的APP工程的代码语法树进行遍历,以获得精简的代码语法树。以iOS操作 系统为例,LibTooling工具提供一个通用的访问语法树的方式: RecursiveASTVisitor。通过继承这个类并实现相应的Visit方法,即可访问需 要的语法树节点。
API抓取单元240解析代码语法树以抓取APP工程所使用的全部API。
API兼容性确定单元250基于API兼容性规则库来确定抓取的APP工程 的API的兼容性隐患。具体地,API兼容性确定单元250在兼容性规则库中 找到与抓取的API对应的条目,并基于该条目中的废弃版本字段的值来确定 是否存在兼容性隐患。如果抓取的API在API兼容性规则库中对应的废弃版 本字段显示为Null,则API兼容性确定单元250确定该API不存在兼容性隐 患。否则,如果抓取的API的对应的废弃版本字段不是Null,则API兼容性 确定单元250确定该API存在兼容性隐患。
特别地,如果API兼容性确定单元250确定在APP的代码语法树中存在 版本判断代码,则不执行基于废弃版本字段来确定是否兼容性隐患。
API兼容性确定单元250还可基于APP工程中设置的系统最低支持版本 来确定该APP工程的API是否存在兼容性隐患。具体地,如果APP工程的 某一API的引入版本高于该APP工程支持的最低版本,则API兼容性确定单 元250确定该API存在兼容性隐患。通过将API兼容性规则库中相应的API 的引入版本与APP工程设置的最低兼容版本进行比较,API兼容性确定单元 250可确定该API是否存在兼容性隐患。
兼容性报告生成单元260根据API兼容性确定单元250得到的兼容性隐 患结果,生成最终的兼容性隐患报告。
应理解,以上的装置的部件可以进一步划分为更多的部件或者合并为较 少的部件。
根据本发明的API兼容性扫描方法和装置对于一般Android或iOS操作 系统的APP代码工程,可以在5~10分钟内自动扫描出全部由系统API调用 不当导致的兼容性隐患,输出兼容性扫描报告,实现了现有的代码静态扫描 工具不具备的API兼容性扫描功能。
根据本发明的方法可被记录在包括执行由计算机实现的各种操作的程序 指令的计算机可读介质中。介质也可以只包括程序指令或者包括与程序指令 相结合的数据文件、数据结构等。计算机可读介质的例子包括磁介质(例如硬 盘、软盘和磁带);光学介质(例如CD-ROM和DVD);磁光介质(例如,光盘); 以及特别配制用于存储并执行程序指令的硬件装置(例如,只读存储器 (ROM)、随机存取存储器(RAM)、闪存等)。介质也可以是包括传输规定程序 指令、数据结构等的信号的载波的传输介质(例如光学线或金属线、波导等)。 程序指令的例子包括例如由编译器产生的机器码和包含可使用解释器由计算 机执行的高级代码的文件。
尽管已经参照本发明的示例性实施例具体显示和描述了本发明,但是本 领域的技术人员应该理解,在不脱离由权利要求限定的本发明的精神和范围 的情况下,可以对其进行形式和细节上的各种改变。
机译: 用于透明地启用多个版本的应用程序编程接口(API)之间的兼容性的方法和装置
机译: 不降低性能的OS API兼容性装置和方法
机译: 图像形成系统,图像形成装置,用户界面装置,扩展的用户界面兼容性确认方法,文档扫描方法和设置值管理方法