CN113946339A - 应用工程文件的处理方法、装置、电子设备及可读介质 - Google Patents

应用工程文件的处理方法、装置、电子设备及可读介质 Download PDF

Info

Publication number
CN113946339A
CN113946339A CN202111131921.8A CN202111131921A CN113946339A CN 113946339 A CN113946339 A CN 113946339A CN 202111131921 A CN202111131921 A CN 202111131921A CN 113946339 A CN113946339 A CN 113946339A
Authority
CN
China
Prior art keywords
file
class
application engineering
initial application
data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202111131921.8A
Other languages
English (en)
Inventor
赵志
彭飞
邓竹立
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuba Co Ltd
Original Assignee
Wuba Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Wuba Co Ltd filed Critical Wuba Co Ltd
Priority to CN202111131921.8A priority Critical patent/CN113946339A/zh
Publication of CN113946339A publication Critical patent/CN113946339A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/20Natural language analysis
    • G06F40/279Recognition of textual entities
    • G06F40/284Lexical analysis, e.g. tokenisation or collocates
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Health & Medical Sciences (AREA)
  • Artificial Intelligence (AREA)
  • Audiology, Speech & Language Pathology (AREA)
  • Computational Linguistics (AREA)
  • General Health & Medical Sciences (AREA)
  • Stored Programmes (AREA)

Abstract

本发明实施例提供了一种应用工程文件的处理方法、装置、电子设备及可读介质,所述方法包括:获取应用工程文件的初始源代码,并在初始源代码编译完成时,获取应用工程文件对应的编译日志,利用编译日志中记录的节点信息实现对应用工程文件的全量检测,进行数据类的统计,使得开发人员可以通过数据类详情表单直观、快速地获取应用工程文件中所有数据类的引用详情信息,进而有利于及时进行工程维护,提高项目开发的效率。

Description

