应用程序的静态分析方法、加速方法、装置、设备及介质与流程

未命名 09-07 阅读:108 评论:0


1.本说明书一个或多个实施例涉及计算机软件领域,尤其涉及一种应用程序的静态分析方法、加速方法、装置、电子设备及计算机可读存储介质。


背景技术:

2.自计算机诞生以来,应用程序的性能提升一直是研究的热点和难点问题之一。提升应用程序性能不仅可以提高程序执行效率、提升用户体验,还可以降低程序运行需要的硬件成本。
3.以java应用程序举例,java因其安全、简单、扩展性强、生态丰富等优势被广泛应用于网络和大数据等领域应用的开发,但是由于java是解释型的语言,被编译为字节码的java应用需要运行在java虚拟机上,并且在应用启动和运行过程中java虚拟机需要消耗大量时间进行类解析、方法编译等操作,对java应用的运行性能造成严重影响。当然,其他语言诸如javascript和php等也应用广泛。
4.为提升java的运行性能,业界针对java虚拟机做了很多性能优化,比如提前进行类解析、方法编译以生成加速文件,加速文件在java应用启动时直接由虚拟机加载和使用,实现应用的性能提升。其中,提前生成加速文件的前提是确定java应用程序的代码可达范围,如果java应用程序的代码可达范围确定得不够准确,会影响加速效果。当然,其他语言的应用程序也可以通过确定代码可达范围来提前生成加速文件,也同样存在上述问题。


技术实现要素:

