CN112667223A - 组件配置表的生成方法、装置、电子设备及存储介质 - Google Patents

组件配置表的生成方法、装置、电子设备及存储介质 Download PDF

Info

Publication number
CN112667223A
CN112667223A CN202110009515.8A CN202110009515A CN112667223A CN 112667223 A CN112667223 A CN 112667223A CN 202110009515 A CN202110009515 A CN 202110009515A CN 112667223 A CN112667223 A CN 112667223A
Authority
CN
China
Prior art keywords
configuration table
component configuration
source code
target
node
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
CN202110009515.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.)
Beijing Urban Network Neighbor Information Technology Co Ltd
Original Assignee
Beijing Urban Network Neighbor Information Technology 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 Beijing Urban Network Neighbor Information Technology Co Ltd filed Critical Beijing Urban Network Neighbor Information Technology Co Ltd
Priority to CN202110009515.8A priority Critical patent/CN112667223A/zh
Publication of CN112667223A publication Critical patent/CN112667223A/zh
Pending legal-status Critical Current

Links

Images

Abstract

本发明提供了一种组件配置表的生成方法、装置、电子设备及存储介质。所述方法,包括:获取目标项目中的各个源码文件,并生成每个源码文件的抽象语法树;针对任一源码文件的抽象语法树,基于白名单对抽象语法树中的节点进行过滤,得到目标节点;其中,白名单中包括至少一种类型标识;获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的组件配置表;其中,所述组件配置表中包含每个目标节点对应的键值对,所述键值表征所述目标节点的身份标识与实例化函数之间的对应关系,所述实例化函数在执行时通过调用所述目标节点的构造函数生成与所述目标节点对应的组件。从而取得了提高组件配置表的正确性以及生成效率的有益效果。

Description