应用工程文件的处理方法、装置、电子设备及可读介质
技术领域
本发明涉及代码处理技术领域,特别是涉及一种应用工程文件的处理方法、一种应用工程文件的处理装置、一种电子设备以及一种计算机可读介质。
背景技术
在应用程序工程项目的开发过程中,随着工程项目的不断迭代和增加,项目所对应的源代码数据会随着时间的推移增加到一个较大的体积,同时源代码中的类引用和头文件的引用也会变得越来越复杂,从而容易给开发者的日常开发和打包编译、测试等带来较长的等待时间。因此,需要对应用工程文件中的源代码进行检测,以删除无用的类引用关和头文件的引用关系。在对源代码的类引用、头文件等进行代码检测的过程中,存在接口限制、无法全量检测等问题。
发明内容
本发明实施例是提供一种应用工程文件的处理方法、装置、电子设备以及计算机可读存储介质,以解决或部分解决相关技术中应用工程文件的代码检测过程中存在检测受限、无法全量检测数据类引用的问题。
本发明实施例公开了一种应用工程文件的处理方法,包括:
获取初始应用工程文件的初始源代码;
若所述初始源代码编译完成,则确定所述初始应用工程文件对应的编译日志,所述编译日志包括初始应用工程文件中被引用的目标数据类所对应的节点信息;
根据所述节点信息,确定所述数据类对应的类引用文件;
获取所述初始应用工程文件的类导入文件;
根据所述类引用文件与所述类导入文件对所述初始应用工程文件进行数据类统计,生成与所述初始应用工程文件匹配的数据类详情表单,所述数据类详情表单用于记录所述初始应用工程文件中数据类的引用详情信息。
可选地,所述若所述初始源代码编译完成,则确定所述初始应用工程文件对应的编译日志,包括:
对所述初始源代码进行分词,获得若干个Token对象;
采用所述若干个Token对象,生成与所述初始源代码匹配的抽象语法树;
将所述抽象语法树转换为类汇编中间代码;
获取针对所述类汇编中间代码的目标格式;
将所述类汇编中间代码转换为与所述目标格式匹配的机器代码,完成所述初始源代码的编译;
获取所述机器代码对应的编译目录,并输出所述初始应用工程文件对应的编译日志。
可选地,所述抽象语法树包括若干个节点,所述输出所述初始应用工程文件对应的编译日志,包括:
遍历所述抽象语法树的各个节点,获取各所述节点的节点信息;
确定各个所述节点对应的目标数据类;
采用所述节点信息,生成针对所述目标数据类的编译日志,并输出所述编译日志;
其中,所述节点信息至少包括类名称、文件标识、节点类型以及位置信息中的一种。
可选地,所述节点信息包括文件标识与位置信息,所述根据所述节点信息,确定所述目标数据类对应的类引用文件,包括:
采用所述文件标识与位置信息,从所述初始应用工程文件中提取各所述节点对应的目标数据类所属的类引用文件。
可选地,所述获取所述初始应用工程文件的类导入文件,包括:
获取所述初始应用工程文件的头文件,所述头文件包括类定义;
通过所述类定义提取所述初始应用工程文件的类导入文件。
可选地,所述根据所述类引用文件与所述类导入文件对所述初始应用工程文件进行数据类统计,生成与所述初始应用工程文件匹配的数据类详情表单,包括:
将所述类导入文件与所述类引用文件进行比对,提取所述类导入文件中未存在于所述类引用文件中的第一数据类,以及存在于所述类引用文件中的第二数据类;
统计所述初始应用工程文件中所述第一数据类的第一引用次数,建立所述第一数据类与对应的第一引用次数之间的第一对应关系;
统计所述初始应用工程文件中所述第二数据类的第二引用次数,建立所述第二数据类与对应的第二引用次数之间的第二对应关系;
将所述第一对应关系与所述第二对应关系添加至预设表单中,生成与所述初始应用工程文件对应的数据类详情表单。
可选地,还包括:
将所述初始应用工程文件中所述第一数据类删除,生成目标应用工程文件。
本发明实施例还公开了一种应用工程文件的处理装置,包括:
初始源代码获取模块,用于获取初始应用工程文件的初始源代码;
编译日志确定模块,用于若所述初始源代码编译完成,则确定所述初始应用工程文件对应的编译日志,所述编译日志包括初始应用工程文件中被引用的目标数据类所对应的节点信息;
类引用文件确定模块,用于根据所述节点信息,确定所述数据类对应的类引用文件;
类导入文件获取模块,用于获取所述初始应用工程文件的类导入文件;
表单生成模块,用于根据所述类引用文件与所述类导入文件对所述初始应用工程文件进行数据类统计,生成与所述初始应用工程文件匹配的数据类详情表单,所述数据类详情表单用于记录所述初始应用工程文件中数据类的引用详情信息。
可选地,所述编译日志确定模块包括:
Token对象获得子模块,用于对所述初始源代码进行分词,获得若干个Token对象;
抽象语法树生成子模块,用于采用所述若干个Token对象,生成与所述初始源代码匹配的抽象语法树;
代码转换子模块,用于将所述抽象语法树转换为类汇编中间代码;
目标格式获取子模块,用于获取针对所述类汇编中间代码的目标格式;
代码编译子模块,用于将所述类汇编中间代码转换为与所述目标格式匹配的机器代码,完成所述初始源代码的编译;
编译日志输出子模块,用于获取所述机器代码对应的编译目录,并输出所述初始应用工程文件对应的编译日志。
可选地,所述抽象语法树包括若干个节点,所述编译日志输出子模块具体用于:
遍历所述抽象语法树的各个节点,获取各所述节点的节点信息;
确定各个所述节点对应的目标数据类;
采用所述节点信息,生成针对所述目标数据类的编译日志,并输出所述编译日志;
其中,所述节点信息至少包括类名称、文件标识、节点类型以及位置信息中的一种。
可选地,所述节点信息包括文件标识与位置信息,所述类引用文件确定模块具体用于:
采用所述文件标识与位置信息,从所述初始应用工程文件中提取各所述节点对应的目标数据类所属的类引用文件。
可选地,所述类导入文件获取模块包括:
头文件获取子模块,用于获取所述初始应用工程文件的头文件,所述头文件包括类定义;
类引导文件提取子模块,用于通过所述类定义提取所述初始应用工程文件的类导入文件。
可选地,所述表单生成模块包括:
数据类确定子模块,用于将所述类导入文件与所述类引用文件进行比对,提取所述类导入文件中未存在于所述类引用文件中的第一数据类,以及存在于所述类引用文件中的第二数据类;
第一对应关系生成子模块,用于统计所述初始应用工程文件中所述第一数据类的第一引用次数,建立所述第一数据类与对应的第一引用次数之间的第一对应关系;
第二对应关系生成子模块,用于统计所述初始应用工程文件中所述第二数据类的第二引用次数,建立所述第二数据类与对应的第二引用次数之间的第二对应关系;
表单生成子模块,用于将所述第一对应关系与所述第二对应关系添加至预设表单中,生成与所述初始应用工程文件对应的数据类详情表单。
可选地,还包括:
应用工程文件生成模块,用于将所述初始应用工程文件中所述第一数据类删除,生成目标应用工程文件。
本发明实施例还公开了一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,所述处理器、所述通信接口以及所述存储器通过所述通信总线完成相互间的通信;
所述存储器,用于存放计算机程序;
所述处理器,用于执行存储器上所存放的程序时,实现如本发明实施例所述的方法。
本发明实施例还公开了一个或多个计算机可读介质,其上存储有指令,当由一个或多个处理器执行时,使得所述处理器执行如本发明实施例所述的方法。
本发明实施例包括以下优点:
在本发明实施例中,可以在对应用工程文件进行编译的过程中,获取应用工程文件的初始源代码,并在初始源代码编译完成时,获取应用工程文件对应的编译日志,编译日志包括应用工程文件中被引用的目标数据类所对应的节点信息,接着根据节点信息,确定应用工程文件的类引用文件,并获取应用工程文件的类导入文件,然后根据两者对应用工程文件进行数据类统计,生成与应用工程文件匹配的数据类详情表单,通过在应用工程文件编译完成后输出对应的编译日志,并利用编译日志中记录的节点信息实现对应用工程文件的全量检测,同时在获取应用工程文件的类导入文件后,可以基于两者进行数据类的统计,使得开发人员可以通过数据类详情表单直观、快速地获取应用工程文件中所有数据类的引用详情信息,进而有利于及时进行工程维护,提高项目开发的效率。
附图说明
图1是本发明实施例中提供的一种应用工程文件的处理方法的步骤流程图;
图2是本发明实施例中提供的代码处理的流程示意图;
图3是本发明实施例中提供的一种应用工程文件的处理装置的结构框图;
图4是本发明实施例中提供的一种电子设备的框图;
图5是本发明实施例中提供的一种计算机可读介质的示意图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
作为一种示例,一个应用程序的开发工程随着工程项目的不断迭代和增加,源代码的数据会随着时间的推移增大到一个无法想象的体积,同时源代码类引用和头文件的引用也会变得越来越复杂,从而给开发人员的日常开发和打包编译测试等带来较长的等待时间。因此,需要在源代码增长到一定规模时对其进行检测分析,以便进行相应的代码删除处理。
对于代码的检测,可以包括基于官方开发工具的Xcode开发插件检测无用类引用和头文件的引用,通过该方式可以由开发人员在Xcode中开发一个Source EditorExtension,用于检测并删除应用工程文件中无用的类引用和头文件的引用。但是,在该处理过程中,功能单一,容易受到系统现有的应用接口的限制,只能获取到当前正在编辑的文件,无法对整个应用工程文件进行数据类的全量检测分析,并且要求类名和文件名一致,无法满足开发人员的实际需求。
此外,还可以通过Appcode代码检查分析,该工具为GUI(Graphical UserInterface,图形用户界面)代码检查工具,用于清除无用代码,清除无用的头文件引用。但是,该工具是基于源代码层面的字符串扫描,所以在清除无用代码上的准确性并不高,且检测类引用关系只能检测.m文件,无法精确地对其他文件进行检测,常常需要开发人员进行二次检测,以避免误删或漏检。
对此,本发明实施例中基于代码编译期的静态扫描分析应用工程文件的类引用关系,实现在相对低级的语言基础上对应用工程文件进行扫描,获取类与类之间的关系。具体的,可以在对应用工程文件进行编译的过程中,获取应用工程文件的初始源代码,并在初始源代码编译完成时,获取应用工程文件对应的编译日志,编译日志包括应用工程文件中被引用的目标数据类所对应的节点信息,接着根据节点信息,确定应用工程文件的类引用文件,并获取应用工程文件的类导入文件,然后根据两者对应用工程文件进行数据类统计,生成与应用工程文件匹配的数据类详情表单,通过在应用工程文件编译完成后输出对应的编译日志,并利用编译日志中记录的节点信息实现对应用工程文件的全量检测,同时在获取应用工程文件的类导入文件后,可以基于两者进行数据类的统计,使得开发人员可以通过数据类详情表单直观、快速地获取应用工程文件中所有数据类的引用详情信息,进而有利于及时进行工程维护,提高项目开发的效率。
其中,编译器指的是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个编译器的主要工作流程包括:源代码(source code)→预处理器(preprocessor)→编译器(compiler)→目标代码(object code)→链接器(Linker)→可执行程序(executables)。而编译期,指的是从源代码(例如:Object-C等高级语言)到能被计算机直接执行的目标代码的翻译过程。
通常来说编译器可以由三个部分组成:前端(Frontend):负责解析源代码,检查错误,生成抽象语法树(AST),并把AST转化为类汇编中间代码;优化器(Optimizer):对中间代码进行架构无关的优化,提高运行效率,减少代码体积,优化一些无效分支代码;后端(Backend):把中间代码转化为目标平台的机器码。
需要说明的是,在本发明实施例中以IOS平台的Xcode开发工具为例进行示例性说明,C/C++/ObjC的编译器是Clang(前端)+LLVM(后端)的模式,则本发明实施例的技术方案处理后的应用工程文件可以运行于IOS平台的APP(可执行程序),本发明对此不作限制。
具体的,参照图1,示出了本发明实施例中提供的一种应用工程文件的处理方法的步骤流程图,具体可以包括如下步骤:
步骤101,获取初始应用工程文件的初始源代码;
对于应用工程文件,其可以为开发人员在开发工具中进行开发的某一个应用程序对应的工程项目文件,如开发人员在Xcode中开发的应用于IOS或macOS的应用程序等等。
在对应用工程文件进行处理之前,开发人员可以先自定义编译前端Clang以对应用工程文件的源代码进行处理。具体的,由于Clang/LLVM编译器是开源的,则开发人员可以从开源平台上获取相应的源代码进行Clang的构建,从而通过对前端Clang进行自定义,添加对应的检测节点,使得应用工程文件在编译过程中,Clang插件可以在生成抽象语法树的同时,对应用工程文件进行检测,进而输出对应的日志文件,以根据日志文件确定应用工程文件中数据类的引用关系。
其中,初始应用工程文件可以为需要进行代码全量检测的代码源文件,或需要进行编译的代码源文件,其可以包括开发人员开发过程中编写的初始源代码,通过对应用工程文件进行检测,可以查找出应用工程文件中的无效代码,以便进行代码“减负”。
步骤102,若所述初始源代码编译完成,则确定所述初始应用工程文件对应的编译日志,所述编译日志包括所述初始应用工程文件中被引用的目标数据类所对应的节点信息;
在对初始应用工程文件进行编译的过程中,可以通过Clang插件在编译过程中实时对应用工程文件进行检测与记录,得到编译日志,进而在初始源代码编译完成后,可以获取初始应用工程文件对应的编译日志,以便根据编译日志生成类引用数据。其中,编译日志中可以包括初始应用工程文件中被引用的目标数据类所对应的节点信息。
需要说明的是,在应用工程文件中可以包括若干个数据类,数据类可以为对象程序设计实现信息封装的基础,其是开发人员定义的一种数据类型,也成类类型,每个数据类中可以包含数据说明和一组操作数据或传递消息的函数,其所对应的实例可以为对象。在本发明实施例中,通过编译日志中记录的被引用的数据类,可以确定当前被应用工程文件有效引用的数据类,以便进行数据类的统计与处理。
在一种可选实施例中,对于初始应用工程文件的编译,可以先对初始源代码进行分词,获得若干个Token对象,接着采用若干个Token对象,生成与初始源代码匹配的抽象语法树,并将抽象语法树转换为类汇编中间代码,然后获取针对类汇编中间代码的目标格式,并将类汇编中间代码转换为与目标格式匹配的机器代码,完成初始源代码的编译,再获取机器代码对应的编译目录,并输出初始应用工程文件对应的编译日志。其中,目标格式可以为目标程序可以执行的数据格式,如可以为可执行的机器语言代码。
其中,抽象语法树包括若干个节点,则对于编译日志的生成,其可以先遍历抽象语法树的各个节点,获取各节点的节点信息,并确定各个节点对应的数据类,然后采用节点信息,生成针对目标数据类的编译日志,并输出编译日志。
可选地,每一个Token中可以记录对应节点的节点信息(例如,数据类的类名称、文件标识、节点类型、位置信息等等),其中,文件标识可以为数据类所属类引用文件的标识,节点类型可以包括Decl、Stmt以及Type等。对于编译日志,其可以在初始源代码转换为抽象语法树之后,对抽象语法树进行遍历,获取每个节点对应的节点信息,并提取节点类型为Decl的节点所对应的目标节点信息,如InterfaceDecl,ObjcMethodDecl等节点信息,然后解析目标节点信息获取数据类的类名称、对应的文件标识以及位置信息灯,通过文件标识可以对数据类所属的类引用文件进行文件定位,通过位置信息可以对数据类在应用工程文件中的位置进行定位,进而通过将目标数据类的类名称、对应的文件标识以及位置信息等进行组合,生成与初始应用工程文件对应的编译日志,实现在初始源代码编译完成后,输出编译日志,以便通过编译日志所记录的节点信息关系实现应用工程文件的全量扫描。
在一种示例中,初始源代码在使用编译器前端Clang编译时的处理流程可以包括:1、预处理:该阶段的工作主要是头文件导入,宏展开/替换,预编译指令处理,以及代码注释的去除等。2、编译:该阶段处理流程较复杂,包括词法分析(Lexical Analysis)将代码转换成一系列的切片(Token),例如标识符、字符串、语句块等等;语法分析(SemanticAnalysis):将Token组成树(Tree)的数据结构,即AST(抽象语法树);静态分析(StaticAnalysis):检查代码错误(例如:参数类型,调用对象等是否定义或者实现)。3、中间代码生成(IR):将抽象语法树AST自顶向下遍历深度优先翻译成LLVM IR.Clang插件的书写利用的正是AST分析。
需要说明的是,从高级语言到低级语言(机器语言)需要一个翻译的过程,所以在词法和语法分析的过程中就是将高级语言(初始源代码)进行切片处理,每一个Token记录着对应节点的节点信息,例如,数据类的类名称、类引用文件的文件标识、节点类型以及位置信息等,其中,类名称可以为数据类的类名,文件标识可以为类引用文件的文件名,位置信息可以为数据类在被引用的类引用文件中的路径等,本发明对此不作限制。
此外,Clang AST有三个重要的基类:ASTFrontendAction,ASTConsumer,以及RecursiveASTVisitor。假设源代码编译时候编译示例对象为CompilerInstance,则其成员变量ExcutionAction可以调用ASTFrontendAction的成员函数,begin(准备遍历),Execute(解析AST),end(结束遍历)。其中,ASTFrontendAction有个虚函数CreateASTConsumer(会被Begin调用),用于返回读取AST的ASTConsumer对象,ASTConsumer有一些可以被重写的override方法用来接收AST解析的回调,HandleTranslationUnit为编译日志所需要的入口,其可以在编译实体抽象语法树完整解析完毕后调用,从而在初始源代码编译完成之后,通过对抽象语法树进行深度遍历,获取所有节点的节点信息,并提取节点类型为Decl的节点所对应的目标节点信息,以便根据目标节点信息中数据类的类名称、类引用文件的文件标识以及位置信息等,建立对应的编译日志。
例如,对于编译日志,其可以包含源代码中的数据类,数据类的引用关系(即类引用文件的文件标识,类引用文件可以用于定义数据类被哪个文件引用),数据类在被引用的类引用文件中定义的路径(即位置信息)等等。
需要说明的是,本发明实施例包括但不限于上述示例,可以理解的是,在本发明实施例的思想指导下,本领域技术人员还可以根据实际需求进行设置,本发明对此不作限制。
步骤103,根据所述节点信息,确定所述目标数据类对应的类引用文件;
当初始应用工程文件编译完成后,可以通过相应的工程编译目录中提取该初始应用工程文件在编译过程中生成的编译日志,接着解析编译日志,根据所记录的节点信息,确定初始应用工程文件中被引用的目标数据类所对的类引用文件。其中,类引用文件可以为应用工程文件中被引用的目标数据类所属的定义文件,即被引用的目标数据类在这些定义文件中被定义,且通过类引用文件可以确定该目标数据类被应用工程文件有效引用,而非无效数据类。
具体的,编译日志中的节点信息可以包括文件标识与位置信息,则可以采用文件标识与位置信息,从初始应用工程文件中提取各节点对应的目标数据类所属的类引用文件,从而获取初始应用工程文件中有效引用的数据类所对应的类引用文件,筛选出初始应用工程文件中真实、有效地类文件。
步骤104,获取所述初始应用工程文件的类导入文件;
对于一个应用工程文件,开发人员在开发过程中,可能会导入很多外部的头文件,在这些头文件中定义了一些数据类,然而在应用工程文件的实际使用过程中,并不会一定会引用到所有的数据类,进而容易导致应用工程文件中存在无效的数据类,需要对这些无效的数据类进行清除。
具体的,可以通过获取初始应用工程文件的头文件,头文件包括类定义,接着通过类定义提取初始应用工程文件的类导入文件。其中,类导入文件可以为开发人员在编写应用工程文件的过程中,所导入的外部的头文件,这些头文件中定义了数据类,即在头文件中声明了某一种数据类,通过获取类导入文件,可以确定应用工程文件所对应的所有导入的数据类,以便与应用工程文件中被引用的有效数据类进行比对,判断哪些是有效的数据类,哪些是无效的数据类。
步骤105,根据所述类引用文件与所述类导入文件对所述初始应用工程文件进行数据类统计,生成与所述初始应用工程文件匹配的数据类详情表单,所述数据类详情表单用于记录所述初始应用工程文件中数据类的引用详情信息。
在本发明实施例中,数据类可以包括应用工程文件中的有效数据类、应用工程文件中的无效数据类以及外部导入的导入数据类。其中,导入数据类可以由有效数据类与无效数据类组成。
在具体实现中,可以将类导入文件与类引用文件进行比对,提取类导入文件中未存在于类引用文件中的第一数据类,以及存在于类引用文件中的第二数据类,接着统计初始应用工程文件中第一数据类的第一引用次数,建立第一数据类与对应的第一引用次数之间的第一对应关系,并统计初始应用工程文件中第二数据类的第二引用次数,建立第二数据类与对应的第二应用次数之间的第二对应关系,然后将第一对应关系与第二对应关系添加至预设表单中,生成与初始应用工程文件对应的数据类详情表单。
可选地,第一数据类可以为无效引用的数据类,即被导入至应用工程文件中但实际并未被有效引用;第二数据类可以为有效引用的数据类,即被导入至应用工程文件中且被有效引用。其中,引用次数可以为数据类在应用工程文件中被引用的次数,若数据类被无效引用的次数较多,则表示应用工程文件中需要调整的位置较多,也是由于无效引用次数过多导致应用工程文件的代码冗余,需要及时对无效数据类进行删除。
具体的,通过将类导入文件中所定义的所有的数据类与类引用文件对应的数据类进行一一比对,对类导入文件中所定义的数据类进行分类,实现有效数据类与无效数据类的筛选,且类引用文件对应的为应用工程文件中所有被引用的数据类,类导入文件对应的为应用工程文件中所有导入的数据类,通过两者的比对结果,可以实现对应用工程文件中数据类的全量检测,减少人为去审核Review代码合理性的检查,有效节约了开发人员的开发、测试时间。
在一种示例中,假设类引用文件中的数据类为引用类,类导入文件中的数据类为导入类,则通过将两者进行比对,可以得到对应的无用类,并记录对应的被引用次数,如下表1所示:
文件名 引用类 导入类 无用类 被引用次数
SourceFile1 ClassA,ClassB… ClassC,ClassB… ClassC 1308
SourceFile2 ClassB,ClassC… ClassC,ClassF… ClassF 456
SourceFile3 ClassC,ClassF… ClassD,ClassF… ClassD 2020
表1
其中,在SourceFile1中引用的数据类包括ClassA、ClassB等,对应的导入数据类包括ClassC、ClassB等,即ClassC并未被有效引用,且其在应用工程文件中的无效引用次数为1308次;对于SourceFile2、3等过程相似,在此不再赘述,从而通过筛选出应用工程文件中无效的数据类,并以数据类详情表单的方式进行呈现,使得开发人员可以根据表单中记录的内容,确定需要进行处理的数据类,例如,可以将初始应用工程文件中无效的第一数据类进行删除,生成目标应用工程文件,进而通过在项目工程进行开发或版本迭代的过程中,在编译期期间生成对应的编译日志,根据编译日志记录的节点信息进行数据类的筛选,实现代码的全面检测得到应用工程文件中所有数据类的引用详情信息,有效减少了人为审核review代码合理性的流程,并且,可以针对项目一次性输入针对数据类的数据类详情表单,使得开发人员可以及时进行调整,减少对日渐庞大的项目编译所耗费的时间,提高项目工程的开发效率。
在本发明实施例中,可以在对应用工程文件进行编译的过程中,获取应用工程文件的初始源代码,并在初始源代码编译完成时,获取应用工程文件对应的编译日志,编译日志包括应用工程文件中被引用的数据类所对应的节点信息,接着根据节点信息,确定应用工程文件的类引用文件,并获取应用工程文件的类导入文件,然后根据两者对应用工程文件进行数据类统计,生成与应用工程文件匹配的数据类详情表单,通过在应用工程文件编译完成后输出对应的编译日志,并利用编译日志中记录的节点信息实现对应用工程文件的全量检测,同时在获取应用工程文件的类导入文件后,可以基于两者进行数据类的统计,使得开发人员可以通过数据类详情表单直观、快速地获取应用工程文件中所有数据类的引用详情信息,进而有利于及时进行工程维护,提高项目开发的效率。
为了使得本领域技术人员更好地理解本发明实施例的技术方案,下面通过一个示例进行说明。
参照图2,示出了本发明实施例中提供的代码处理的流程示意图,在对应用工程文件进行数据类的统计过程中,可以先构建编译前端Clang,并书写其对应的Clang插件,然后将该Clang插件打包为动态库,并在Xcode中挂载动态库,从而通过该Clang插件可以在源代码编译结束生成抽象语法树后,遍历抽象语法树,生成对应的编译日志。
开发人员在构建应用工程文件的过程中,可以对应用工程文件进行编译,从而在应用工程文件编译结束后,可以通过Clang插件扫描数据并写入编译日志(遍历抽象语法树)。接着可以解析编译日志,获取日志中记录的节点信息,根据节点信息,确定初始应用工程文件中被引用的目标数据类所对的类引用文件,并获取对应的类导入文件,然后将类引用文件中的数据类与类导入文件中的数据类进行一一比对,判断类导入文件中的数据类是否有效(是否被记录),并统计有效数据类对应的引用次数,以及无效数据类对应的引用次数,然后生成相应的数据报表数据,从而通过在应用工程文件编译完成后输出对应的编译日志,并利用编译日志中记录的节点信息实现对应用工程文件的全量检测,同时在获取应用工程文件的类导入文件后,可以基于两者进行数据类的统计,使得开发人员可以通过数据类详情表单直观、快速地获取应用工程文件中所有数据类的情况,进而有利于及时进行工程维护,提高项目开发的效率。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。
参照图3,示出了本发明实施例中提供的一种应用工程文件的处理装置的结构框图,具体可以包括如下模块:
初始源代码获取模块301,用于获取初始应用工程文件的初始源代码;
编译日志确定模块302,用于若所述初始源代码编译完成,则确定所述初始应用工程文件对应的编译日志,所述编译日志包括初始应用工程文件中被引用的目标数据类所对应的节点信息;
类引用文件确定模块303,用于根据所述节点信息,确定所述数据类对应的类引用文件;
类导入文件获取模块304,用于获取所述初始应用工程文件的类导入文件;
表单生成模块305,用于根据所述类引用文件与所述类导入文件对所述初始应用工程文件进行数据类统计,生成与所述初始应用工程文件匹配的数据类详情表单,所述数据类详情表单用于记录所述初始应用工程文件中数据类的引用详情信息。
在本发明的一种可选实施例中,所述编译日志确定模块302包括:
Token对象获得子模块,用于对所述初始源代码进行分词,获得若干个Token对象;
抽象语法树生成子模块,用于采用所述若干个Token对象,生成与所述初始源代码匹配的抽象语法树;
代码转换子模块,用于将所述抽象语法树转换为类汇编中间代码;
目标格式获取子模块,用于获取针对所述类汇编中间代码的目标格式;
代码编译子模块,用于将所述类汇编中间代码转换为与所述目标格式匹配的机器代码,完成所述初始源代码的编译;
编译日志输出子模块,用于获取所述机器代码对应的编译目录,并输出所述初始应用工程文件对应的编译日志。
在本发明的一种可选实施例中,所述抽象语法树包括若干个节点,所述编译日志输出子模块具体用于:
遍历所述抽象语法树的各个节点,获取各所述节点的节点信息;
确定各个所述节点对应的目标数据类;
采用所述节点信息,生成针对所述目标数据类的编译日志,并输出所述编译日志;
其中,所述节点信息至少包括类名称、文件标识、节点类型以及位置信息中的一种。
在本发明的一种可选实施例中,所述节点信息包括文件标识与位置信息,所述类引用文件确定模块303具体用于:
采用所述文件标识与位置信息,从所述初始应用工程文件中提取各所述节点对应的目标数据类所属的类引用文件。
在本发明的一种可选实施例中,所述类导入文件获取模块304包括:
头文件获取子模块,用于获取所述初始应用工程文件的头文件,所述头文件包括类定义;
类引导文件提取子模块,用于通过所述类定义提取所述初始应用工程文件的类导入文件。
在本发明的一种可选实施例中,所述表单生成模块305包括:
数据类确定子模块,用于将所述类导入文件与所述类引用文件进行比对,提取所述类导入文件中未存在于所述类引用文件中的第一数据类,以及存在于所述类引用文件中的第二数据类;
第一对应关系生成子模块,用于统计所述初始应用工程文件中所述第一数据类的第一引用次数,建立所述第一数据类与对应的第一引用次数之间的第一对应关系;
第二对应关系生成子模块,用于统计所述初始应用工程文件中所述第二数据类的第二引用次数,建立所述第二数据类与对应的第二引用次数之间的第二对应关系;
表单生成子模块,用于将所述第一对应关系与所述第二对应关系添加至预设表单中,生成与所述初始应用工程文件对应的数据类详情表单。
在本发明的一种可选实施例中,还包括:
应用工程文件生成模块,用于将所述初始应用工程文件中所述第一数据类删除,生成目标应用工程文件。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
另外,本发明实施例还提供一种电子设备,如图4所示,包括处理器401、通信接口402、存储器403和通信总线404,其中,处理器401,通信接口402,存储器403通过通信总线404完成相互间的通信,
存储器403,用于存放计算机程序;
处理器401,用于执行存储器403上所存放的程序时,实现如下步骤:
获取初始应用工程文件的初始源代码;
若所述初始源代码编译完成,则确定所述初始应用工程文件对应的编译日志,所述编译日志包括初始应用工程文件中被引用的目标数据类所对应的节点信息;
根据所述节点信息,确定所述数据类对应的类引用文件;
获取所述初始应用工程文件的类导入文件;
根据所述类引用文件与所述类导入文件对所述初始应用工程文件进行数据类统计,生成与所述初始应用工程文件匹配的数据类详情表单,所述数据类详情表单用于记录所述初始应用工程文件中数据类的引用详情信息。
在本发明的一种可选实施例中,所述若所述初始源代码编译完成,则确定所述初始应用工程文件对应的编译日志,包括:
对所述初始源代码进行分词,获得若干个Token对象;
采用所述若干个Token对象,生成与所述初始源代码匹配的抽象语法树;
将所述抽象语法树转换为类汇编中间代码;
获取针对所述类汇编中间代码的目标格式;
将所述类汇编中间代码转换为与所述目标格式匹配的机器代码,完成所述初始源代码的编译;
获取所述机器代码对应的编译目录,并输出所述初始应用工程文件对应的编译日志。
在本发明的一种可选实施例中,所述抽象语法树包括若干个节点,所述输出所述初始应用工程文件对应的编译日志,包括:
遍历所述抽象语法树的各个节点,获取各所述节点的节点信息;
确定各个所述节点对应的目标数据类;
采用所述节点信息,生成针对所述目标数据类的编译日志,并输出所述编译日志;
其中,所述节点信息至少包括类名称、文件标识、节点类型以及位置信息中的一种。
在本发明的一种可选实施例中,所述节点信息包括文件标识与位置信息,所述根据所述节点信息,确定所述目标数据类对应的类引用文件,包括:
采用所述文件标识与位置信息,从所述初始应用工程文件中提取各所述节点对应的目标数据类所属的类引用文件。
在本发明的一种可选实施例中,所述获取所述初始应用工程文件的类导入文件,包括:
获取所述初始应用工程文件的头文件,所述头文件包括类定义;
通过所述类定义提取所述初始应用工程文件的类导入文件。
在本发明的一种可选实施例中,所述根据所述类引用文件与所述类导入文件对所述初始应用工程文件进行数据类统计,生成与所述初始应用工程文件匹配的数据类详情表单,包括:
将所述类导入文件与所述类引用文件进行比对,提取所述类导入文件中未存在于所述类引用文件中的第一数据类,以及存在于所述类引用文件中的第二数据类;
第一对应关系生成子模块,用于统计所述初始应用工程文件中所述第一数据类的第一引用次数,建立所述第一数据类与对应的第一引用次数之间的第一对应关系;
第二对应关系生成子模块,用于统计所述初始应用工程文件中所述第二数据类的第二引用次数,建立所述第二数据类与对应的第二引用次数之间的第二对应关系;
表单生成子模块,用于将所述第一对应关系与所述第二对应关系添加至预设表单中,生成与所述初始应用工程文件对应的数据类详情表单。
在本发明的一种可选实施例中,还包括:
将所述初始应用工程文件中所述第一数据类删除,生成目标应用工程文件。
上述终端提到的通信总线可以是外设部件互连标准(Peripheral ComponentInterconnect,简称PCI)总线或扩展工业标准结构(Extended Industry StandardArchitecture,简称EISA)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
通信接口用于上述终端与其他设备之间的通信。
存储器可以包括随机存取存储器(Random Access Memory,简称RAM),也可以包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,简称CPU)、网络处理器(Network Processor,简称NP)等;还可以是数字信号处理器(Digital Signal Processing,简称DSP)、专用集成电路(Application SpecificIntegrated Circuit,简称ASIC)、现场可编程门阵列(Field-Programmable Gate Array,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
如图5所示,在本发明提供的又一实施例中,还提供了一种计算机可读存储介质501,该计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述实施例中所述的应用工程文件的处理方法。
在本发明提供的又一实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述实施例中所述的应用工程文件的处理方法。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘Solid State Disk(SSD))等。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