5.有鉴于此,本说明书一个或多个实施例提供一种java应用程序的静态分析方法、加速方法、装置、电子设备及计算机可读存储介质。
6.为实现上述目的,本说明书一个或多个实施例提供技术方案如下:
7.根据本说明书一个或多个实施例的第一方面,提出了一种应用程序的静态分析方法,包括:
8.确定待分析的应用程序的主方法和被反射调用的方法;
9.分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述应用程序进行静态分析,确定所述应用程序中的可达类和/或可达方法。
10.可选的,所述应用程序包括描述了所述应用的入口信息的第一配置文件;
11.所述确定待分析的应用程序的主方法,包括:
12.对所述第一配置文件进行扫描,根据扫描到的所述第一配置文件中的主方法描述符确定所述主方法。
13.可选的,所述应用程序包括java应用程序;所述java应用程序包括描述了java应用程序依赖的第三方库的第二配置文件;
14.所述确定待分析的应用程序的被反射调用的方法,包括:
15.对所述第二配置文件进行扫描,根据扫描到的所述第二配置文件中的第三方库依赖描述符确定所述java应用程序依赖的第三方库,以获取所述第三方库中的被反射调用的方法。
16.可选的,所述分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述应用程序进行静态分析,确定所述应用程序中的可达类和/或可达方法,包括:
17.将所述主方法注册为所述静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述java应用程序进行首轮静态分析,获得所述java应用程序中的可达类和/或可达方法;
18.循环以下过程直到没有获得新的可达类和/或可达方法:
19.检测上一轮静态分析过程获得的可达类和/或可达方法的调用情况;
20.若确定通过普通方式调用了方法,由所述静态分析工具根据所述可达类和/或可达方法对应的类文件中对被普通调用的方法的描述信息进行静态分析;
21.若确定通过反射方式调用了所述第三方库中的至少一个被反射调用的目标方法,将所述被反射调用的目标方法注册为静态分析工具的分析入口,由所述静态分析工具从所述被反射调用的目标方法对应的分析入口出发对所述java应用程序进行静态分析。
22.可选的,所述第三方库中的被反射调用的方法均对应有调用条件;
23.所述检测上一轮静态分析过程获得的可达类和/或可达方法的调用情况,包括:
24.检测上一轮静态分析过程获得的可达类和/或可达方法是否满足所述第三方库中的被反射调用的方法的调用条件;
25.若是,基于满足的调用条件确定所述可达类和/或可达方法通过反射方式调用的所述目标方法;
26.以及,检测上一轮静态分析过程获得的可达类和/或可达方法对应的类文件中是否存在调用标记;
27.若是,确定所述可达类和/或可达方法通过普通方式调用了方法。
28.可选的,所述应用程序包括java应用程序;所述java应用程序的源代码中使用注解标记了java应用程序运行过程中会被反射调用的方法、且所述注解标记被保存在编译后的类文件中;
29.其中,所述java应用程序包含用于保存被反射调用的方法的注解标记的类文件;
30.所述确定待分析的应用程序的被反射调用的方法,包括:
31.对所述用于保存被反射调用的方法的注解标记的类文件进行扫描,获得所述java应用程序的被反射调用的方法。
32.可选的,所述分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述应用程序进行静态分析,确定所述应用程序中的可达类和/或可达方法,包括:
33.分别将所述主方法和所有的被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从各个分析入口出发对所述应用程序进行首轮静态分析,获得所述应用程序中的可达类和/或可达方法;
34.循环以下过程直到没有获得新的可达类和/或可达方法:
35.检测上一轮静态分析过程获得的可达类和/或可达方法对应的类文件中是否存在调用标记;
36.若是,确定所述可达类和/或可达方法通过普通方式调用了方法,由所述静态分析工具根据所述可达类和/或可达方法对应的类文件中对被普通调用的方法的描述信息进行静态分析。
37.根据本说明书一个或多个实施例的第二方面,提出了一种应用程序的加速方法,包括:
38.获取应用程序的可达信息;所述可达信息包括可达类和/或可达方法;所述可达信息基于第一方面任意一项所述的静态分析方法获得;
39.根据所述可达信息对所述应用程序进行编译,得到加速文件;
40.使用所述加速文件运行所述应用程序。
41.可选的,所述应用程序包括java应用程序;
42.所述根据所述可达信息对所述应用程序进行编译,得到加速文件,包括:
43.将所述java应用程序的可达类解析为java虚拟机内部使用的格式,得到第一加速文件。
44.可选的,所述应用程序包括以下至少一种:java应用程序、javascript应用程序、php应用程序;
45.所述根据所述可达信息对所述应用程序进行编译,得到加速文件,包括:
46.将所述应用程序中的可达方法的字节码编译成计算机可直接运行的机器码,得到第二加速文件。
47.根据本公开实施例的第三方面,提供一种应用程序的静态分析装置,包括:
48.方法确定模块,用于确定待分析的应用程序的主方法和被反射调用的方法;
49.静态分析模块,分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述应用程序进行静态分析,确定所述应用程序中的可达类和/或可达方法。
50.根据本公开实施例的第四方面,提供一种电子设备,包括:
51.处理器;
52.用于存储处理器可执行指令的存储器;
53.其中,所述处理器执行所述可执行指令时,用于实现第一方面所述的方法。
54.根据本公开实施例的第五方面,提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述任一项所述方法的步骤。
55.本公开的实施例提供的技术方案可以包括以下有益效果:
56.本公开实施例中,可以先确定待分析的应用程序的主方法和被反射调用的方法,然后分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,这样就可以确保主方法和被反射调用的方法均可以被静态分析工具作为直接调用进行展开分析,提高静态分析得到的可达范围的全面性和准确性。
57.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
58.图1是一示例性实施例提供的一种程序实际运行范围的示意图图。
59.图2是一示例性实施例提供的表1的java源代码的调用示意图。
60.图3是一示例性实施例提供的一种应用程序的静态分析方法的流程示意图。
61.图4是一示例性实施例提供的一种应用程序的加速方法的流程示意图。
62.图5是一示例性实施例提供的一种设备的结构示意图。
63.图6是一示例性实施例提供的一种应用程序的静态分析装置的框图。
具体实施方式
64.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。
65.需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
66.为了方便读者理解,这里先对本说明书实施例提及的相关术语进行说明:
67.机器码:计算机处理器可以直接执行的指令码。
68.java字节码:java应用源码被编译后的中间编码,无法直接在计算机上运行。
69.java虚拟机:简称jvm(java virtual machine),是运行在计算机上、可以将java字节码翻译为机器码进行执行的虚拟机器。
70.java类:类是java这种面向对象的编程语言中对某种对象的定义,在java中也是应用开发的基本组成单元,会被编译为二进制类文件后由java虚拟机加载和解析。
71.java方法:定义在类中、一组处理语句的组合,代表着对象解决问题的步骤;方法最终被编译为字节码保存到二进制类文件中。
72.java注解:源码中对java类、方法等特殊的标记,这些标记信息可以保留至编译后的类文件中。
73.主方法:应用启动执行的入口方法。
74.反射:应用程序使用的一种动态地获取运行信息和进行方法调用的技术。以java为例,java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为java语言的反射机制。当然,其他程序语言诸如javascript、php、python、go等也存在反射机制。
75.cds:全称为class data sharing,类数据共享。是将java类解析为jvm内部使用的格式并保存到文件,到运行的时候由jvm直接加载和使用,减少运行过程中类加载和解析的耗时。
76.aot:全称为ahead of time,预先编译器,是将java方法的字节码提前编译成计算机可直接运行的机器码,减少jvm低效的解释执行和额外的编译对资源的消耗。当然,其他语言(诸如javascript、php等)的方法特可以通过aot进行提前编译。
77.jdk:全称为java development kit,是java开发的工具套件,包含了java的运行时、开发调试工具、java语言的基础库等,也包含了cds和aot加速文件生成工具。
78.静态分析:在不运行程序的情况下对程序进行分析的技术。通过静态分析可以获取程序运行时会使用到的类、被调用的方法等信息。
79.相关技术中,为提升应用程序的运行性能,其中一种方法是提前生成加速文件。但是,提前生成加速文件的前提是确定应用程序的代码可达范围,如果应用程序的代码可达范围确定得不够准确,会影响加速效果。
80.以java应用程序举例,为提升java的运行性能,业界针对java虚拟机做了很多性能优化,比如提前进行类解析、方法编译以生成加速文件,加速文件在java应用启动时直接由虚拟机加载和使用,实现应用的性能提升。其中,提前生成加速文件的前提是确定java应用程序的代码可达范围。如图1所示,java应用程序实际运行的可达范围是整个应用程序包的子集,举个例子,java应用程序包中包括的第三方库,在实际使用过程中可能只使用了部分功能,而其他功能并不会用到。显然,如果java应用程序的代码可达范围确定得不够准确,会影响加速效果。
81.示例性的,相关技术中的一种实现方式是:通过运行java应用程序并记录运行过程中实际加载的类和执行的方法,从而获取程序执行的范围并作为依据生成加速文件。该种实现方式需要预先运行一次java应用程序获取执行范围信息,流程上更为复杂;而且程序单次运行可能无法覆盖全部可达范围,确定的java应用程序的代码可达范围不够准确,从而使加速文件覆盖不完整的情况。举个例子,针对于多个分支的情况,程序单次运行只运行了其中一个分支,没有覆盖全部可达范围。
82.示例性的,相关技术中的另一种实现方式中:通过静态分析工具在不运行程序的情况下对程序进行分析,确定程序的可达范围并作为依据生成加速文件。但是发明人发现,现有的静态分析可以对通过普通方式调用展开分析,但是对于反射调用这种运行时的行为无法展开分析。请参阅图2,图2示出了表1所示的java源代码的调用情况示意图。
83.表1
84.[0085][0086]
可以看出,表1中classb的foo方法中使用静态方法调用的形式调用了classd的foo方法,在将源码编译为java字节码的过程中会生成显式的“invokestatic”调用标记和被调用的方法classd.foo的信息,静态分析工具则可以根据这些信息知道classd.foo被调用并对其进一步展开分析;而classa的foo方法使用反射调用的方式实现对classc的foo方法的调用,即在程序运行的过程中动态地查找classc中方法名为foo的方法并进行调用,静态分析工具对编译后的字节码进行分析的过程中,由于反射调用方式在编译后的字节码中只能知道进行了反射,却无法知道具体被反射调用的方法是哪个,因此被反射调用的方法及其后续调用的classe.foo均无法被静态分析工具分析到,造成可达范围的缺失。
[0087]
针对于相关技术中的问题,本说明书实施例提供了一种应用程序的静态分析方法,所述方法可以由电子设备来执行,电子设备包括但不限于服务器、智能电话/手机、平板计算机、个人数字助理(pda)、膝上计算机、台式计算机、媒体内容播放器、视频游戏站/系
统、虚拟现实系统、增强现实系统、可穿戴式设备(例如,手表、眼镜、手套、头饰、挂件、臂章、腿环、鞋子、马甲)、遥控器、或者任何其他类型的设备。
[0088]
示例性的,所述电子设备集成一计算机程序产品,该电子设备执行该计算机程序产品时实现本说明书实施例提供的应用程序的静态分析方法。
[0089]
请参阅图3,图3示出了一种应用程序的静态分析方法的流程示意图。所述方法包括:
[0090]
在s101中,确定待分析的应用程序的主方法和被反射调用的方法。
[0091]
在s102中,分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述应用程序进行静态分析,确定所述应用程序中的可达类和/或可达方法。
[0092]
本实施例中,可以先对应用程序进行扫描,获得主方法和被反射调用的方法,然后分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,这样就可以确保被反射调用的方法可以被静态分析工具作为直接调用进行展开分析,最终确保静态分析得到的可达范围的全面性和准确性。
[0093]
在一些实施例中,这里对主方法的一种可能的获取过程进行说明:所述应用程序包括描述了所述应用的入口信息的第一配置文件;电子设备可以对所述第一配置文件进行扫描,根据扫描到的所述第一配置文件中的主方法描述符确定所述主方法。
[0094]
以java应用程序举例,请参阅表2,主方法所在的类一般直接从java应用程序的meta-inf/manifest.mf配置文件中读取,该配置文件中的主方法描述符为main-class,main-class对应的com.example.app即主方法所在的类。
[0095]
表2
[0096][0097]
在一些实施例中,所述应用程序包括java应用程序;这里对被反射调用的方法的一种可能的获取过程进行说明:某些社区会提供常用的第三方库使用到的反射配置信息,则只需要扫描java应用程序使用到哪些三方库,即可获取这些第三方库对应的反射配置信息。所述java应用程序包括描述了java应用程序依赖的第三方库的第二配置文件。电子设备可以对所述第二配置文件进行扫描,根据扫描到的所述第二配置文件中的第三方库依赖描述符确定所述java应用程序依赖的第三方库,从而获取所述第三方库中的被反射调用的方法。
[0098]
举个例子,java应用程序包括有配置文件pom.xml,例如请参阅表3,通过配置文件中的dependency、groupid和artifactid等第三方库依赖描述符即可确定java应用程序依赖com.example.thirdparty的lib-1和lib-2两个第三方库。同时graalvm社区提供了常用三方库会使用到的反射配置信息,并且按照groupid和artifactid进行了分类,因此只需要扫描pom.xml配置文件获取到的java应用使用到哪些第三方库,即可从官方配置库中获取这些第三方库的全部反射配置,也即所述java应用程序依赖的第三方库中的被反射调用的方法。
[0099]
表3
[0100][0101]
在一种可能的实现方式中,考虑到java应用程序并不一定会使用到第三方库中的被反射调用的方法,因此,为了提高被反射调用的方法确定的准确性,可以在静态分析过程中根据实际调用情况选择性地将实际被java应用程序反射调用的方法注册为分析入口。
[0102]
静态分析过程是一个迭代进行的过程,每轮分析完成后会新增一些新标记为可达的类和方法,下一轮分析则针对他们的调用继续展开分析,直至不再有新的类和方法被标记为可达,说明全部可达类和方法已经完成标记,则整个java应用程序的静态分析完成。
[0103]
在确定所述java应用程序依赖的第三方库中的被反射调用的方法之后,这里对接下来的静态分析过程进行示例性说明:首先将所述主方法注册为所述静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述java应用程序进行首轮静态分析,获得所述java应用程序中的可达类和/或可达方法;然后循环以下过程直到没有获得新的可达类和/或可达方法:检测上一轮静态分析过程获得的可达类和/或可达方法的调用情况;若确定通过普通方式调用了方法,例如在表1中,可以通过classb的foo方法可以通过“类名.方法名()”的普通方式调用了classd的foo方法,由于通过普通方式调用的方法的相关描述信息已经记录在类文件中,因此可以由所述静态分析工具根据所述可达类和/或可达方法对应的类文件中对被普通调用的方法的描述信息进行静态分析;若确定通过反射方式调用了所述第三方库中的至少一个被反射调用的目标方法,由于类文件中并未记录被反射调用的方法的相关描述信息,因此需要将所述被反射调用的目标方法注册为静态分析工具的分析入口,由所述静态分析工具从所述被反射调用的目标方法对应的分析入口出发对所述java应用程序进行静态分析。本实施例实现根据java应用程序的实际反射调用情况来选择性地将被反射调用的目标方法注册为分析入口,有利于提高静态分析得到的可达范围的全面性。
[0104]
这里对上一轮静态分析过程获得的可达类和/或可达方法的调用情况的检测过程进行示例性说明:
[0105]
所述第三方库中的被反射调用的方法均对应有调用条件。在本轮静态分析过程中,可以检测上一轮静态分析过程获得的可达类和/或可达方法是否满足所述第三方库中的被反射调用的方法的调用条件;若是,基于满足的调用条件确定所述可达类和/或可达方法通过反射方式调用的所述目标方法,可以将其注册为静态分析工具的分析入口,以便由
静态分析工具对其展开分析。
[0106]
而在用过普通方式调用方法时,java应用程序的类文件中会包含显式的调用标记和被普通调用的方法的相关描述信息。任一被普通调用的方法对应有调用标记;调用标记包括但不限于“invokestatic(用于调用静态方法)”、“invokevirtual(用于调用虚方法)”、“invokedynamic(用于动态解析出该调用标记所引用的方法之后,调用该方法)”、以及“invokespecial(用于实例构造方法、私有方法或者父方法)”等。因此,在本轮静态分析过程中,可以检测上一轮静态分析过程获得的可达类和/或可达方法对应的类文件中是否存在调用标记;若是,确定所述可达类和/或可达方法通过普通方式调用了方法,则静态分析工具可以针对于被普通调用的方法继续展开分析。
[0107]
举个例子,假设被反射调用的方法对应的调用条件为调用方可达。请参阅表4,表4示出了两个被反射调用的方法,被反射调用的方法1的调用方是com.example.conditionclass1,被反射调用的方法2的调用方是com.example.conditionclass2,比如在循环过程中,上一轮静态分析过程确定com.example.conditionclass1可达,而com.example.conditionclass2不可达,则在本轮静态分析过程中,com.example.conditionclass1可达所以满足被反射调用的方法1的调用条件,那么将被反射的方法com.example.reflectclass1.foo注册为静态分析工具的分析入口继续进行分析;而com.example.conditionclass2不可达所以不满足被反射调用的方法2的调用条件,则不对com.example.reflectclass2.bar方法进行注册。
[0108]
表4
[0109][0110][0111]
当然,本领域技术人员可以理解的是,在确定所述java应用程序依赖的第三方库中的被反射调用的方法之后,也可以将所述java应用程序依赖的第三方库中的所有被反射调用的方法全部注册为静态分析工具的分析入口,本实施例对此不做任何限制,可依据实际应用场景进行具体选择。
[0112]
在另一些实施例中,所述应用程序包括java应用程序;这里对被反射调用的方法的另一种可能的获取过程进行说明:所述java应用程序的源代码中使用注解标记了java应
用程序运行过程中会被反射调用的方法、且所述注解标记被保存在编译后的类文件中。举个例子,常见的java应用开发框架spring等通常使用注解标记哪些方法在运行时会被反射调用,请参阅表5和表6,方法reflectmethod被注解reflectmethodannotation标记,说明会在运行的过程中被反射调用,并且这种标记会被保存到编译后的类文件中。也就是说,所述java应用程序包含用于保存被反射调用的方法的注解标记的类文件,电子设备可以对所述用于保存被反射调用的方法的注解标记的类文件进行扫描,从而获得所述java应用程序的被反射调用的方法。
[0113]
表5
[0114][0115]
表6
[0116][0117]
考虑到通过扫描用于保存被反射调用的方法的注解标记的类文件的方式获得的被反射调用的方法基本都是可达的,所以可以将其全部注册为静态分析工具的分析入口进行分析。这里对静态分析过程进行示例性说明:可以分别将所述主方法和所有的被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从各个分析入口出发对所述java应用程序进行首轮静态分析,获得所述java应用程序中的可达类和/或可达方法;考虑到除了反射调用方法之外可能还通过普通方式调用了方法,因此可以循环以下过程直到没有获得新的可达类和/或可达方法:检测上一轮静态分析过程获得的可达类和/或可达方法对应的类文件中是否存在静态调用标记;若是,确定所述可达类和/或可达方法通过普通方式调用了方法,由所述静态分析工具根据所述可达类和/或可达方法对应的类文件中对被普通调用的方法的描述信息进行静态分析。本实施例中将获取的java应用程序的被反射调用的方法全部注册为分析入口,使得被反射调用的方法可以被静态分析工具作为直接调用进行展开分析,确保静态分析得到的可达范围的全面性和准确性。
[0118]
在一些实施例中,对于script应用程序、php应用程序、python应用程序等其他程序语言,可以通过扫描源程序代码的方式来确定应用程序中的被反射调用的方法,进而可
以分别将所述主方法和所有的被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从各个分析入口出发对所述应用程序进行首轮静态分析,获得所述应用程序中的可达类和/或可达方法;循环以下过程直到没有获得新的可达类和/或可达方法:检测上一轮静态分析过程获得的可达类和/或可达方法对应的类文件中是否存在调用标记;若是,确定所述可达类和/或可达方法通过普通方式调用了方法,由所述静态分析工具根据所述可达类和/或可达方法对应的类文件中对被普通调用的方法的描述信息进行静态分析。本实施例中将获取的应用程序的被反射调用的方法全部注册为分析入口,使得被反射调用的方法可以被静态分析工具作为直接调用进行展开分析,确保静态分析得到的可达范围的全面性和准确性。
[0119]
在一些实施例中,在静态分析过程之后,可以使用静态分析工具提供的接口从分析结果中导出可达类、可达方法等信息,并保存为预设格式。其中,预设格式包括但不限于json(javascript object notation,js对象简谱)格式、xml(extensible markup language,可扩展标记语言)格式或者txt(text file,文本格式)格式等等。比如请参阅表7,可以保存为json格式以便后续使用;其中,classname为可达的类,invokedmethods为可达的方法。
[0120]
表7
[0121][0122]
在一些实施例中,请参阅图4,本说明书实施例还提供了一种应用程序的加速方法,所述方法可以由电子设备来执行,所述方法包括:
[0123]
在s201中,获取应用程序的可达信息;所述可达信息包括可达类和/或可达方法;所述可达信息基于上述任意一项所述的静态分析方法获得。
[0124]
在s202中,根据所述可达信息对所述应用程序进行编译,得到加速文件。
[0125]
在s203中,使用所述加速文件运行所述应用程序。
[0126]
本实施例中,可以提前处理可达信息得到加速文件,并且由于可达信息是基于上述静态分析方法对应用程序的主方法和被反射调用的方法均进行分析获得,静态分析结果更为全面且准确,从而有利于提升加速文件的加速效果,实现应用的性能提升。
[0127]
在一些实施例中,所述应用程序包括java应用程序;电子设备可以获取java应用程序中的可达类;其中,所述java应用程序中的可达类基于上述任意一项的静态分析方法获得。然后将所述可达类解析为java虚拟机内部使用的格式,得到第一加速文件。最后使用所述第一加速文件运行所述java应用程序。
[0128]
在一些实施例中,所述应用程序包括java应用程序;电子设备可以获取java应用程序中的可达方法;其中,所述java应用程序中的可达方法基于上述任意一项的静态分析方法获得。然后将所述可达方法的字节码编译成计算机可直接运行的机器码,得到第二加速文件。最后使用所述第二加速文件运行所述java应用程序。
[0129]
实现可以提前解析可达类和/或编译可达方法得到加速文件,并且由于可达类和/或可达方法是基于上述静态分析方法对java应用程序的主方法和被反射调用的方法均进行分析获得,静态分析结果更为全面且准确,从而有利于提升加速文件的加速效果,加速文件在java应用程序启动时直接由java虚拟机加载和使用,实现应用的性能提升。
[0130]
示例性的,以静态分析得到的可达类为依据,使用jdk中的cds生成工具将类文件按照jvm使用的格式解析并保存为第一加速文件;以静态分析得到的可达方法为依据,使用jdk的aot生成工具将可达方法的字节码编译为机器码并保存为第二加速文件。在启动java应用程序时添加选项使能第一加速文件和/或第二加速文件,实现java应用性能提升特别是启动性能提升。
[0131]
在一些实施例中,所述应用程序包括javascript应用程序和php应用程序;电子设备可以获取应用程序中的可达方法;然后将所述可达方法的字节码编译成计算机可直接运行的机器码,得到第二加速文件,最后使用所述第二加速文件运行所述应用程序。示例性的,可以使用aot生成工具将可达方法的字节码编译为机器码并保存为第二加速文件。在启动应用程序时添加选项使能第二加速文件,实现javascript应用程序或php应用程序性能提升特别是启动性能提升。
[0132]
可以理解的是,除了上述提到的程序语言之外,其他支持反射的动态语言诸如python语言、go语言也适用于本方案。
[0133]
以上实施方式中的各种技术特征可以任意进行组合,只要特征之间的组合不存在冲突或矛盾,但是限于篇幅,未进行一一描述,因此上述实施方式中的各种技术特征的任意进行组合也属于本说明书公开的范围。
[0134]
图5是一示例性实施例提供的一种设备的示意结构图。请参考图5,在硬件层面,该设备包括处理器502、内部总线504、网络接口506、内存508以及非易失性存储器510,当然还可能包括其他业务所需要的硬件。本说明书一个或多个实施例可以基于软件方式来实现,比如由处理器502从非易失性存储器510中读取对应的计算机程序到内存508中然后运行。当然,除了软件实现方式之外,本说明书一个或多个实施例并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
[0135]
示例性的,请参考图6,应用程序的静态分析装置可以应用于如图5所示的设备中,以实现本说明书的技术方案。其中,该静态分析装置可以包括:
[0136]
方法确定模块601,用于确定待分析的应用程序的主方法和被反射调用的方法。
[0137]
静态分析模块602,用于分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述java应用程序进行静态分析,确定所述应用程序中的可达类和/或可达方法。
[0138]
在一些实施例中,所述应用程序包括描述了所述应用的入口信息的第一配置文件;所述方法确定模块601具体用于对所述第一配置文件进行扫描,根据扫描到的所述第一
配置文件中的主方法描述符确定所述主方法。
[0139]
在一些实施例中,所述应用程序包括java应用程序;所述java应用程序包括描述了java应用程序依赖的第三方库的第二配置文件;所述方法确定模块601具体用于对所述第二配置文件进行扫描,根据扫描到的所述第二配置文件中的第三方库依赖描述符确定所述java应用程序依赖的第三方库,以获取所述第三方库中的被反射调用的方法。
[0140]
在一些实施例中,所述静态分析模块602具体用于将所述主方法注册为所述静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述java应用程序进行首轮静态分析,获得所述java应用程序中的可达类和/或可达方法;循环以下过程直到没有获得新的可达类和/或可达方法:检测上一轮静态分析过程获得的可达类和/或可达方法的调用情况;若确定通过普通方式调用了方法,由所述静态分析工具根据所述可达类和/或可达方法对应的类文件中对被普通调用的方法的描述信息进行静态分析;若确定通过反射方式调用了所述第三方库中的至少一个被反射调用的目标方法,将所述被反射调用的目标方法注册为静态分析工具的分析入口,由所述静态分析工具从所述被反射调用的目标方法对应的分析入口出发对所述java应用程序进行静态分析。
[0141]
在一些实施例中,所述第三方库中的被反射调用的方法均对应有调用条件。所述静态分析模块602具体用于检测上一轮静态分析过程获得的可达类和/或可达方法是否满足所述第三方库中的被反射调用的方法的调用条件;若是,基于满足的调用条件确定所述可达类和/或可达方法通过反射方式调用的所述目标方法;以及,检测上一轮静态分析过程获得的可达类和/或可达方法对应的类文件中是否存在调用标记;若是,确定所述可达类和/或可达方法通过普通方式调用了方法。
[0142]
在一些实施例中,所述应用程序包括java应用程序;所述java应用程序的源代码中使用注解标记了java应用程序运行过程中会被反射调用的方法、且所述注解标记被保存在编译后的类文件中。其中,所述java应用程序包含用于保存被反射调用的方法的注解标记的类文件。所述方法确定模块601具体用于对所述用于保存被反射调用的方法的注解标记的类文件进行扫描,获得所述java应用程序的被反射调用的方法。
[0143]
在一些实施例中,所述静态分析模块602具体用于分别将所述主方法和所有的被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从各个分析入口出发对所述应用程序进行首轮静态分析,获得所述应用程序中的可达类和/或可达方法;循环以下过程直到没有获得新的可达类和/或可达方法:检测上一轮静态分析过程获得的可达类和/或可达方法对应的类文件中是否存在调用标记;若是,确定所述可达类和/或可达方法通过普通方式调用了方法,由所述静态分析工具根据所述可达类和/或可达方法对应的类文件中对被普通调用的方法的描述信息进行静态分析。
[0144]
上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
[0145]
示例性的,应用程序的加速装置可以应用于如图5所示的设备中,以实现本说明书的技术方案。其中,该加速装置可以包括:
[0146]
获取模块,用于获取应用程序的可达信息;所述可达信息包括可达类和/或可达方法;所述可达信息基于上述任意一项所述的静态分析方法获得。
[0147]
加速文件生成模块,用于根据所述可达信息对所述应用程序进行编译,得到加速
文件。
[0148]
加速模块,用于使用所述加速文件运行所述应用程序。
[0149]
在一些实施例中,所述应用程序包括java应用程序;所述加速文件生成模块具体用于将所述java应用程序的可达类解析为java虚拟机内部使用的格式,得到第一加速文件。
[0150]
在一些实施例中,所述应用程序包括以下至少一种:java应用程序、javascript应用程序、php应用程序;所述加速文件生成模块具体用于将所述应用程序中的可达方法的字节码编译成计算机可直接运行的机器码,得到第二加速文件。
[0151]
上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
[0152]
在一些实施例中,本说明书实施例还提供了一种电子设备,包括:处理器;用于存储处理器可执行指令的存储器;其中,所述处理器通过运行所述可执行指令以实现上述中任一项所述的方法。
[0153]
在一些实施例中,本说明书实施例还提供了一种计算机可读存储介质,其上存储有计算机指令,该指令被处理器执行时实现如上述任一项所述方法的步骤。
[0154]
需要说明的是,本说明书所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,并且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准,并提供有相应的操作入口,供用户选择授权或者拒绝。
[0155]
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
[0156]
在一个典型的配置中,计算机包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
[0157]
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
[0158]
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0159]
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0160]
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0161]
在本说明书一个或多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
[0162]
应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
[0163]
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。