组件配置表的生成方法、装置、电子设备及存储介质
技术领域
本发明涉及计算机技术领域,尤其涉及一种组件配置表的生成方法、装置、电子设备及存储介质。
背景技术
动态更新作为一种新的软件更新方式,可以减少触达用户的成本,使得软件内容的变化更简单,可以满足部分内容快速投放市场的需求。对软件开发者来说,保证安全的情况下,适当的动态更新对产品迭代有好处。为了开发动态更新能力,需要组件配置表的支持,才能满足动态解析时的查询组件配置的需求。
目前的组件配置表生成方式基本停留在手工编写阶段,即参考项目中的组件配置,逐一书写每一个组件配置对应的注册表。但是手工书写过程需要暴力穷举所以组件,工作量非常大且效率比较低,而且可能会出现笔误,影响组件配置表的准确性。
发明内容
本发明实施例提供一种组件配置表的生成方法、装置、电子设备及存储介质,以解决现有手动书写组件配置的方式工作量大且效率低,而且可能会出现笔误,影响组件配置表准确性的问题。
为了解决上述技术问题,本发明是这样实现的:
第一方面,本发明实施例提供了一种组件配置表的生成方法,包括:
获取目标项目中的各个源码文件,并生成每个所述源码文件的抽象语法树;
针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点;其中,所述白名单中包括至少一种类型标识;
获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的组件配置表;其中,所述组件配置表中包含每个目标节点对应的键值对,所述键值表征所述目标节点的身份标识与实例化函数之间的对应关系,所述实例化函数在执行时通过调用所述目标节点的构造函数生成与所述目标节点对应的组件。
可选地,所述针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点的步骤,包括:
针对任一所述源码文件的抽象语法树,基于白名单中包含的类型标识,获取所述抽象语法树中所述类型标识下的节点,作为所述源码文件的第一节点,所述类型标识包括对象类型的类型标识、枚举类型的类型标识中的至少一种;
过滤掉所述第一节点中的无效节点,得到所述源码文件的目标节点;
其中,所述无效节点包括私有节点、抽象节点、隐式生成的节点、为测试使用的节点中的至少一种。
可选地,所述目标项目包括Flutter框架、基于Flutter框架创建的flutter工程中的至少一种。
可选地,在所述目标项目为Flutter框架的情况下,所述获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的组件配置表的步骤,包括:
针对所述Flutter框架中的任一源码文件,获取所述源码文件下各个目标节点的构造函数,并基于所述构造函数生成所述源码文件的组件配置表;
根据每个所述源码文件隶属的数据包,对所述源码文件的组件配置表进行合并处理,将隶属于同一数据包的源码文件的组件配置表合并为一个组件配置表,得到所述Flutter框架的组件配置表。
可选地,所述获取所述源码文件下各个目标节点的构造函数,并基于所述构造函数生成所述源码文件的组件配置表的步骤,包括:
获取所述目标节点的构造函数,并基于所述源码文件中包含的每个目标节点的所述构造函数生成所述源码文件的初始组件配置表;
获取与所述初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述源码文件最终的组件配置表;
其中,所述编辑操作包括添加引用的成员声明、添加导包引用、参数类型转换中的至少一种。
可选地,在目标项目为基于Flutter框架创建的flutter工程的情况下,所述获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的组件配置表的步骤,包括:
获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的初始组件配置表;
获取与所述初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述目标项目最终的组件配置表;
其中,所述编辑操作包括添加引用的成员声明、添加导包引用、参数类型转换中的至少一种。
可选地,所述方法还包括:
根据所述目标项目下的每个组件配置表生成所述目标项目的配置清单,用于运行时检索并引用所述目标项目下的每个组件配置表。
可选地,所述针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点的步骤,包括:
针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点,并确认每个所述目标节点的组件属性,所述组件属性包括组件类型属性、非组件类型属性中的至少一种;
所述根据所述目标项目下的每个组件配置表生成所述目标项目的配置清单,用于运行时检索并引用所述目标项目下的每个组件配置表的步骤,包括:
根据所述目标项目下的每个组件配置表,以及每个所述目标节点的组件属性,生成所述目标项目的配置清单。
可选地,所述获取每个所述目标节点的构造函数的步骤,包括:
针对每个目标节点,从所述目标节点的节点信息中获取所述目标节点的第一构造函数;
过滤掉所述第一构造函数中的无效函数,得到所述目标节点的构造函数;
其中,所述无效函数包括私有函数、为测试使用的函数中的至少一种。
第二方面,本发明实施例提供了一种组件配置表的生成装置,包括:
AST生成模块,用于获取目标项目中的各个源码文件,并生成每个所述源码文件的抽象语法树;
节点过滤模块,用于针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点;其中,所述白名单中包括至少一种类型标识;
配置表生成模块,用于获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的组件配置表;其中,所述组件配置表中包含每个目标节点对应的键值对,所述键值表征所述目标节点的身份标识与实例化函数之间的对应关系,所述实例化函数在执行时通过调用所述目标节点的构造函数生成与所述目标节点对应的组件。
可选地,所述节点过滤模块,包括:
第一节点过滤子模块,用于针对任一所述源码文件的抽象语法树,基于白名单中包含的类型标识,获取所述抽象语法树中所述类型标识下的节点,作为所述源码文件的第一节点,所述类型标识包括对象类型的类型标识、枚举类型的类型标识中的至少一种;
第二节点过滤子模块,用于过滤掉所述第一节点中的无效节点,得到所述源码文件的目标节点;
其中,所述无效节点包括私有节点、抽象节点、隐式生成的节点、为测试使用的节点中的至少一种。
可选地,所述目标项目包括Flutter框架、基于Flutter框架创建的flutter工程中的至少一种。
可选地,在所述目标项目为Flutter框架的情况下,所述配置表生成模块,包括:
第一配置表生成子模块,用于针对所述Flutter框架中的任一源码文件,获取所述源码文件下各个目标节点的构造函数,并基于所述构造函数生成所述源码文件的组件配置表;
第二配置表生成子模块,用于根据每个所述源码文件隶属的数据包,对所述源码文件的组件配置表进行合并处理,将隶属于同一数据包的源码文件的组件配置表合并为一个组件配置表,得到所述Flutter框架的组件配置表。
可选地,所述第一配置表生成子模块,具体用于:
获取所述目标节点的构造函数,并基于所述源码文件中包含的每个目标节点的所述构造函数生成所述源码文件的初始组件配置表;
获取与所述初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述源码文件最终的组件配置表;
其中,所述编辑操作包括添加引用的成员声明、添加导包引用、参数类型转换中的至少一种。
可选地,在目标项目为基于Flutter框架创建的flutter工程的情况下,所述配置表生成模块,包括:
第三配置表生成子模块,用于获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的初始组件配置表;
第四配置表生成子模块,用于获取与所述初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述目标项目最终的组件配置表;
其中,所述编辑操作包括添加引用的成员声明、添加导包引用、参数类型转换中的至少一种。
可选地,所述装置还包括:
配置清单生成模块,用于根据所述目标项目下的每个组件配置表生成所述目标项目的配置清单,用于运行时检索并引用所述目标项目下的每个组件配置表。
可选地,所述节点过滤模块,具体用于:
针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点,并确认每个所述目标节点的组件属性,所述组件属性包括组件类型属性、非组件类型属性中的至少一种;
所述配置清单生成模块,具体用于:
根据所述目标项目下的每个组件配置表,以及每个所述目标节点的组件属性,生成所述目标项目的配置清单。
可选地,所述配置表生成模块,包括:
第一构造函数获取子模块,用于针对每个目标节点,从所述目标节点的节点信息中获取所述目标节点的第一构造函数;
第二构造函数获取子模块,用于过滤掉所述第一构造函数中的无效函数,得到所述目标节点的构造函数;
其中,所述无效函数包括私有函数、为测试使用的函数中的至少一种。
第三方面,本发明实施例另外提供了一种电子设备,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如第一方面所述的组件配置表的生成方法的步骤。
第四方面,本发明实施例另外提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面所述的组件配置表的生成方法的步骤。
在本发明实施例中,通过脚本自动生成组件配置表,速度快,而且稳定,可以有效避免手动生成过程中写错的问题,提高组件配置表的正确性以及生成效率。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例中的一种组件配置表的生成方法的步骤流程图;
图2是本发明实施例中的另一种组件配置表的生成方法的步骤流程图;
图3是本发明实施例中的一种通过脚本自动生成组件配置表的流程示意图;
图4是本发明实施例中的一种组件配置表的生成装置的结构示意图;
图5是本发明实施例中的另一种组件配置表的生成装置的结构示意图;
图6是本发明实施例中的一种电子设备的硬件结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参照图1,示出了本发明实施例中一种组件配置表的生成方法的步骤流程图。
步骤110,获取目标项目中的各个源码文件,并生成每个所述源码文件的抽象语法树;
步骤120,针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点;其中,所述白名单中包括至少一种类型标识;
步骤130,获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的组件配置表;其中,所述组件配置表中包含每个目标节点对应的键值对,所述键值表征所述目标节点的身份标识与实例化函数之间的对应关系,所述实例化函数在执行时通过调用所述目标节点的构造函数生成与所述目标节点对应的组件。
本发明实施例中,通过脚本自动生成组件配置表,而且通过修改源码位置,可以为不同版本的Flutter及用户代码生成组件配置表。例如,在获取用户输入的用于指定目标项目所在目录、版本等信息的参数的情况下,则可以通过获取与该目标项目的版本适配的脚本解析用户输入的参数,以获取目标项目所在目录,进而可以执行本发明实施例中的各个步骤以获取该目标项目的组件配置表。
具体地,可以在启动脚本后,通过执行脚本解析表征源码路径的各种入参,得到所有可以定位组件源代码的位置参数,从而锁定目标项目的源码目录位置,然后通过analyzer等任何可用方式,生成目标项目中每个源码文件的抽象语法树对象。
其中,组件配置表是一种注册表,可以通过字符串标识,查询到对应组件配置(例如Widget)。在实际应用中,组件和组件配置是两个不同维度,通过组件配置,可以生成最后的组件,开发中大多数只需要编写组件配置进行页面开发。抽象语法树(Abstract SyntaxTree,AST)是对代码的一种抽象表达,可以认为抽象语法树是源代码的一种表示形式。
在实际应用中,源码文件中可能包括很多内容,需要从中过滤出需要生成组件配置表的源代码。那么则可以根据实际需求情况,定义出一个白名单,其中包含有需要生成组件配置表的节点的类型标识。那么针对任一源码文件的抽象语法树,可以基于白名单对该抽象语法树中的节点进行过滤,得到白名单中包含的各个类型标识下的节点即为该源码文件中生成组件配置表需要参考的目标节点。例如,可以依次遍历抽象语法树中的每个节点,判断每个节点的类型的类型标识是否在白名单内,如果在则认为相应节点在目标节点。当然,在本发明实施例中,也可以设置包含至少一个类型标识的黑名单,将抽象语法树中类型与黑名单中类型标识一致的节点过滤掉,得到最终的目标节点,对此本发明实施例不加以限定。
其中,白名单中具体包含的类型标识可以根据需求进行自定义设置,对此本发明实施例不加以限定。例如,可以设置白名单中包含对象类型(也即Class类型)、枚举类型等的类型标识,而且在实际应用中,可能存在多种对象类型的类型标识,以及枚举类型的类型标识,例如Widget、StatefullWidget、StatelessWidget,等等。
白名单的作用可以有效过滤出目标节点。过滤时会基于对象(也即节点)的类型,通过递归父类型等方式依次遍历每个节点进行判定,对此本发明实施例不加以限定。
在实际应用中,实例化一个对象,需要该对象的构造函数,有多个构造函数的,需要全部采集出来,因此对于每个目标节点,则可以获取其构造函数,进而可以基于每个目标节点的构造函数生成该目标项目的组件配置表。
其中,可以通过任何可用方式获取目标节点的构造函数,对此本发明实施例不加以限定。例如,可以遍历每一个目标节点的节点信息中的每一个函数节点,得到其中的构造函数节点,得到该目标节点的构造函数,而且为了方便后续构建组件配置表,还可以进一步基于构造函数生成与之对应的构造函数对象,以方便调用构造函数对象执行相应的实例化操作。
如上述,作为组件配置表的注册表中,可以通过字符串标识,查询到对应组件配置。因此为了构建组件配置表,可以设置在组件配置表中包含每个目标节点对应的键值对,所述键值表征所述目标节点的身份标识与实例化函数之间的对应关系,所述实例化函数在执行时通过调用所述目标节点的构造函数生成与相应目标节点对应的组件。那么此时,通过组件配置表中的目标节点的身份标识,则可以调用与之对应的实例化函数,而实例化函数在实例化过程中则可以调用相应目标节点的构造函数(也可以为上述的构造函数对象等),从而生成与相应目标节点对应的组件。
其中,在组件配置表中,目标节点的身份标识可以通过任何可用形式表征,例如目标节点的身份标识可以为目标节点的名称、哈希值,等等。而且,在本发明实施例中,可以通过任何可用方式生成可以调用每个构造函数的实例化函数,对此本发明实施例不加以限定。
例如,可以根据需求预先设置实例化函数的基础模板,进而将调用构造函数是所需的构造函数相关信息(例如构造函数名称、构造函数路径等)填入实例化函数的基础模板中的相应位置,从而得到可以调用相应构造函数的实例化函数,等等。
在本发明实施例中,根据上一步采集到的目标节点,去生成组件配置表的代码时,组件配置表可以简单认为是一个哈希表,通过表签名,可以获取构造最优组件的构造函数,执行构造函数即可实例化一个组件。
参照图2,在本发明实施例中,所述步骤120进一步可以包括:
步骤121,针对任一所述源码文件的抽象语法树,基于白名单中包含的类型标识,获取所述抽象语法树中所述类型标识下的节点,作为所述源码文件的第一节点,所述类型标识包括对象类型的类型标识、枚举类型的类型标识中的至少一种;
步骤122,过滤掉所述第一节点中的无效节点,得到所述源码文件的目标节点;
其中,所述无效节点包括私有节点、抽象节点、隐式生成的节点、为测试使用的节点中的至少一种。
在实际应用中,对于专门为测试使用的函数、编译器自动生成的私有函数、抽象节点、隐式生成的节点等在正常开发中是无法调用的,因此不必生成上述函数的配置表,这样可以减少无效配置数量。
具体地,针对任一所述源码文件的抽象语法树,基于白名单中包含的类型标识,获取所述抽象语法树中所述类型标识下的节点,作为所述源码文件的第一节点,所述类型标识可以包括但不限于对象类型的类型标识、枚举类型的类型标识;并且在基于白名单过滤后,还可以进一步筛选出第一节点中的无效节点并过滤掉,保留下来的即为相应源码文件的目标节点。
其中,所述无效节点可以包括但不限于私有函数节点(也即表征编译器自动生成的私有函数等私有函数的节点)、为测试使用的函数节点(也即表征测试使用的函数的节点)、抽象节点、隐式生成的节点中的至少一种,也即最终得到的目标节点为共用节点。
当然,在本发明实施例中,也可以直接以第一节点作为目标节点,而不执行上述步骤122进行进一步过滤,对此本发明实施例不加以限定。
在本发明实施例中,除了限定类型的白名单,还可以设置有节点白名单,用于限定一个目标节点,需要关注其中的哪些内容。如上述,要实例化一个对象,只需要他的构造函数,有多个构造函数的,需要全部采集出来,白名单可以用于定义需要的函数/节点类型(如构造函数,常量成员等)。过滤完后,还需要剔除其中的部分无效节点,比如那些专门为测试使用的函数的节点,编译器自动生成的私有函数的节点,等等。
可选地,在本发明实施例中,所述目标项目包括Flutter框架自身、基于Flutter框架创建的flutter工程中的至少一种。
Flutter是一种跨平台的软件开发框架,利用Flutter开发的程序可以运行在Android,iOS以及浏览器中。一般而言,一个电脑上只安装一个版本的Flutter框架,也即Fluttersdk(Software Development Kit,软件开发工具包),然后可以根据这个安装的版本,创建多个Flutter工程。Analyzer是Flutter提供的一个生成源码抽象语法树的工具。在本发明实施例中,可以预先设置用于执行上述步骤的脚本,通过执行脚本即可以实现上述步骤,自动获取目标项目的组件配置表。而且,为了适配不同版本的Flutter,还可以预设适配不同版本Flutter的脚本,从而可以根据目标项目的Flutter版本选择与之适配的脚本执行本发明实施例中的各个步骤,对此本发明实施例不加以限定。
可选地,在本发明实施例中,在所述目标项目为Flutter框架的情况下,所述步骤130进一步可以包括:
步骤A131,针对所述Flutter框架中的任一源码文件,获取所述源码文件下各个目标节点的构造函数,并基于所述构造函数生成所述源码文件的组件配置表;
步骤A132,根据每个所述源码文件隶属的数据包,对所述源码文件的组件配置表进行合并处理,将隶属于同一数据包的源码文件的组件配置表合并为一个组件配置表,得到所述Flutter框架的组件配置表。
对于Flutter框架而言,由于其中包含的数据量较大,且可能存在多个不同的数据包,且每个数据包中又包含很多源码文件,如果针对Flutter框架进行设置一个组件配置表,容易导致组件配置表中包含的数据量较多,影响检索效率。
因此,在本发明实施例中,可以先以资源文件为单位,生成组件配置表,进而针对各个组件配置表进行收敛处理。具体地,可以针对所述Flutter框架中的任一源码文件,获取所述源码文件下各个目标节点的构造函数,并基于所述构造函数生成所述源码文件的组件配置表。
为每个源码文件生成完组件配置表后,由于每个源码文件对应一个组件配置表,在目标项目包含的源码文件数量较多的情况下,相应地组件配置表的数量也较多,碎片很严重,每个组件配置表的内容分布也不均匀。因此,在本发明实施例中,进一步可以根据每个所述源码文件隶属的数据包,对每个源码文件的组件配置表进行合并处理,将隶属于同一数据包的源码文件的组件配置表合并为一个组件配置表。例如,可以根据每个源码文件隶属的数据包,做了一次收敛,将同一个数据包的组件配置表代码,合并在一个文件内,即收敛文件,完成后还可以清除合并之前的碎片文件。通过收敛动作,可以将上千的文件最终整理为了不到10个的文件,开发查阅更加方便。
其中,源码文件是否隶属于同一数据包,可以通过源码文件在Flutter框架中的目录结构确认得到,对此本发明实施例不加以限定。
当然,在本发明实施例中,在进行组件配置表的合并时,也可以进行参照每个组件配置表是否隶属于同一数据包,或者各个组件配置表自身之间的关系等对组件配置表的合并处理,对此本发明实施例不加以限定。例如将连续产生的N个组件配置表合并为一个组件配置表,N为大于1的正整数。
可选地,在本发明实施例中,步骤A131进一步可以包括:
步骤1311,获取所述目标节点的构造函数,并基于所述源码文件中包含的每个目标节点的所述构造函数生成所述源码文件的初始组件配置表;
步骤1312,获取与所述初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述源码文件最终的组件配置表;
其中,所述编辑操作包括添加引用的成员声明、添加导包引用、参数类型转换中的至少一种。
在构造组件过程中组件差异很大,有的需要增加参数,而且有些参数需要外部传入,也有默认参数,且默认参数可能是私有属性,外部无法引用。当生成实例化函数时,由于上下文不同,得不到对应的引用,这会导致代码编译失败,进而影响组件的生成。
为了解决上述问题,可以通过多次分析观察,维护一份源码转换器清单。在生成源码文件的组件配置表时,可以认为基于所述源码文件中包含的每个目标节点的所述构造函数生成的注册表为相应源码文件的初始组件配置表,进而可以获取与每个初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述源码文件最终的组件配置表。其中的编辑操作可以包括但不限于添加引用的成员声明、添加导包引用、参数类型转换中的至少一种。
例如,通过源码转换器可以将初始组件配置表中缺失引用的组件配置过滤出来,进而再针对该组件配置,注入缺失的引用(例如上述的添加引用的成员声明、添加导包引用等)即可。最后返回修改后的注册表,即为相应源码文件最终的组件配置表。
其中,在设置源码转换器清单时,可以同时设置每个源码转换器适配的初始组件配置表所需满足的条件,例如不同源码转换器适配于不同路径下的源码文件的初始组件配置表,在目标项目为Flutter项目的情况下,还可以设置不同源码转换器适配于不同版本的Flutter,等等。而且在不同的源码转换器中设置有可以执行不同编辑操作的代码逻辑,对此本发明实施例不加以限定。
当然,在本发明实施例中,也可以在合并处理后执行上述的步骤1312,对合并后的组件配置表中的实例化函数进行编辑操作,获取所述目标项目最终的组件配置表,对此本发明实施例不加以限定。
可选地,在本发明实施例中,在所述目标项目为基于Flutter框架创建的flutter工程的情况下,所述步骤130进一步可以包括:
步骤B131,获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的初始组件配置表;
步骤B132,获取与所述初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述目标项目最终的组件配置表;
其中,所述编辑操作包括添加引用的成员声明、添加导包引用、参数类型转换中的至少一种。
一般而言,基于Flutter框架创建的flutter工程可以理解为一个数据包,相对于Flutter框架自身,flutter工程的数据量较少,因此可以生成一个注册表作为组件配置表。此时则无需上述的合并收敛过程,可以直接获取flutter工程中每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的初始组件配置表,进而可以获取与该初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述目标项目最终的组件配置表。具体可以参照上述的内容,在此不加以赘述。
参照图2,在本发明实施例中,所述方法还包括:
步骤140,根据所述目标项目下的每个组件配置表生成所述目标项目的配置清单,用于运行时检索并引用所述目标项目下的每个组件配置表。
此外,还可以根据目标项目下的各个组件配置表,生成一个配置清单,可以用于运行时检索并引用所述目标项目下的每个组件配置表。在配置清单中可以包括相应目标项目下的组件配置表总量,每个组件配置表的文件标识、文件路径、引用方式等基础信息,还可以包括每个组件配置表中包含的组件数量、组件的身份标识等基础信息。配置清单相当于一个相应目标项目下的各个组件配置表的概述,通过配置清单可以了解目标项目中包含的各个组件配置表的大致信息,例如有哪些组件是支持的,哪些是组件,哪些是常量引用等。以方便在后续运行目标项目时检索并引用每个所述组件配置表,甚至是检索并引用任一组件配置表中的任一实例化函数,以构建组件,等等。
可选地,在本发明实施例中,所述步骤120进一步可以包括:针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点,并确认每个所述目标节点的组件属性,所述组件属性包括组件类型属性、非组件类型属性中的至少一种;
所述步骤140进一步可以包括:根据所述目标项目下的每个组件配置表,以及每个所述目标节点的组件属性,生成所述目标项目的配置清单。
在实际应用中,在构建组件配置表时,为了过滤目标节点,需要依次遍历抽象语法树中的每个节点,而且目标节点中可能包括在页面中能够可见的组件类型的节点,以及不会在页面中展示的与配置信息(例如常量等)相关的非组件类型的节点,例如上述的Widget,StatefullWidget,StatelessWidget等都是组件类型的类型标识。而且在生成所述目标项目的配置清单时,为了方便相关人员通过配置清单了解每个组件配置表可以构建的组件是组件类型还是非组件类型,需要预先确定每个目标节点的组件属性,也即其是组件类型还是非组件类型。一般是组件类型引用非组件类型。
而且,为了提高效率,可以在过滤目标节点的同时确认每个目标节点的组件属性。具体地,可以在针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点的同时,并确认每个所述目标节点的组件属性。从而可以也可以提高过滤速度,同时减少了递归多次到父节点的时间。
具体地,过滤目标节点时会基于节点的类型,所以可以通过添加多个细粒度的类型标识到白名单,此时如果采用递归父类型依次遍历每个节点进行判定,因为通过一次递归到父节点的遍历即可以实现目标节点的过滤,以及目标节点的组件属性的判定,有效减少了递归多次到父节点的时间,可以有效提高整体效率。
例如,假设白名单中包含多个细粒度的类型标识,标识1、标识2和标识3,且标识1和标识2同时又为组件类型的标识,标识3为非组件类型的标识,那么在遍历抽象语法树中的每个节点时,如果某一节点的类型满足白名单中任一类型标识则认定其为目标节点,同时还可以进一步获取该目标节点的类型标识,假设其类型标识为上述的标识1或标识2,则认定该目标节点为组件类型,假设其类型标识为上述的标识3,则认定该目标节点为非组件类型。
此外,在上述基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点的过程也可以参照上述的步骤121-122,对此本发明实施例不加以限定。
那么在生成目标项目的配置清单时,则可以根据所述目标项目下的每个组件配置表,以及每个所述目标节点的组件属性,生成所述目标项目的配置清单。此时通过配置清单则可以快速了解每个其中对应的每个目标节点的组件属性,例如其中哪些是在页面中可见的组件类型,哪些是常量引用等等。
可选地,在本发明实施例中,获取每个所述目标节点的构造函数的过程,具体可以包括:
S1,针对每个目标节点,从所述目标节点的节点信息中获取所述目标节点的第一构造函数;
S2,过滤掉所述第一构造函数中的无效函数,得到所述目标节点的构造函数;
其中,所述无效函数包括私有函数、为测试使用的函数中的至少一种。
对于每个目标节点,也即目标对象,目标对象上面有成员、函数、构造函数、父类等节点信息,在生成组件配置表时,需要其中的构造函数。因此针对每个目标节点,可以从目标节点的节点信息中获取其构造函数,作为该目标节点的第一构造函数。但是相应地,需要剔除其中部分无效的构造函数,比如那些专门为测试使用的函数,编译器自动生成的私有函数、非公开函数等。也即,可以进一步过滤掉所述第一构造函数中的无效函数,得到所述目标节点最终的构造函数。其中,所述无效函数包括私有函数、为测试使用的函数中的至少一种。
具体地,可以通过任何可用方式过滤掉第一构造函数中的无效函数,对此本发明实施例不加以限定。例如,可以通过方法签名校验确认表征构造函数的节点的签名是否位于预设的包含可用签名的白名单中,如果是则确认其为有效函数,如果否则为无效函数。
如图3所示为本发明实施例中的一种通过脚本自动生成Flutter框架的组件配置表的流程示意图。在获取用户输入的参数之后,通过预设的自动化脚本可以解析参数以定位Flutter的安装目录,也即待处理的Flutter SDK所处的位置,进而定位其中每个源码文件所在位置,并且生成每个源码文件的抽象语法树。针对每个抽象语法树,可以依次遍历其中每个节点,判断节点的节点类型是否位于预设的包含类型标识的白名单中,如果是则以其为目标节点并执行后续的操作,否则可以忽略该节点。针对每个目标节点,而可以进一步解析其函数节点(也即表征函数的节点),并进行方法签名校验,以过滤掉无效的函数节点,获取有效的表征构造函数的节点,例如可以另外设置一包含有效签名的白名单,进而基于该白名单进行方法签名校验,如果签名在该白名单中则可以继续执行后续操作,否则可以忽略该节点,也即认为该节点为无效函数节点并过滤掉,进而针对下一目标节点继续校验。对于通过方法签名校验的每个函数节点而言,则可以生成其构造函数对象,以准备后续生成组件配置表。
在生成组件配置表时,可以预先为每个源码文件创建注册表,进而针对该源码文件中的每个目标节点,基于其构造函数对象生成其实例化函数并结合每个目标节点的身份标识存入注册表中,而且为了避免代码编译失败,还可以通过源码转换器修改实例化函数(添加引用的成员声明、添加导包引用、参数类型转换等),例如将注册表中每个实例化函数缺失引用的组件配置过滤出来,并且再对该配置,注入缺失的引用等。最后返回修改后的注册表。还可以还可以在最终得到的注册表中添加所需的文件头信息。
此外,还可以针对每个注册表形式的组件配置表进行合并,例如将相同功能模块下的组件配置表合并为一个组件配置表,具体地可以在获取得到每个组件配置表之后,即可以判断该组件配置表与之前获取的组件配置表是否属于同一模块,如果是则可以将其合并到之前获取的同模块文件中,如果该组件配置表属于新的模块,那么则可以针对该模块创建新的聚合文件,并且将该组件配置表合并至该新建的聚合文件中,实现同模块的组件配置表合并至同一文件中,作为一个组件配置表。
另外,还可以基于同一项目下的各个组件配置表生成配置清单,并将持久化到本地磁盘,可以用于运行时检索,有哪些组件是支持的,哪些是组件,哪些是常量引用等。而且也可以将上述的组件配置表持久化到本地磁盘,对此本发明实施例不加以限定。
参照图4,示出了本发明实施例中一种组件配置表的生成装置的结构示意图。
本发明实施例的组件配置表的生成装置包括:AST生成模块210、节点过滤模块220和配置表生成模块230。
下面分别详细介绍各模块的功能以及各模块之间的交互关系。
AST生成模块210,用于获取目标项目中的各个源码文件,并生成每个所述源码文件的抽象语法树;
节点过滤模块220,用于针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点;其中,所述白名单中包括至少一种类型标识;
配置表生成模块230,用于获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的组件配置表;其中,所述组件配置表中包含每个目标节点对应的键值对,所述键值表征所述目标节点的身份标识与实例化函数之间的对应关系,所述实例化函数在执行时通过调用所述目标节点的构造函数生成与所述目标节点对应的组件。
参照图5,在本发明实施例中,所述节点过滤模块220,可以包括:
第一节点过滤子模块221,用于针对任一所述源码文件的抽象语法树,基于白名单中包含的类型标识,获取所述抽象语法树中所述类型标识下的节点,作为所述源码文件的第一节点,所述类型标识包括对象类型的类型标识、枚举类型的类型标识中的至少一种;
第二节点过滤子模块222,用于过滤掉所述第一节点中的无效节点,得到所述源码文件的目标节点;
其中,所述无效节点包括私有节点、抽象节点、隐式生成的节点、为测试使用的节点中的至少一种。
可选地,所述目标项目包括Flutter框架、基于Flutter框架创建的flutter工程中的至少一种。
可选地,在所述目标项目为Flutter框架的情况下,所述配置表生成模块230,包括:
第一配置表生成子模块,用于针对所述Flutter框架中的任一源码文件,获取所述源码文件下各个目标节点的构造函数,并基于所述构造函数生成所述源码文件的组件配置表;
第二配置表生成子模块,用于根据每个所述源码文件隶属的数据包,对所述源码文件的组件配置表进行合并处理,将隶属于同一数据包的源码文件的组件配置表合并为一个组件配置表,得到所述Flutter框架的组件配置表。
可选地,所述第一配置表生成子模块,具体用于:
获取所述目标节点的构造函数,并基于所述源码文件中包含的每个目标节点的所述构造函数生成所述源码文件的初始组件配置表;
获取与所述初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述源码文件最终的组件配置表;
其中,所述编辑操作包括添加引用的成员声明、添加导包引用、参数类型转换中的至少一种。
可选地,在目标项目为基于Flutter框架创建的flutter工程的情况下,所述配置表生成模块230,包括:
第三配置表生成子模块,用于获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的初始组件配置表;
第四配置表生成子模块,用于获取与所述初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述目标项目最终的组件配置表;
其中,所述编辑操作包括添加引用的成员声明、添加导包引用、参数类型转换中的至少一种。
参照图5,在本发明实施例中,所述装置还可以包括:
配置清单生成模块240,用于根据所述目标项目下的每个组件配置表生成所述目标项目的配置清单,用于运行时检索并引用所述目标项目下的每个组件配置表。
可选地,所述节点过滤模块220,具体用于:
针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点,并确认每个所述目标节点的组件属性,所述组件属性包括组件类型属性、非组件类型属性中的至少一种;
所述配置清单生成模块220,具体用于:
根据所述目标项目下的每个组件配置表,以及每个所述目标节点的组件属性,生成所述目标项目的配置清单。
可选地,所述配置表生成模块230,包括:
第一构造函数获取子模块,用于针对每个目标节点,从所述目标节点的节点信息中获取所述目标节点的第一构造函数;
第二构造函数获取子模块,用于过滤掉所述第一构造函数中的无效函数,得到所述目标节点的构造函数;
其中,所述无效函数包括私有函数、为测试使用的函数中的至少一种。
本发明实施例提供的组件配置表的生成装置能够实现图1至图2的方法实施例中实现的各个过程,为避免重复,这里不再赘述。
优选的,本发明实施例还提供了一种电子设备,包括:处理器,存储器,存储在存储器上并可在处理器上运行的计算机程序,该计算机程序被处理器执行时实现上述组件配置表的生成方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
本发明实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述组件配置表的生成方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。其中,所述的计算机可读存储介质,如只读存储器(Read-Only Memory,简称ROM)、随机存取存储器(RandomAccess Memory,简称RAM)、磁碟或者光盘等。
图6为实现本发明各个实施例的一种电子设备的硬件结构示意图。
该电子设备500包括但不限于:射频单元501、网络模块502、音频输出单元503、输入单元504、传感器505、显示单元506、用户输入单元507、接口单元508、存储器509、处理器510、以及电源511等部件。本领域技术人员可以理解,图6中示出的电子设备结构并不构成对电子设备的限定,电子设备可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。在本发明实施例中,电子设备包括但不限于手机、平板电脑、笔记本电脑、掌上电脑、车载终端、可穿戴设备、以及计步器等。
应理解的是,本发明实施例中,射频单元501可用于收发信息或通话过程中,信号的接收和发送,具体的,将来自基站的下行数据接收后,给处理器510处理;另外,将上行的数据发送给基站。通常,射频单元501包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器、双工器等。此外,射频单元501还可以通过无线通信系统与网络和其他设备通信。
电子设备通过网络模块502为用户提供了无线的宽带互联网访问,如帮助用户收发电子邮件、浏览网页和访问流式媒体等。
音频输出单元503可以将射频单元501或网络模块502接收的或者在存储器509中存储的音频数据转换成音频信号并且输出为声音。而且,音频输出单元503还可以提供与电子设备500执行的特定功能相关的音频输出(例如,呼叫信号接收声音、消息接收声音等等)。音频输出单元503包括扬声器、蜂鸣器以及受话器等。
输入单元504用于接收音频或视频信号。输入单元504可以包括图形处理器(Graphics Processing Unit,GPU)5041和麦克风5042,图形处理器5041对在视频捕获模式或图像捕获模式中由图像捕获装置(如摄像头)获得的静态图片或视频的图像数据进行处理。处理后的图像帧可以显示在显示单元506上。经图形处理器5041处理后的图像帧可以存储在存储器509(或其它存储介质)中或者经由射频单元501或网络模块502进行发送。麦克风5042可以接收声音,并且能够将这样的声音处理为音频数据。处理后的音频数据可以在电话通话模式的情况下转换为可经由射频单元501发送到移动通信基站的格式输出。
电子设备500还包括至少一种传感器505,比如光传感器、运动传感器以及其他传感器。具体地,光传感器包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板5061的亮度,接近传感器可在电子设备500移动到耳边时,关闭显示面板5061和/或背光。作为运动传感器的一种,加速计传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别电子设备姿态(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;传感器505还可以包括指纹传感器、压力传感器、虹膜传感器、分子传感器、陀螺仪、气压计、湿度计、温度计、红外线传感器等,在此不再赘述。
显示单元506用于显示由用户输入的信息或提供给用户的信息。显示单元506可包括显示面板5061,可以采用液晶显示器(Liquid Crystal Display,LCD)、有机发光二极管(Organic Light-Emitting Diode,OLED)等形式来配置显示面板5061。
用户输入单元507可用于接收输入的数字或字符信息,以及产生与电子设备的用户设置以及功能控制有关的键信号输入。具体地,用户输入单元507包括触控面板5071以及其他输入设备5072。触控面板5071,也称为触摸屏,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触控面板5071上或在触控面板5071附近的操作)。触控面板5071可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器510,接收处理器510发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触控面板5071。除了触控面板5071,用户输入单元507还可以包括其他输入设备5072。具体地,其他输入设备5072可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆,在此不再赘述。
进一步的,触控面板5071可覆盖在显示面板5061上,当触控面板5071检测到在其上或附近的触摸操作后,传送给处理器510以确定触摸事件的类型,随后处理器510根据触摸事件的类型在显示面板5061上提供相应的视觉输出。虽然在图6中,触控面板5071与显示面板5061是作为两个独立的部件来实现电子设备的输入和输出功能,但是在某些实施例中,可以将触控面板5071与显示面板5061集成而实现电子设备的输入和输出功能,具体此处不做限定。
接口单元508为外部装置与电子设备500连接的接口。例如,外部装置可以包括有线或无线头戴式耳机端口、外部电源(或电池充电器)端口、有线或无线数据端口、存储卡端口、用于连接具有识别模块的装置的端口、音频输入/输出(I/O)端口、视频I/O端口、耳机端口等等。接口单元508可以用于接收来自外部装置的输入(例如,数据信息、电力等等)并且将接收到的输入传输到电子设备500内的一个或多个元件或者可以用于在电子设备500和外部装置之间传输数据。
存储器509可用于存储软件程序以及各种数据。存储器509可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器509可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
处理器510是电子设备的控制中心,利用各种接口和线路连接整个电子设备的各个部分,通过运行或执行存储在存储器509内的软件程序和/或模块,以及调用存储在存储器509内的数据,执行电子设备的各种功能和处理数据,从而对电子设备进行整体监控。处理器510可包括一个或多个处理单元;优选的,处理器510可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器510中。
电子设备500还可以包括给各个部件供电的电源511(比如电池),优选的,电源511可以通过电源管理系统与处理器510逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。
另外,电子设备500包括一些未示出的功能模块,在此不再赘述。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,均属于本发明的保护之内。
本领域普通技术人员可以意识到,结合本发明实施例中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