Claims (10)

1.一种应用工程文件的处理方法,其特征在于,包括:
获取初始应用工程文件的初始源代码;
若所述初始源代码编译完成,则确定所述初始应用工程文件对应的编译日志,所述编译日志包括初始应用工程文件中被引用的目标数据类所对应的节点信息;
根据所述节点信息,确定所述数据类对应的类引用文件;
获取所述初始应用工程文件的类导入文件;
根据所述类引用文件与所述类导入文件对所述初始应用工程文件进行数据类统计,生成与所述初始应用工程文件匹配的数据类详情表单,所述数据类详情表单用于记录所述初始应用工程文件中数据类的引用详情信息。
2.根据权利要求1所述的方法,其特征在于,所述若所述初始源代码编译完成,则确定所述初始应用工程文件对应的编译日志,包括:
对所述初始源代码进行分词,获得若干个Token对象;
采用所述若干个Token对象,生成与所述初始源代码匹配的抽象语法树;
将所述抽象语法树转换为类汇编中间代码;
获取针对所述类汇编中间代码的目标格式;
将所述类汇编中间代码转换为与所述目标格式匹配的机器代码,完成所述初始源代码的编译;
获取所述机器代码对应的编译目录,并输出所述初始应用工程文件对应的编译日志。
3.根据权利要求2所述的方法,其特征在于,所述抽象语法树包括若干个节点,所述输出所述初始应用工程文件对应的编译日志,包括:
遍历所述抽象语法树的各个节点,获取各所述节点的节点信息;
确定各个所述节点对应的目标数据类;
采用所述节点信息,生成针对所述目标数据类的编译日志,并输出所述编译日志;
其中,所述节点信息至少包括类名称、文件标识、节点类型以及位置信息中的一种。
4.根据权利要求3所述的方法,其特征在于,所述节点信息包括文件标识与位置信息,所述根据所述节点信息,确定所述目标数据类对应的类引用文件,包括:
采用所述文件标识与位置信息,从所述初始应用工程文件中提取各所述节点对应的目标数据类所属的类引用文件。
5.根据权利要求1所述的方法,其特征在于,所述获取所述初始应用工程文件的类导入文件,包括:
获取所述初始应用工程文件的头文件,所述头文件包括类定义;
通过所述类定义提取所述初始应用工程文件的类导入文件。
6.根据权利要求1所述的方法,其特征在于,所述根据所述类引用文件与所述类导入文件对所述初始应用工程文件进行数据类统计,生成与所述初始应用工程文件匹配的数据类详情表单,包括:
将所述类导入文件与所述类引用文件进行比对,提取所述类导入文件中未存在于所述类引用文件中的第一数据类,以及存在于所述类引用文件中的第二数据类;
统计所述初始应用工程文件中所述第一数据类的第一引用次数,建立所述第一数据类与对应的第一引用次数之间的第一对应关系;
统计所述初始应用工程文件中所述第二数据类的第二引用次数,建立所述第二数据类与对应的第二引用次数之间的第二对应关系;
将所述第一对应关系与所述第二对应关系添加至预设表单中,生成与所述初始应用工程文件对应的数据类详情表单。
7.根据权利要求6所述的方法,其特征在于,还包括:
将所述初始应用工程文件中所述第一数据类删除,生成目标应用工程文件。
8.一种应用工程文件的处理装置,其特征在于,包括:
初始源代码获取模块,用于获取初始应用工程文件的初始源代码;
编译日志确定模块,用于若所述初始源代码编译完成,则确定所述初始应用工程文件对应的编译日志,所述编译日志包括初始应用工程文件中被引用的目标数据类所对应的节点信息;
类引用文件确定模块,用于根据所述节点信息,确定所述数据类对应的类引用文件;
类导入文件获取模块,用于获取所述初始应用工程文件的类导入文件;
表单生成模块,用于根据所述类引用文件与所述类导入文件对所述初始应用工程文件进行数据类统计,生成与所述初始应用工程文件匹配的数据类详情表单,所述数据类详情表单用于记录所述初始应用工程文件中数据类的引用详情信息。
9.一种电子设备,其特征在于,包括处理器、通信接口、存储器和通信总线,其中,所述处理器、所述通信接口以及所述存储器通过所述通信总线完成相互间的通信;
所述存储器,用于存放计算机程序;
所述处理器,用于执行存储器上所存放的程序时,实现如权利要求1-7任一项所述的方法。
10.一个或多个计算机可读介质,其上存储有指令,当由一个或多个处理器执行时,使得所述处理器执行如权利要求1-7任一项所述的方法。
CN202111131921.8A 2021-09-26 2021-09-26 应用工程文件的处理方法、装置、电子设备及可读介质 Pending CN113946339A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111131921.8A CN113946339A (zh) 2021-09-26 2021-09-26 应用工程文件的处理方法、装置、电子设备及可读介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111131921.8A CN113946339A (zh) 2021-09-26 2021-09-26 应用工程文件的处理方法、装置、电子设备及可读介质