技术特征:
1.一种应用程序的静态分析方法,其特征在于,包括:确定待分析的应用程序的主方法和被反射调用的方法;分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述应用程序进行静态分析,确定所述应用程序中的可达类和/或可达方法。2.根据权利要求1所述的方法,其特征在于,所述应用程序包括描述了所述应用的入口信息的第一配置文件;所述确定待分析的应用程序的主方法,包括:对所述第一配置文件进行扫描,根据扫描到的所述第一配置文件中的主方法描述符确定所述主方法。3.根据权利要求1所述的方法,其特征在于,所述应用程序包括java应用程序;所述java应用程序包括描述了java应用程序依赖的第三方库的第二配置文件;所述确定待分析的应用程序的被反射调用的方法,包括:对所述第二配置文件进行扫描,根据扫描到的所述第二配置文件中的第三方库依赖描述符确定所述java应用程序依赖的第三方库,以获取所述第三方库中的被反射调用的方法。4.根据权利要求3所述的方法,其特征在于,所述分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述应用程序进行静态分析,确定所述应用程序中的可达类和/或可达方法,包括:将所述主方法注册为所述静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述java应用程序进行首轮静态分析,获得所述java应用程序中的可达类和/或可达方法;循环以下过程直到没有获得新的可达类和/或可达方法:检测上一轮静态分析过程获得的可达类和/或可达方法的调用情况;若确定通过普通方式调用了方法,由所述静态分析工具根据所述可达类和/或可达方法对应的类文件中对被普通调用的方法的描述信息进行静态分析;若确定通过反射方式调用了所述第三方库中的至少一个被反射调用的目标方法,将所述被反射调用的目标方法注册为静态分析工具的分析入口,由所述静态分析工具从所述被反射调用的目标方法对应的分析入口出发对所述java应用程序进行静态分析。5.根据权利要求4所述的方法,其特征在于,所述第三方库中的被反射调用的方法均对应有调用条件;所述检测上一轮静态分析过程获得的可达类和/或可达方法的调用情况,包括:检测上一轮静态分析过程获得的可达类和/或可达方法是否满足所述第三方库中的被反射调用的方法的调用条件;若是,基于满足的调用条件确定所述可达类和/或可达方法通过反射方式调用的所述目标方法;以及,检测上一轮静态分析过程获得的可达类和/或可达方法对应的类文件中是否存在调用标记;若是,确定所述可达类和/或可达方法通过普通方式调用了方法。
6.根据权利要求1所述的方法,其特征在于,所述应用程序包括java应用程序;所述java应用程序的源代码中使用注解标记了java应用程序运行过程中会被反射调用的方法、且所述注解标记被保存在编译后的类文件中;其中,所述java应用程序包含用于保存被反射调用的方法的注解标记的类文件;所述确定待分析的应用程序的被反射调用的方法,包括:对所述用于保存被反射调用的方法的注解标记的类文件进行扫描,获得所述java应用程序的被反射调用的方法。7.根据权利要求1或6所述的方法,其特征在于,所述分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述应用程序进行静态分析,确定所述应用程序中的可达类和/或可达方法,包括:分别将所述主方法和所有的被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从各个分析入口出发对所述应用程序进行首轮静态分析,获得所述应用程序中的可达类和/或可达方法;循环以下过程直到没有获得新的可达类和/或可达方法:检测上一轮静态分析过程获得的可达类和/或可达方法对应的类文件中是否存在调用标记;若是,确定所述可达类和/或可达方法通过普通方式调用了方法,由所述静态分析工具根据所述可达类和/或可达方法对应的类文件中对被普通调用的方法的描述信息进行静态分析。8.一种应用程序的加速方法,其特征在于,包括:获取应用程序的可达信息;所述可达信息包括可达类和/或可达方法;所述可达信息基于权利要求1至7任意一项所述的静态分析方法获得;根据所述可达信息对所述应用程序进行编译,得到加速文件;使用所述加速文件运行所述应用程序。9.根据权利要求8所述的方法,其特征在于,所述应用程序包括java应用程序;所述根据所述可达信息对所述应用程序进行编译,得到加速文件,包括:将所述java应用程序的可达类解析为java虚拟机内部使用的格式,得到第一加速文件。10.根据权利要求8所述的方法,其特征在于,所述应用程序包括以下至少一种:java应用程序、javascript应用程序、php应用程序;所述根据所述可达信息对所述应用程序进行编译,得到加速文件,包括:将所述应用程序中的可达方法的字节码编译成计算机可直接运行的机器码,得到第二加速文件。11.一种应用程序的静态分析装置,其特征在于,包括:方法确定模块,用于确定待分析的应用程序的主方法和被反射调用的方法;静态分析模块,分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述应用程序进行静态分析,确定所述应用程序中的可达类和/或可达方法。12.一种电子设备,其特征在于,包括:
处理器;用于存储处理器可执行指令的存储器;其中,所述处理器通过运行所述可执行指令以实现如权利要求1至10中任一项所述的方法。13.一种计算机可读存储介质,其上存储有计算机指令,其特征在于,该指令被处理器执行时实现如权利要求1至10中任一项所述方法的步骤。

技术总结
本说明书一个或多个实施例提供一种应用程序的静态分析方法、加速方法、装置、电子设备及计算机可读存储介质。所述静态分析方法包括:确定待分析的应用程序的主方法和被反射调用的方法;分别将所述主方法和所述被反射调用的方法注册为静态分析工具的分析入口,由所述静态分析工具从所述分析入口出发对所述应用程序进行静态分析,确定所述应用程序中的可达类和/或可达方法。提高静态分析得到的可达范围的全面性和准确性。围的全面性和准确性。围的全面性和准确性。


技术研发人员:张权 林子熠 郑孝林 陈刚 蒯微 郁磊 李三红
受保护的技术使用者:阿里云计算有限公司
技术研发日:2023.06.05
技术公布日:2023/9/5
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