Claims (12)

1.一种组件配置表的生成方法,其特征在于,包括:
获取目标项目中的各个源码文件,并生成每个所述源码文件的抽象语法树;
针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点;其中,所述白名单中包括至少一种类型标识;
获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的组件配置表;其中,所述组件配置表中包含每个目标节点对应的键值对,所述键值表征所述目标节点的身份标识与实例化函数之间的对应关系,所述实例化函数在执行时通过调用所述目标节点的构造函数生成与所述目标节点对应的组件。
2.根据权利要求1所述的方法,其特征在于,所述针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点的步骤,包括:
针对任一所述源码文件的抽象语法树,基于白名单中包含的类型标识,获取所述抽象语法树中所述类型标识下的节点,作为所述源码文件的第一节点,所述类型标识包括对象类型的类型标识、枚举类型的类型标识中的至少一种;
过滤掉所述第一节点中的无效节点,得到所述源码文件的目标节点;
其中,所述无效节点包括私有节点、抽象节点、隐式生成的节点、为测试使用的节点中的至少一种。
3.根据权利要求1或2所述的方法,其特征在于,所述目标项目包括Flutter框架、基于Flutter框架创建的flutter工程中的至少一种。
4.根据权利要求3所述的方法,其特征在于,在所述目标项目为Flutter框架的情况下,所述获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的组件配置表的步骤,包括:
针对所述Flutter框架中的任一源码文件,获取所述源码文件下各个目标节点的构造函数,并基于所述构造函数生成所述源码文件的组件配置表;
根据每个所述源码文件隶属的数据包,对所述源码文件的组件配置表进行合并处理,将隶属于同一数据包的源码文件的组件配置表合并为一个组件配置表,得到所述Flutter框架的组件配置表。
5.根据权利要求4所述的方法,其特征在于,所述获取所述源码文件下各个目标节点的构造函数,并基于所述构造函数生成所述源码文件的组件配置表的步骤,包括:
获取所述目标节点的构造函数,并基于所述源码文件中包含的每个目标节点的所述构造函数生成所述源码文件的初始组件配置表;
获取与所述初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述源码文件最终的组件配置表;
其中,所述编辑操作包括添加引用的成员声明、添加导包引用、参数类型转换中的至少一种。
6.根据权利要求3所述的方法,其特征在于,在目标项目为基于Flutter框架创建的flutter工程的情况下,所述获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的组件配置表的步骤,包括:
获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的初始组件配置表;
获取与所述初始组件配置表适配的源码转换器,对所述初始组件配置表中的实例化函数进行编辑操作,获取所述目标项目最终的组件配置表;
其中,所述编辑操作包括添加引用的成员声明、添加导包引用、参数类型转换中的至少一种。
7.根据权利要求1所述的方法,其特征在于,所述方法还包括:
根据所述目标项目下的每个组件配置表生成所述目标项目的配置清单,用于运行时检索并引用所述目标项目下的每个组件配置表。
8.根据权利要求7所述的方法,其特征在于,所述针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点的步骤,包括:
针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点,并确认每个所述目标节点的组件属性,所述组件属性包括组件类型属性、非组件类型属性中的至少一种;
所述根据所述目标项目下的每个组件配置表生成所述目标项目的配置清单,用于运行时检索并引用所述目标项目下的每个组件配置表的步骤,包括:
根据所述目标项目下的每个组件配置表,以及每个所述目标节点的组件属性,生成所述目标项目的配置清单。
9.根据权利要求1所述的方法,其特征在于,所述获取每个所述目标节点的构造函数的步骤,包括:
针对每个目标节点,从所述目标节点的节点信息中获取所述目标节点的第一构造函数;
过滤掉所述第一构造函数中的无效函数,得到所述目标节点的构造函数;
其中,所述无效函数包括私有函数、为测试使用的函数中的至少一种。
10.一种组件配置表的生成装置,其特征在于,包括:
AST生成模块,用于获取目标项目中的各个源码文件,并生成每个所述源码文件的抽象语法树;
节点过滤模块,用于针对任一所述源码文件的抽象语法树,基于白名单对所述抽象语法树中的节点进行过滤,得到目标节点;其中,所述白名单中包括至少一种类型标识;
配置表生成模块,用于获取每个所述目标节点的构造函数,并基于所述构造函数生成所述目标项目的组件配置表;其中,所述组件配置表中包含每个目标节点对应的键值对,所述键值表征所述目标节点的身份标识与实例化函数之间的对应关系,所述实例化函数在执行时通过调用所述目标节点的构造函数生成与所述目标节点对应的组件。
11.一种电子设备,其特征在于,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至9中任一项所述的组件配置表的生成方法的步骤。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至9中任一项所述的组件配置表的生成方法的步骤。
CN202110009515.8A 2021-01-05 2021-01-05 组件配置表的生成方法、装置、电子设备及存储介质 Pending CN112667223A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110009515.8A CN112667223A (zh) 2021-01-05 2021-01-05 组件配置表的生成方法、装置、电子设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110009515.8A CN112667223A (zh) 2021-01-05 2021-01-05 组件配置表的生成方法、装置、电子设备及存储介质

Publications (1)

Publication Number Publication Date
CN112667223A true CN112667223A (zh) 2021-04-16

Family

ID=75413150

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110009515.8A Pending CN112667223A (zh) 2021-01-05 2021-01-05 组件配置表的生成方法、装置、电子设备及存储介质

Country Status (1)

Country Link
CN (1) CN112667223A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114398102A (zh) * 2022-01-18 2022-04-26 杭州米络星科技(集团)有限公司 一种应用程序包生成方法、装置、编译服务器及计算机可读存储介质
CN114936031A (zh) * 2022-07-22 2022-08-23 浙江中控技术股份有限公司 组件的调用方法及电子设备

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114398102A (zh) * 2022-01-18 2022-04-26 杭州米络星科技(集团)有限公司 一种应用程序包生成方法、装置、编译服务器及计算机可读存储介质
CN114398102B (zh) * 2022-01-18 2023-08-08 杭州米络星科技(集团)有限公司 一种应用程序包生成方法、装置、编译服务器及计算机可读存储介质
CN114936031A (zh) * 2022-07-22 2022-08-23 浙江中控技术股份有限公司 组件的调用方法及电子设备

Similar Documents

Publication Publication Date Title
CN106970790B (zh) 一种应用程序创建的方法、相关设备及系统
CN107038112B (zh) 应用界面的调试方法及装置
CN109656827B (zh) 一种控件树生成方法和终端设备
CN110716715A (zh) 一种应用程序开发方法、装置、设备及介质
WO2018077041A1 (zh) 应用运行的方法及装置
CN111752826A (zh) 一种接口测试方法、装置、电子设备及存储介质
CN111723002A (zh) 一种代码调试方法、装置、电子设备及存储介质
CN108228230A (zh) Ufs固件的升级方法、终端及计算机可读存储介质
CN107666406B (zh) 智能卡片显示方法及装置
CN111078556B (zh) 应用测试方法及装置
CN112667223A (zh) 组件配置表的生成方法、装置、电子设备及存储介质
CN112000566B (zh) 测试用例的生成方法及装置
CN112650498B (zh) 静态库集成方法、装置、电子设备及存储介质
CN113407169A (zh) 一种软件开发方法及装置
CN106919458B (zh) Hook目标内核函数的方法及装置
CN110198324B (zh) 数据监控方法、装置、浏览器及终端
CN109145598B (zh) 脚本文件的病毒检测方法、装置、终端及存储介质
CN112769777B (zh) 基于云平台的数据整合方法、装置及电子设备
CN110032394B (zh) 一种无源码文件的分析方法、装置和存储介质
WO2014180134A1 (en) Method for analyzing spyware and computer system
CN113076201B (zh) 一种任务指令的互斥校验方法及电子设备
CN112230980A (zh) 一种依赖关系检测方法、装置、电子设备及存储介质
CN112035180A (zh) 一种自动化实例加载方法、装置、电子设备及存储介质
CN114490307A (zh) 一种单元测试方法、装置及存储介质
CN111897726A (zh) 异常定位方法、装置、存储介质及移动终端

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