Publications (1)

Publication Number Publication Date
CN113946339A true CN113946339A (zh) 2022-01-18

Family

ID=79329507

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111131921.8A Pending CN113946339A (zh) 2021-09-26 2021-09-26 应用工程文件的处理方法、装置、电子设备及可读介质

Country Status (1)

Country Link
CN (1) CN113946339A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114492324A (zh) * 2022-01-28 2022-05-13 中国工商银行股份有限公司 组件数据统计方法及装置

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114492324A (zh) * 2022-01-28 2022-05-13 中国工商银行股份有限公司 组件数据统计方法及装置

Similar Documents

Publication Publication Date Title
CN108614707B (zh) 静态代码检查方法、装置、存储介质和计算机设备
Raghavan et al. Dex: A semantic-graph differencing tool for studying changes in large code bases
US7484205B2 (en) Preprocessor-based source code instrumentation
US8875110B2 (en) Code inspection executing system for performing a code inspection of ABAP source codes
CN110059006B (zh) 代码审计方法及装置
US9122540B2 (en) Transformation of computer programs and eliminating errors
CN105787367A (zh) 一种软件更新的补丁安全性检测方法及系统
CN109857641A (zh) 对程序源文件进行缺陷检测的方法及装置
Nagy et al. SQLInspect: A static analyzer to inspect database usage in Java applications
CN112131120B (zh) 一种源代码缺陷检测方法及装置
CN112131122B (zh) 一种源代码缺陷检测工具误报评估方法及装置
CN117113347A (zh) 一种大规模代码数据特征提取方法及系统
CN112131573A (zh) 安全漏洞的检测方法、装置及存储介质
US10642714B2 (en) Mapping dynamic analysis data to source code
CN113946339A (zh) 应用工程文件的处理方法、装置、电子设备及可读介质
CN111966578A (zh) 一种安卓兼容性缺陷修复效果的自动化评估方法
CN109471637B (zh) 电路图的审查脚本调试方法
Fritzson et al. Metamodelica–a symbolic-numeric modelica language and comparison to julia
CN113641361B (zh) 一种基于Clang的代码隐藏方法及装置
CN115221047A (zh) 测试用例自动生成方法及电子设备
CN114691197A (zh) 代码分析方法、装置、电子设备和存储介质
CN114895914A (zh) 日志输出代码的生成方法、装置、电子设备及存储介质
Zou et al. {D-Helix}: A Generic Decompiler Testing Framework Using Symbolic Differentiation
CN114047923A (zh) 错误代码定位方法、装置、存储介质以及电子设备
Chen et al. Tracking down dynamic feature code changes against Python software evolution

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination