CN115328506A - 应用程序包生成方法、加载方法、装置、介质及设备 - Google Patents
应用程序包生成方法、加载方法、装置、介质及设备 Download PDFInfo
- Publication number
- CN115328506A CN115328506A CN202211068075.4A CN202211068075A CN115328506A CN 115328506 A CN115328506 A CN 115328506A CN 202211068075 A CN202211068075 A CN 202211068075A CN 115328506 A CN115328506 A CN 115328506A
- Authority
- CN
- China
- Prior art keywords
- function
- target
- sub
- packet
- application program
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/61—Installation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
Abstract
本公开涉及一种应用程序包生成方法、加载方法、装置、介质及设备,其中应用程序包生成方法包括:获取目标应用程序运行时对应的目标函数的目标函数标识;根据所述目标函数标识从所述目标应用程序对应的编译文件中提取所述目标函数;针对所述编译文件中除所述目标函数之外的候选函数,生成所述候选函数对应的调用函数,其中,所述调用函数用于对所述候选函数进行调用;根据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包,其中,所述第一分包用于运行所述目标应用程序。
Description
技术领域
本公开涉及计算机技术领域,具体地,涉及一种应用程序包生成方法、加载方法、装置、介质及设备。
背景技术
随着计算机技术的发展,目前小游戏的应用程序逐渐增多。相关技术中,由于Unity游戏引擎编译出来的应用程序的资源文件较大,使得此类应用程序在文件下载和加载过程中都会比较耗时。
发明内容
提供该发明内容部分以便以简要的形式介绍构思,这些构思将在后面的具体实施方式部分被详细描述。该发明内容部分并不旨在标识要求保护的技术方案的关键特征或必要特征,也不旨在用于限制所要求的保护的技术方案的范围。
第一方面,本公开提供一种应用程序包生成方法,应用于服务器,所述方法包括:
获取目标应用程序运行时对应的目标函数的目标函数标识;
根据所述目标函数标识从所述目标应用程序对应的编译文件中提取所述目标函数;
针对所述编译文件中除所述目标函数之外的候选函数,生成所述候选函数对应的调用函数,其中,所述调用函数用于对所述候选函数进行调用;
根据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包,其中,所述第一分包用于运行所述目标应用程序。
第二方面,本公开提供一种应用程序包加载方法,应用于终端,所述方法包括:
获取目标应用程序对应的应用程序包中的第一分包,其中,所述应用程序包包括所述第一分包和第二分包,所述第一分包包括运行目标应用程序对应的目标函数以及调用函数,所述调用函数与所述目标应用程序对应的函数中除所述目标函数之外的各个候选函数一一对应,所述调用函数用于调用所述候选函数,所述第二分包包括所述候选函数;
对所述第一分包进行解析,获得第一执行文件;
执行所述第一执行文件,以运行所述目标应用程序,其中,所述第二分包与所述第一分包异步下载至所述终端。
第三方面,本公开提供一种应用程序包生成装置,应用于服务器,所述装置包括:
第一获取模块,用于获取目标应用程序运行时对应的目标函数的目标函数标识;
提取模块,用于根据所述目标函数标识从所述目标应用程序对应的编译文件中提取所述目标函数;
第一生成模块,用于针对所述编译文件中除所述目标函数之外的候选函数,生成所述候选函数对应的调用函数,其中,所述调用函数用于对所述候选函数进行调用;
第二生成模块,用于根据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包,其中,所述第一分包用于运行所述目标应用程序。
第四方面,本公开提供一种应用程序包加载装置,应用于终端,所述装置包括:
第二获取模块,用于获取目标应用程序对应的应用程序包中的第一分包,其中,所述应用程序包包括所述第一分包和第二分包,所述第一分包包括运行目标应用程序对应的目标函数以及调用函数,所述调用函数与所述目标应用程序对应的函数中除所述目标函数之外的各个候选函数一一对应,所述调用函数用于调用所述候选函数,所述第二分包包括所述候选函数;
解析模块,用于对所述第一分包进行解析,获得第一执行文件;
第一执行模块,用于执行所述第一执行文件,以运行所述目标应用程序,其中,所述第二分包与所述第一分包异步下载至所述终端。
第五方面,本公开提供一种计算机可读介质,其上存储有计算机程序,该程序被处理装置执行时实现第一方面所述方法的步骤,或者该程序被处理装置执行时实现第二方面所述方法的步骤。
第六方面,本公开提供一种电子设备,包括:
存储装置,其上存储有计算机程序;
处理装置,用于执行所述存储装置中的所述计算机程序,以实现第一方面所述方法的步骤,或者实现第二方面所述方法的步骤。
由此,通过上述技术方案,可以通过获取目标应用程序运行时对应的目标函数的目标函数标识,以从目标应用程序对应的编译文件中提取所述目标函数,并且生成除目标函数之外的候选函数对应的调用函数,该调用函数用于对所述候选函数进行调用,则在根据所述目标函数和所述调用函数生成第一分包时,该第一分包中仅包含目标函数的实现,其针对候选函数可以只保留其对应的调用代码逻辑,以通过间接调用指令实现对候选函数的调用,而无需包含候选函数的具体实现,从而可以有效降低能够支持目标应用程序运行的第一分包的文件大小,该第一分包中包含各个目标函数,以保证目标应用程序的正常运行。由此,通过将目标应用程序的应用程序包切分成第一分包和第二分包,使得目标应用程序在下载和加载运行时可以直接基于第一分包进行启动,第二分包可以异步处理,从而提高目标应用程序安装和启动的效率,缩短目标应用程序的加载时间,提升用户时使用体验。
本公开的其他特征和优点将在随后的具体实施方式部分予以详细说明。
附图说明
结合附图并参考以下具体实施方式,本公开各实施例的上述和其他特征、优点及方面将变得更加明显。贯穿附图中,相同或相似的附图标记表示相同或相似的元素。应当理解附图是示意性的,原件和元素不一定按照比例绘制。在附图中:
图1是根据本公开的一种实施方式提供的应用程序包生成方法的流程图;
图2是根据本公开的一种实施方式提供的应用程序包加载方法的流程图;
图3是为根据本公开的一种实施方式提供的服务器、终端和客户端之间的通信示意图;
图4是根据本公开的一种实施方式提供的应用程序包生成装置的框图;
图5是根据本公开的一种实施方式提供的应用程序包加载装置的框图;
图6示出了适于用来实现本公开实施例的电子设备的结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。
需要注意,本公开中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
需要注意,本公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
本公开实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
可以理解的是,在使用本公开各实施例公开的技术方案之前,均应当依据相关法律法规通过恰当的方式对本公开所涉及个人信息的类型、使用范围、使用场景等告知用户并获得用户的授权。
例如,在响应于接收到用户的主动请求时,向用户发送提示信息,以明确地提示用户,其请求执行的操作将需要获取和使用到用户的个人信息。从而,使得用户可以根据提示信息来自主地选择是否向执行本公开技术方案的操作的电子设备、应用程序、服务器或存储介质等软件或硬件提供个人信息。
作为一种可选的但非限定性的实现方式,响应于接收到用户的主动请求,向用户发送提示信息的方式例如可以是弹窗的方式,弹窗中可以以文字的方式呈现提示信息。此外,弹窗中还可以承载供用户选择“同意”或者“不同意”向电子设备提供个人信息的选择控件。
可以理解的是,上述通知和获取用户授权过程仅是示意性的,不对本公开的实现方式构成限定,其它满足相关法律法规的方式也可应用于本公开的实现方式中。
同时,可以理解的是,本技术方案所涉及的数据(包括但不限于数据本身、数据的获取或使用)应当遵循相应法律法规及相关规定的要求。
图1所示,为根据本公开的一种实施方式提供的应用程序包生成方法的流程图,该方法可以应用于服务器,如图1所示,所述方法可以包括:
在步骤11中,获取目标应用程序运行时对应的目标函数的目标函数标识。
其中,针对应用程序而言,其通常是由开发人员进行代码编写从而获得应用程序对应的代码文件,而在开发人员进行开发的过程中通常会对库函数、系统函数进行引入,而该部分函数在应用程序运行的过程中并不会被执行到。基于此,在该步骤中可以确定出运行应用程序对应的目标函数,即该应用程序在运行过程中执行到的函数。示例地,该目标应用程序可以为游戏程序,如Unity WebGL游戏程序,其可以基于WebAssembly技术实现。
示例地,在应用程序中可以针对应用程序的各个函数进行函数标识分配,各个函数对应的函数标识不同,用于唯一表示该函数,从而可以通过获得目标函数标识,以确定出相应的目标函数。
在步骤12中,根据目标函数标识从目标应用程序对应的编译文件中提取目标函数。
其中,可以对源代码文件进行编译获得目标应用程序对应的编译文件,以基于编译文件运行目标应用程序。在本公开实施例中,可以在生成编译文件后,从该编译文件中提取出目标函数。示例地,该编译文件可以是编译所得的Wasm文件,Wasm文件是基于WebAssembly技术进行编译的文件,其具有文本格式以及二进制格式,在该实施例中可以在文本格式的Wasm文件中对目标函数进行提取,以提高Wasm文件的可读性,同时保证目标函数提取的准确性。
在步骤13中,针对编译文件中除目标函数之外的候选函数,生成候选函数对应的调用函数,其中,所述调用函数用于对所述候选函数进行调用。
其中,该调用函数可以与该候选函数的函数签名相同,调用函数与候选函数一一对应。示例地,该候选函数中包含该函数对应的具体实现,而在调用函数中不包含函数对应的具体实现,其包含对该函数的具体实现进行调用的调用逻辑,如在Wasm文件中可以基于call_indirect实现对不同文件中的函数的调用,因此可以基于候选函数生成相同函数签名的调用函数,并在调用函数中通过该间接函数调用方法call_indirect调用对应的候选函数中的具体实现,实现函数的执行。
在步骤14中,根据目标函数和调用函数生成第一分包,根据候选函数生成第二分包,并将第一分包和第二分包确定为目标应用程序对应的应用程序包,其中,第一分包用于运行所述目标应用程序,第一分包可以为一个,第二分包可以包括一个或多个。
在该步骤中,在生成目标应用程序的应用程序包时,可以将运行目标应用程序对应的目标函数与除目标函数之外的其他函数(即候选函数)进行划分,将目标函数和调用函数划分至一个Wasm文件,即获得第一分包,除目标函数之外的其他函数划分至另外的Wasm文件,即获得第二分包,且通过第一分包中的调用函数可以间接调用第二分包中的函数,实现应用程序包切分的同时保证各个函数间的调用可用性。其中,第一分包用于运行目标应用程序,则在基于目标应用程序的应用程序包运行该目标应用程序时,可以直接基于第一分包运行该目标应用程序,降低目标应用程序的应用程序包的加载时间和启动时间。
由此,通过上述技术方案,可以通过获取目标应用程序运行时对应的目标函数的目标函数标识,以从目标应用程序对应的编译文件中提取所述目标函数,并且生成除目标函数之外的候选函数对应的调用函数,该调用函数用于对所述候选函数进行调用,则在根据所述目标函数和所述调用函数生成第一分包时,该第一分包中仅包含目标函数的实现,其针对候选函数可以只保留其对应的调用代码逻辑,以通过间接调用指令实现对候选函数的调用,而无需包含候选函数的具体实现,从而可以有效降低能够支持目标应用程序运行的第一分包的文件大小,该第一分包中包含各个目标函数,以保证目标应用程序的正常运行。由此,通过将目标应用程序的应用程序包切分成第一分包和第二分包,使得目标应用程序在下载和加载运行时可以直接基于第一分包进行启动,第二分包可以异步处理,从而提高目标应用程序安装和启动的效率,缩短目标应用程序的加载时间,提升用户时使用体验。
在实际应用场景中,由于各个终端的型号差异使得运行目标应用程序的目标函数可能不同,基于此,本公开还提供以下实施例,以更加全面的收集运行目标应用程序对应的目标函数。在一种可能的实施例中,步骤14中根据候选函数生成第二分包的示例性实现方式可以包括:
针对每一候选函数,在所述候选函数中添加函数标识代码,其中,所述函数标识代码用于在终端执行所述候选函数时确定所述候选函数的函数标识。
示例地,编译文件为对源代码文件进行编译所得的Wasm文件,每个Wasm函数都具有唯一的函数标识,如函数ID。如上文所述将整个Wasm文件中的函数划分至多个分包中,因此针对第二分包中的候选函数而言,当其在被调用时表示该候选函数为目标应用程序运行过程中会执行到的函数,则需要在该Wasm函数执行时,知道当前执行的是哪个函数。因此,该实施例中可以在原始的候选函数中插入代码,以使得在该候选函数执行时能够知道被执行的候选函数的函数标识。
示例地,以如下Wasm函数为例:
参见上述代码,该Wasm函数的函数ID为7。为了能够知道该函数被调用到,可以在该函数内部添加函数标识代码,示例如下:
i32.const 7
基于该代码,可以将该Wasm函数的函数标识通过指令进行设置,获得表示该函数标识的参数,从而可以在终端运行目标应用程序的过程中执行到该行代码时,基于该参数确定该函数的函数标识为7,由此可以在候选函数执行时明确执行到的候选函数是哪一个。
进一步地,针对每一候选函数,在候选函数中添加函数标识发送代码,其中,所述函数标识发送代码用于在终端执行所述候选函数时,触发所述终端将获得的所述候选函数的函数标识发送至所述服务器。
接上文所述,在终端运行目标应用程序的过程中执行到该行代码时可以确定出函数的函数标识,进一步地可以将该函数标识向服务器进行上报,以便于服务器能够获知运行目标应用程序中执行到该候选函数。因此,在该实施例中,可以在候选函数中添加函数标识发送代码,以使得终端能够将执行到的候选函数的函数标识发送至服务器,示例地,函数标识发送代码如下:
call$wasmhook.logCall
其中,$wasmhook.logCall表示一个函数,其可以是JavaScript中导入(import)到Wasm函数中的函数,接上述示例,在执行到该行代码时其可以传入一个整数参数7,即上文所述的执行到的候选函数的函数标识,该$wasmhook.logCall函数在Wasm中的表示如下:
(import"wasmhook""logCall"(func$wasmhook.logCall(type$t3)))
在JavaScript代码中,wasmhook是一个对象,该对象中具有一个名为logCall函数,其定义可以表示为:
示例地,可以预定义wasmhook对象的logCall函数,通过该函数将获得的函数标识向服务器进行上报,则针对每一候选函数,只需要添加对该导入函数的调用即可。
将添加所述函数标识代码和所述函数标识发送代码后所得的各个候选函数转换至二进制文件,获得所述第二分包。
示例地,添加上述代码之后所得的调用函数如下所示:
如上文所述,Wasm代码具有文本格式以及二进制格式。在为每一候选函数添加函数标识代码和函数标识发送代码时,该候选函数为文本格式,以便于将对应的代码进行插入,而为了保证文件的可执行性,则在为每一候选函数添加函数标识代码和所述函数标识发送代码后,再将其转换为二进制格式,即获得二进制文件,将该二进制文件作为该第二分包,从而可以由终端进行下载并执行。
由此,通过上述技术方案,可以在各个候选函数中添加函数标识代码和函数标识发送代码,从而使得终端运行该目标应用程序的过程中执行到候选函数时,能够自动向服务器发送执行到的候选函数的函数标识,使得服务器能够实现对运行目标应用程序的各个函数的全面收集,为进行应用程序包的切分提供准确且全面的数据支持。
在一种可能的实施例中,根据目标函数和调用函数生成第一分包的示例性实现方式如下,该步骤可以包括:
获取对第二分包进行解析的目标代码,其中,所述目标代码中包括用于表征所述第二分包是否解析完成的解析变量,以及对所述第二分包进行解析的解析代码。
其中,在第一分包中只包含候选函数对应的调用函数,则在第一分包需要对候选函数进行调用时,需要保证第二分包解析完成。因此,在该实施例中,可以获取对第二分包进行解析的目标代码,以基于该目标代码实现对第二分包的解析。
示例地,可以预定义JavaScript函数,以用于对第二分包进行解析,之后可以通过导入该JavaScript函数从而在Wasm函数内部对该JavaScript函数进行调用,JavaScript函数的代码表示示例如下:
之后可以将该JavaScript函数导入到Wasm内部调用,在Wasm模块内部的定义为:
(import"wasmHook""wait"(func$scwebgl.wait(type$t3)))
进一步地,可以生成一个Wasm局部变量,即用于表征所述第二分包是否解析完成的解析变量,生成解析变量$g3的代码示例如下:
(global$g3(muti32)(i32.const 0))
Wasm函数内部添加一个设置第二分包解析完成的函数,并将该函数导出(export)到JavaScript中调用:
(func$setSubWasmLoaded(parami32)
i32.const 1
global.set$g3)
(export"setSubWasmLoaded"(func$setSubWasmLoaded))
从而能够在第二分包解析完成的情况下,使得JavaScript函数能够获知其已解析完成而无需重复解析。进一步可以新生成一Wasm函数,如下:
其中,该目标代码可以为该新生成的Wasm函数$ensureSubWasm以及其调用的JavaScript函数$wasmHook.wait,其中,$g3用于表示解析变量,call$wasmHook.wait用于调用导入的JavaScript函数对所述第二分包进行解析。在该函数中可以基于解析变量确定第二分包是否编译完成,若第二分包尚未编译完成,则调用$wasmHook.wait,以对导入的JavaScript函数进行调用实现对第二分包的编译。
之后,在每一所述调用函数中添加对所述目标代码的调用代码,获得更新调用函数。
其中,第一分包用于运行目标应用程序,则在该实施例中,在运行目标应用程序前只需要对第一分包进行解析,调用函数对应的具体实现在第二分包中,若在该过程中需要调用第二分包中的函数,则需要对第二分包进行解析。基于此,可以在每一调用函数中添加对目标代码的调用代码,以在基于目标代码对第二分包进行解析之后再调用该调用函数在第二分包中对应的候选函数,保证候选函数的正确调用。示例地,若调用函数为$f1,则添加的调用代码后所得的更新调用函数如下所示:
(func$f1(type$t2)(result i32)
call$ensureSubWasm
i32.const 1
call_indirect(type$t2))
其中,call$ensureSubWasm即为对所述目标代码的调用代码,以实现对目标代码的调用,保证第二分包解析完成,然后通过call_indirect(type$t2))指令实现对第二分包中的调用函数对应的候选函数的调用。
将所述目标函数、所述更新调用函数和所述目标代码转换至二进制文件,获得所述第一分包。其中,转换为二进制文件的方式可以采用本领域中的Wasm的转换方式,在此不再赘述。
由此,通过上述技术方案,可以在第一分包中添加目标代码,以实现对第二分包的解析,同时在每一调用函数中添加对目标代码的调用代码,以保证对每一调用函数对应的候选函数调用时第二分包都是解析完成的状态,保证第一分包和第二分包之间的函数调用逻辑的正常运行,提升目标应用程序的运行稳定性。
本公开还提供一种应用程序包加载方法,应用于终端,该终端可以是Unity WebGL游戏前端,如图2所示,所述方法包括:
在步骤21中,获取目标应用程序对应的应用程序包中的第一分包,其中,所述应用程序包包括所述第一分包和第二分包,所述第一分包包括运行目标应用程序对应的目标函数以及调用函数,所述调用函数与所述目标应用程序对应的函数中除所述目标函数之外的各个候选函数一一对应,所述调用函数用于调用所述候选函数,所述第二分包包括所述候选函数。
其中,在终端首次加载该目标应用程序时,终端可以与服务器进行通信,以从服务器获得目标应用程序对应的第一分包。若该第一分包已经下载至所述终端,则可以直接从终端本地获取。
在步骤22中,对第一分包进行解析,获得第一执行文件。其中,所述第一分包为可以是Wasm文件,则可以采用本领域中对Wasm文件的解析方式对其进行解析,获得第一执行文件,在此不再赘述。
在步骤23中,执行第一执行文件,以运行目标应用程序,其中,所述第二分包与所述第一分包异步下载至所述终端。
通过上述技术方案,目标应用程序的应用程序包被划分为多个分包文件,则在加载运行该目标应用程序时,可以首先加载并解析包含运行目标应用程序对应的目标函数的第一分包,以对目标应用程序进行下载或启动。由于运行目标应用程序对应的目标函数在第一分包中,则该第二分包与第一分包可以异步下载至所述终端,在保证目标应用程序能够正常运行的同时,一方面可以有效降低运行目标应用程序所需的分包的数据大小,从而提高运行目标应用程序的文件的获取效率,另一方面可以在一定程度上降低需要进行解析的文件的数据量,提高目标应用程序运行前的解析效率。由此,能够在保证目标应用程序有效运行的同时,降低目标应用程序的启动和加载时间,提升目标应用程序的启动效率,提升用户使用体验。
在一种可能的实施例中,所述方法还包括:
若执行所述第一执行文件的过程中执行到所述调用函数,确定所述第二分包是否解析。
接上文所述示例,目标代码中在调用导入的JavaScript函数$wasmHook.wait对第二分包进行解析之后,会相应修改该解析变量的取值,示例地,可以通过获取该调用函数中对应的解析变量的取值确定该第二分包是否解析,若该解析变量为初始值,则确定第二分包未解析,此时需要进一步调用该JavaScript函数$wasmHook.wait对第二分包进行解析。若解析变量不是初始值,则确定第二分包解析。
进一步地,在确定所述第二分包解析后,获得对所述第二分包解析所得的第二执行文件;根据所述调用函数调用所述第二执行文件中的候选函数,以运行所述目标应用程序。
其中,对第二分包进行解析的方式可以通过上述所述的目标代码执行,在此不再赘述。在对第二分包解析后,其中的各个候选函数则可以被准确调用执行。示例地,由于在调用函数中并没有真实的函数实现,其是对第二分包中的候选函数的调用代码,则目标应用程序的运行过程中会先执行调用函数中的调用代码,此时则可以基于调用代码通过间接调用的方式调用到第二分包中的候选函数,基于该候选函数中的真实函数实现以完成对该调用函数的最终执行,保证目标应用程序的准确运行。
由此,通过上述技术方案,在执行到调用函数即确定要执行第二分包中的候选函数时,对第二分包进行解析从而获得第二执行文件,进而实现对候选函数的调用。由此,可以根据实际运行中的需求确定是否对第二分包进行解析,并且在对第二分包进行解析之前,确定其是否已解析,从而只需要对第二分包解析一次便可实现对第二分包中包含的候选函数的调用,在一定程度上降低目标应用程序启动时的解析数据量,从而提高目标应用程序的启动效率,同时也可以保证目标应用程序的稳定运行,提升用户使用体验。
在一种可能的实施例中,所述方法还可以包括:
在根据所述调用函数调用所述第二执行文件中的候选函数的情况下,获取所述候选函数对应的函数标识。
向所述目标应用程序对应的服务器发送所述函数标识。
其中,在服务器对应用程序包中的函数进行切分时,针对候选函数会在候选函数中添加函数标识代码和函数标识发送代码。因此,在对第二执行文件中的候选函数进行调用时,表示该候选函数为运行该目标应用程序对应的函数,此时可执行到候选函数中添加的相应代码,以获取该候选函数的函数标识,对运行目标应用程序对应的函数进行更加全面地记录。同时可以向服务器上报调用的候选函数的函数标识,能够在目标应用程序的运行过程中对其能够执行的函数进行收集,以使得服务器能够收集到更加全面的目标函数,为服务器后续进行更加准确的应用程序包生成提供更加准确且全面的数据支持。
在一种可能的实施例中,在步骤11中,获取目标应用程序运行时对应的目标函数的目标函数标识的示例性实现方式如下,该步骤可以包括:
获取所述目标应用程序对应的目标函数标识列表,其中该目标函数标识列表用于记录目标应用程序运行过程中执行过的函数的函数标识。
将所述目标函数标识列表中的每一所述函数标识确定为所述目标函数标识。
作为示例,所述目标函数标识列表可以通过以下方式预先生成:
记录所述目标应用程序在至少一个终端中运行时执行到的函数的函数标识。其中,可以在目标应用程序发布之前,通过客户端工具对目标函数进行收集,如可以将目标应用程序安装在一个或多个终端中,以在每一终端中控制目标应用程序运行。示例地,可以在每一函数中增加函数标识打印的代码,则在执行到相应的函数时可以打印出执行到的函数的函数标识,从而通过客户端工具对函数对打印出的函数标识进行收集并记录。示例地,该客户端工具可以为Unity客户端工具,可以通过该Unity客户端工具将目标应用程序对应的编译文件发送至服务器,并向服务器上报收集到的目标函数的函数标识。
确定所述函数标识是否与所述函数标识列表中的函数标识重合,并在所述函数标识未与所述函数标识列表中的函数标识重合的情况下,将所述函数标识添加至函数标识列表中。示例地,可以依次获取每一函数标识,确定其是否与函数标识列表中的函数标识重合,以避免将重复的函数标识添加至函数标识列表中,从而可以将各个函数标识进行去重,使得添加至所述函数标识列表中的函数标识不重合,以确定目标应用程序在运行过程中对应的函数,保证函数标识确定的全面性和准确性。
若在目标时段内所述函数标识列表中未增加新的函数标识,将所述函数标识列表确定为所述目标函数标识列表。
其中,目标时段可以基于实际应用场景进行设置,对此不做限定。在该实施例中,在目标时段内所述函数标识列表中未增加新的函数标识,表示当前运行目标应用程序未收集到新的函数,此时可以认为运行目标应用程序对应的函数收集完成,则可以将此时确定的函数标识列表作为该目标函数标识列表,以便于基于该目标函数标识列表直接确定各个目标函数,无需进行重复的函数收集操作。
由此,通过上述技术方案,可以通过目标函数标识列表直接获得相应的目标函数标识,并且该目标函数标识列表通过预先运行目标应用程序进行确定,提高确定出的目标函数标识的准确性,同时基于目标函数标识列表可以对各个目标函数的标识进行有效维护,便于后续目标应用程序运行过程中发生目标函数更新时对目标函数标识列表的更新操作,为保证第一分包的准确性和可用性提供支持。
在一种可能的实施例中,所述方法还可以包括:
接收终端发送的函数标识;
在接收到的所述函数标识与所述目标函数标识列表中的函数标识不同的情况下,将接收到的所述函数标识添加至所述目标函数标识列表中。
其中,如上文所述候选函数中添加了相应的函数标识代码和函数标识发送代码,则在终端中运行目标应用程序的过程中执行到候选函数时,终端会向服务器发送该执行到的候选函数的函数标识。
由于目标应用程序可以在多个终端中运行,则在终端发送函数标识后确定该函数标识存在于目标函数标识列表中,若之前已经由其他终端发送过该函数标识,且该函数标识添加至目标函数标识列表中,则此时该函数标识无需再次添加。若接收到的函数标识与目标函数标识列表中的函数标识不同,则表示该函数标识未被记录,此时将该函数标识添加至目标函数标识列表中,在目标应用程序的运行过程中对目标函数进行收集和记录,以提高目标函数标识列表的准确性和有效性。
在一种可能的实施例中,所述方法还可以包括:
在接收到的函数标识满足更新条件的情况下,触发再次执行所述获取目标应用程序运行时对应的目标函数的目标函数标识至所述据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包的步骤。
其中,所述更新条件可以是接收到的函数标识的数量达到预设的数量阈值,或者所述更新条件可以是接收到的函数标识的数量不为零、且距离前一次生成第一分包的时间达到预设时长,此时可以再次执行步骤11至步骤14,以基于更新后的目标函数标识重新提取新的目标函数,进一步增加第一分包中的目标函数的数量和范围,拓展生成的第一分包的应用范围,在一定程度上避免在终端中运行目标应用程序时对第二分包的解析。
相应地,在终端侧可以在对目标应用程序进行更新时,重新下载更新后的第一分包和第二分包,从而提高该目标应用程序的启动效率,便于用户使用。
如图3所示,为服务器、终端和客户端之间的通信示意图,其中,客户端工具31可以将目标应用程序的编译文件上传至服务器32,并且客户端工具31预先收集目标函数记录至函数标识列表,并可以在收集完成获得目标函数标识列表后请求服务器32对编译文件进行切分,以及下载切分后所得的应用程序包。服务器32可以对接收到的编译文件中的函数中进行代码添加,如生成候选函数对应的调用函数,并基于调用函数替换候选函数实现,以及添加目标代码JavaScript函数$wasmHook.wait,添加函数标识代码和函数标识发送代码$wasmHook.logCall等。服务器32可以基于客户端工具31收集的目标函数对编译文件进行切分,生成第一分包和第二分包。终端33可以下载第一分包和第二分包,以运行目标应用程序,并在目标应用程序运行过程中执行到候选函数时,向服务器32发送候选函数的函数标识,服务器32则可以接收该函数标识以实现目标函数标识列表的更新,以在接收到的函数标识满足更新条件的情况下,重新生成新的第一分包和第二分包。其中上述过程的具体实现方式已在上文进行详述,在此不再赘述。
本公开还提供一种应用程序包生成装置,应用于服务器,如图4所示,所述装置40包括:
第一获取模块41,用于获取目标应用程序运行时对应的目标函数的目标函数标识;
提取模块42,用于根据所述目标函数标识从所述目标应用程序对应的编译文件中提取所述目标函数;
第一生成模块43,用于针对所述编译文件中除所述目标函数之外的候选函数,生成所述候选函数对应的调用函数,其中,所述调用函数用于对所述候选函数进行调用;
第二生成模块44,用于根据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包,其中,所述第一分包用于运行所述目标应用程序。
可选地,所述第二生成模块包括:
第一添加子模块,用于针对每一候选函数,在所述候选函数中添加函数标识代码,其中,所述函数标识代码用于在终端执行所述候选函数时确定所述候选函数的函数标识;
第二添加子模块,用于针对每一候选函数,在所述候选函数中添加函数标识发送代码,其中,所述函数标识发送代码用于在终端执行所述候选函数时,触发所述终端将获得的所述候选函数的函数标识发送至所述服务器;
第一转换子模块,用于将添加所述函数标识代码和所述函数标识发送代码后所得的各个候选函数转换至二进制文件,获得所述第二分包。
可选地,所述第一获取模块包括:
第一获取子模块,用于获取所述目标应用程序对应的目标函数标识列表;
确定子模块,用于将所述目标函数标识列表中的每一所述函数标识确定为所述目标函数标识;
其中,所述目标函数标识列表通过以下方式预先生成:
记录所述目标应用程序在至少一个终端中运行时执行到的函数的函数标识;
确定所述函数标识是否与所述函数标识列表中的函数标识重合,并在所述函数标识未与所述函数标识列表中的函数标识重合的情况下,将所述函数标识添加至函数标识列表中;
若在目标时段内所述函数标识列表中未增加新的函数标识,将所述函数标识列表确定为所述目标函数标识列表。
可选地,所述装置还包括:
接收模块,用于接收终端发送的函数标识;
添加模块,用于在接收到的所述函数标识与所述目标函数标识列表中的函数标识不同的情况下,将接收到的所述函数标识添加至所述目标函数标识列表中。
可选地,所述装置还包括:
更新模块,用于在接收到的函数标识满足更新条件的情况下,触发所述第一获取模块再次执行所述获取目标应用程序运行时对应的目标函数的目标函数标识,所述提取模块再次执行根据所述目标函数标识从所述目标应用程序对应的编译文件中提取所述目标函数;所述第一生成模块再次执行针对所述编译文件中除所述目标函数之外的候选函数,生成所述候选函数对应的调用函数,其中,所述调用函数用于对所述候选函数进行调用;以及所述第二生成模块再次执行根据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包,其中,所述第一分包用于运行所述目标应用程序。
可选地,所述第二生成模块包括:
第二获取子模块,用于获取对第二分包进行解析的目标代码,其中,所述目标代码中包括用于表征所述第二分包是否解析完成的解析变量,以及对所述第二分包进行解析的解析代码;
第三添加子模块,用于在每一所述调用函数中添加对所述目标代码的调用代码,获得更新调用函数;
第二转换子模块,用于将所述目标函数、所述更新调用函数和所述目标代码转换至二进制文件,获得所述第一分包。
本公开还提供一种应用程序包加载装置,应用于终端,如图5所示,所述装置50包括:
第二获取模块51,用于获取目标应用程序对应的应用程序包中的第一分包,其中,所述应用程序包包括所述第一分包和第二分包,所述第一分包包括运行目标应用程序对应的目标函数以及调用函数,所述调用函数与所述目标应用程序对应的函数中除所述目标函数之外的各个候选函数一一对应,所述调用函数用于调用所述候选函数,所述第二分包包括所述候选函数;
解析模块52,用于对所述第一分包进行解析,获得第一执行文件;
第一执行模块53,用于执行所述第一执行文件,以运行所述目标应用程序,其中,所述第二分包与所述第一分包异步下载至所述终端。
可选地,所述装置还包括:
确定模块,用于若执行所述第一执行文件的过程中执行到所述调用函数,确定所述第二分包是否解析;
第三获取模块,用于在确定所述第二分包解析后,获得对所述第二分包解析所得的第二执行文件;
第二执行模块,根据所述调用函数调用所述第二执行文件中的候选函数,以运行所述目标应用程序。
可选地,所述装置还包括:
第四获取模块,用于在根据所述调用函数调用所述第二执行文件中的候选函数的情况下,获取所述候选函数对应的函数标识;
发送模块,用于向所述目标应用程序对应的服务器发送所述函数标识。
下面参考图6,其示出了适于用来实现本公开实施例的电子设备600的结构示意图。本公开实施例中的终端设备可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。图6示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图6所示,电子设备600可以包括处理装置(例如中央处理器、图形处理器等)601,其可以根据存储在只读存储器(ROM)602中的程序或者从存储装置608加载到随机访问存储器(RAM)603中的程序而执行各种适当的动作和处理。在RAM 603中,还存储有电子设备600操作所需的各种程序和数据。处理装置601、ROM 602以及RAM 603通过总线604彼此相连。输入/输出(I/O)接口605也连接至总线604。
通常,以下装置可以连接至I/O接口605:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置606;包括例如液晶显示器(LCD)、扬声器、振动器等的输出装置607;包括例如磁带、硬盘等的存储装置608;以及通信装置609。通信装置609可以允许电子设备600与其他设备进行无线或有线通信以交换数据。虽然图6示出了具有各种装置的电子设备600,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在非暂态计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置609从网络上被下载和安装,或者从存储装置608被安装,或者从ROM 602被安装。在该计算机程序被处理装置601执行时,执行本公开实施例的方法中限定的上述功能。
需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、RF(射频)等等,或者上述的任意合适的组合。
在一些实施方式中,客户端、服务器可以利用诸如HTTP(HyperText TransferProtocol,超文本传输协议)之类的任何当前已知或未来研发的网络协议进行通信,并且可以与任意形式或介质的数字数据通信(例如,通信网络)互连。通信网络的示例包括局域网(“LAN”),广域网(“WAN”),网际网(例如,互联网)以及端对端网络(例如,ad hoc端对端网络),以及任何当前已知或未来研发的网络。
上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。
上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:获取目标应用程序运行时对应的目标函数的目标函数标识;根据所述目标函数标识从所述目标应用程序对应的编译文件中提取所述目标函数;针对所述编译文件中除所述目标函数之外的候选函数,生成所述候选函数对应的调用函数,其中,所述调用函数用于对所述候选函数进行调用;根据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包,其中,所述第一分包用于运行所述目标应用程序。
或者,上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:获取目标应用程序对应的应用程序包中的第一分包,其中,所述应用程序包包括所述第一分包和第二分包,所述第一分包包括运行目标应用程序对应的目标函数以及调用函数,所述调用函数与所述目标应用程序对应的函数中除所述目标函数之外的各个候选函数一一对应,所述调用函数用于调用所述候选函数,所述第二分包包括所述候选函数;对所述第一分包进行解析,获得第一执行文件;执行所述第一执行文件,以运行所述目标应用程序,其中,所述第二分包与所述第一分包异步下载至所述终端。
可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括但不限于面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言——诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)——连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。其中,模块的名称在某种情况下并不构成对该模块本身的限定,例如,第一获取模块还可以被描述为“获取目标应用程序运行时对应的目标函数的目标函数标识的模块”。
本文中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑设备(CPLD)等等。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
根据本公开的一个或多个实施例,示例1提供了一种应用程序包生成方法,其中,应用于服务器,所述方法包括:
获取目标应用程序运行时对应的目标函数的目标函数标识;
根据所述目标函数标识从所述目标应用程序对应的编译文件中提取所述目标函数;
针对所述编译文件中除所述目标函数之外的候选函数,生成所述候选函数对应的调用函数,其中,所述调用函数用于对所述候选函数进行调用;
根据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包,其中,所述第一分包用于运行所述目标应用程序。
根据本公开的一个或多个实施例,示例2提供了示例1的方法,其中,所述根据所述候选函数生成第二分包,包括:
针对每一候选函数,在所述候选函数中添加函数标识代码,其中,所述函数标识代码用于在终端执行所述候选函数时确定所述候选函数的函数标识;
针对每一候选函数,在所述候选函数中添加函数标识发送代码,其中,所述函数标识发送代码用于在终端执行所述候选函数时,触发所述终端将获得的所述候选函数的函数标识发送至所述服务器;
将添加所述函数标识代码和所述函数标识发送代码后所得的各个候选函数转换至二进制文件,获得所述第二分包。
根据本公开的一个或多个实施例,示例3提供了示例1的方法,其中,所述获取目标应用程序运行时对应的目标函数的目标函数标识,包括:
获取所述目标应用程序对应的目标函数标识列表;
将所述目标函数标识列表中的每一所述函数标识确定为所述目标函数标识;
其中,所述目标函数标识列表通过以下方式预先生成:
记录所述目标应用程序在至少一个终端中运行时执行到的函数的函数标识;
确定所述函数标识是否与所述函数标识列表中的函数标识重合,并在所述函数标识未与所述函数标识列表中的函数标识重合的情况下,将所述函数标识添加至函数标识列表中;
若在目标时段内所述函数标识列表中未增加新的函数标识,将所述函数标识列表确定为所述目标函数标识列表。
根据本公开的一个或多个实施例,示例4提供了示例3的方法,其中,所述方法还包括:
接收终端发送的函数标识;
在接收到的所述函数标识与所述目标函数标识列表中的函数标识不同的情况下,将接收到的所述函数标识添加至所述目标函数标识列表中。
根据本公开的一个或多个实施例,示例5提供了示例4的方法,其中,所述方法还包括:
在接收到的函数标识满足更新条件的情况下,触发再次执行所述获取目标应用程序运行时对应的目标函数的目标函数标识至所述据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包的步骤。
根据本公开的一个或多个实施例,示例6提供了示例1的方法,其中,所述根据所述目标函数和所述调用函数生成第一分包,包括:
获取对第二分包进行解析的目标代码,其中,所述目标代码中包括用于表征所述第二分包是否解析完成的解析变量,以及对所述第二分包进行解析的解析代码;
在每一所述调用函数中添加对所述目标代码的调用代码,获得更新调用函数;
将所述目标函数、所述更新调用函数和所述目标代码转换至二进制文件,获得所述第一分包。
根据本公开的一个或多个实施例,示例7提供了一种应用程序包加载方法,其中,应用于终端,所述方法包括:
获取目标应用程序对应的应用程序包中的第一分包,其中,所述应用程序包包括所述第一分包和第二分包,所述第一分包包括运行目标应用程序对应的目标函数以及调用函数,所述调用函数与所述目标应用程序对应的函数中除所述目标函数之外的各个候选函数一一对应,所述调用函数用于调用所述候选函数,所述第二分包包括所述候选函数;
对所述第一分包进行解析,获得第一执行文件;
执行所述第一执行文件,以运行所述目标应用程序,其中,所述第二分包与所述第一分包异步下载至所述终端。
根据本公开的一个或多个实施例,示例8提供了示例7的方法,其中,所述方法还包括:
若执行所述第一执行文件的过程中执行到所述调用函数,确定所述第二分包是否解析;
在确定所述第二分包解析后,获得对所述第二分包解析所得的第二执行文件;
根据所述调用函数调用所述第二执行文件中的候选函数,以运行所述目标应用程序。
根据本公开的一个或多个实施例,示例9提供了示例8的方法,其中,所述方法还包括:
在根据所述调用函数调用所述第二执行文件中的候选函数的情况下,获取所述候选函数对应的函数标识;
向所述目标应用程序对应的服务器发送所述函数标识。
根据本公开的一个或多个实施例,示例10提供了一种应用程序包生成装置,其中,应用于服务器,所述装置包括:
第一获取模块,用于获取目标应用程序运行时对应的目标函数的目标函数标识;
提取模块,用于根据所述目标函数标识从所述目标应用程序对应的编译文件中提取所述目标函数;
第一生成模块,用于针对所述编译文件中除所述目标函数之外的候选函数,生成所述候选函数对应的调用函数,其中,所述调用函数用于对所述候选函数进行调用;
第二生成模块,用于根据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包,其中,所述第一分包用于运行所述目标应用程序。
根据本公开的一个或多个实施例,示例11提供了一种应用程序包加载装置,应用于终端,所述装置包括:
第二获取模块,用于获取目标应用程序对应的应用程序包中的第一分包,其中,所述应用程序包包括所述第一分包和第二分包,所述第一分包包括运行目标应用程序对应的目标函数以及调用函数,所述调用函数与所述目标应用程序对应的函数中除所述目标函数之外的各个候选函数一一对应,所述调用函数用于调用所述候选函数,所述第二分包包括所述候选函数;
解析模块,用于对所述第一分包进行解析,获得第一执行文件;
第一执行模块,用于执行所述第一执行文件,以运行所述目标应用程序,其中,所述第二分包与所述第一分包异步下载至所述终端。
根据本公开的一个或多个实施例,示例12提供了一种计算机可读介质,其上存储有计算机程序,其中,该程序被处理装置执行时实现示例1-6中任一项所述方法的步骤,或者该程序被处理装置执行时实现示例7-9中任一项所述方法的步骤。
根据本公开的一个或多个实施例,示例13提供了一种电子设备,其中,包括:
存储装置,其上存储有计算机程序;
处理装置,用于执行所述存储装置中的所述计算机程序,以实现示例1-6中任一项所述方法的步骤,或者实现示例7-9中任一项所述方法的步骤。
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的公开范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述公开构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
此外,虽然采用特定次序描绘了各操作,但是这不应当理解为要求这些操作以所示出的特定次序或以顺序次序执行来执行。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文中描述的某些特征还可以组合地实现在单个实施例中。相反地,在单个实施例的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实施例中。
尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
Claims (13)
1.一种应用程序包生成方法,其特征在于,应用于服务器,所述方法包括:
获取目标应用程序运行时对应的目标函数的目标函数标识;
根据所述目标函数标识从所述目标应用程序对应的编译文件中提取所述目标函数;
针对所述编译文件中除所述目标函数之外的候选函数,生成所述候选函数对应的调用函数,其中,所述调用函数用于对所述候选函数进行调用;
根据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包,其中,所述第一分包用于运行所述目标应用程序。
2.根据权利要求1所述的方法,其特征在于,所述根据所述候选函数生成第二分包,包括:
针对每一候选函数,在所述候选函数中添加函数标识代码,其中,所述函数标识代码用于在终端执行所述候选函数时确定所述候选函数的函数标识;
针对每一候选函数,在所述候选函数中添加函数标识发送代码,其中,所述函数标识发送代码用于在终端执行所述候选函数时,触发所述终端将获得的所述候选函数的函数标识发送至所述服务器;
将添加所述函数标识代码和所述函数标识发送代码后所得的各个候选函数转换至二进制文件,获得所述第二分包。
3.根据权利要求1所述的方法,其特征在于,所述获取目标应用程序运行时对应的目标函数的目标函数标识,包括:
获取所述目标应用程序对应的目标函数标识列表;
将所述目标函数标识列表中的每一所述函数标识确定为所述目标函数标识;
其中,所述目标函数标识列表通过以下方式预先生成:
记录所述目标应用程序在至少一个终端中运行时执行到的函数的函数标识;
确定所述函数标识是否与所述函数标识列表中的函数标识重合,并在所述函数标识未与所述函数标识列表中的函数标识重合的情况下,将所述函数标识添加至函数标识列表中;
若在目标时段内所述函数标识列表中未增加新的函数标识,将所述函数标识列表确定为所述目标函数标识列表。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
接收终端发送的函数标识;
在接收到的所述函数标识与所述目标函数标识列表中的函数标识不同的情况下,将接收到的所述函数标识添加至所述目标函数标识列表中。
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
在接收到的函数标识满足更新条件的情况下,触发再次执行所述获取目标应用程序运行时对应的目标函数的目标函数标识至所述据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包的步骤。
6.根据权利要求1所述的方法,其特征在于,所述根据所述目标函数和所述调用函数生成第一分包,包括:
获取对第二分包进行解析的目标代码,其中,所述目标代码中包括用于表征所述第二分包是否解析完成的解析变量,以及对所述第二分包进行解析的解析代码;
在每一所述调用函数中添加对所述目标代码的调用代码,获得更新调用函数;
将所述目标函数、所述更新调用函数和所述目标代码转换至二进制文件,获得所述第一分包。
7.一种应用程序包加载方法,其特征在于,应用于终端,所述方法包括:
获取目标应用程序对应的应用程序包中的第一分包,其中,所述应用程序包包括所述第一分包和第二分包,所述第一分包包括运行目标应用程序对应的目标函数以及调用函数,所述调用函数与所述目标应用程序对应的函数中除所述目标函数之外的各个候选函数一一对应,所述调用函数用于调用所述候选函数,所述第二分包包括所述候选函数;
对所述第一分包进行解析,获得第一执行文件;
执行所述第一执行文件,以运行所述目标应用程序,其中,所述第二分包与所述第一分包异步下载至所述终端。
8.根据权利要求7所述的方法,其特征在于,所述方法还包括:
若执行所述第一执行文件的过程中执行到所述调用函数,确定所述第二分包是否解析;
在确定所述第二分包解析后,获得对所述第二分包解析所得的第二执行文件;
根据所述调用函数调用所述第二执行文件中的候选函数,以运行所述目标应用程序。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:
在根据所述调用函数调用所述第二执行文件中的候选函数的情况下,获取所述候选函数对应的函数标识;
向所述目标应用程序对应的服务器发送所述函数标识。
10.一种应用程序包生成装置,其特征在于,应用于服务器,所述装置包括:
第一获取模块,用于获取目标应用程序运行时对应的目标函数的目标函数标识;
提取模块,用于根据所述目标函数标识从所述目标应用程序对应的编译文件中提取所述目标函数;
第一生成模块,用于针对所述编译文件中除所述目标函数之外的候选函数,生成所述候选函数对应的调用函数,其中,所述调用函数用于对所述候选函数进行调用;
第二生成模块,用于根据所述目标函数和所述调用函数生成第一分包,根据所述候选函数生成第二分包,并将所述第一分包和所述第二分包确定为所述目标应用程序对应的应用程序包,其中,所述第一分包用于运行所述目标应用程序。
11.一种应用程序包加载装置,其特征在于,应用于终端,所述装置包括:
第二获取模块,用于获取目标应用程序对应的应用程序包中的第一分包,其中,所述应用程序包包括所述第一分包和第二分包,所述第一分包包括运行目标应用程序对应的目标函数以及调用函数,所述调用函数与所述目标应用程序对应的函数中除所述目标函数之外的各个候选函数一一对应,所述调用函数用于调用所述候选函数,所述第二分包包括所述候选函数;
解析模块,用于对所述第一分包进行解析,获得第一执行文件;
第一执行模块,用于执行所述第一执行文件,以运行所述目标应用程序,其中,所述第二分包与所述第一分包异步下载至所述终端。
12.一种计算机可读介质,其上存储有计算机程序,其特征在于,该程序被处理装置执行时实现权利要求1-6中任一项所述方法的步骤,或者该程序被处理装置执行时实现权利要求7-9中任一项所述方法的步骤。
13.一种电子设备,其特征在于,包括:
存储装置,其上存储有计算机程序;
处理装置,用于执行所述存储装置中的所述计算机程序,以实现权利要求1-6中任一项所述方法的步骤,或者实现权利要求7-9中任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211068075.4A CN115328506A (zh) | 2022-09-01 | 2022-09-01 | 应用程序包生成方法、加载方法、装置、介质及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211068075.4A CN115328506A (zh) | 2022-09-01 | 2022-09-01 | 应用程序包生成方法、加载方法、装置、介质及设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115328506A true CN115328506A (zh) | 2022-11-11 |
Family
ID=83929420
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211068075.4A Pending CN115328506A (zh) | 2022-09-01 | 2022-09-01 | 应用程序包生成方法、加载方法、装置、介质及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115328506A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116680014A (zh) * | 2023-08-01 | 2023-09-01 | 北京中电华大电子设计有限责任公司 | 数据处理方法和装置 |
-
2022
- 2022-09-01 CN CN202211068075.4A patent/CN115328506A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116680014A (zh) * | 2023-08-01 | 2023-09-01 | 北京中电华大电子设计有限责任公司 | 数据处理方法和装置 |
CN116680014B (zh) * | 2023-08-01 | 2023-11-14 | 北京中电华大电子设计有限责任公司 | 数据处理方法和装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110391938B (zh) | 用于部署服务的方法和装置 | |
CN113254105B (zh) | 资源处理方法和装置、存储介质和电子设备 | |
CN112395253B (zh) | 索引文件生成方法、终端设备、电子设备及介质 | |
US11934287B2 (en) | Method, electronic device and computer program product for processing data | |
CN111309747A (zh) | 数据同步方法、系统和装置 | |
CN111309304B (zh) | 一种生成idl文件的方法、装置、介质和电子设备 | |
CN110960855A (zh) | 一种通信协议代码更新方法、装置、电子设备及存储介质 | |
CN111597107B (zh) | 信息输出方法、装置和电子设备 | |
CN115203004A (zh) | 代码覆盖率测试方法、装置、存储介质及电子设备 | |
CN111338666A (zh) | 一种实现应用程序升级的方法、装置、介质和电子设备 | |
CN115328506A (zh) | 应用程序包生成方法、加载方法、装置、介质及设备 | |
CN113220281A (zh) | 一种信息生成方法、装置、终端设备及存储介质 | |
CN111752644A (zh) | 接口模拟方法、装置、设备及存储介质 | |
CN111198853A (zh) | 数据处理方法、装置、电子设备及计算机可读存储介质 | |
CN114115941A (zh) | 资源发送方法、页面渲染方法、装置、电子设备和介质 | |
CN114637531A (zh) | 应用程序接口动态生成方法及装置 | |
CN114116480A (zh) | 应用程序测试覆盖率的确定方法、装置、介质及设备 | |
CN112379967A (zh) | 模拟器检测方法、装置、设备及介质 | |
CN112667119A (zh) | 测点批量关联方法、装置、电子设备和计算机可读介质 | |
CN111796865A (zh) | 一种字节码文件修改方法、装置、终端设备及介质 | |
CN111309323A (zh) | 参数初始化方法、装置和电子设备 | |
CN111078259B (zh) | 一种音频打包方法、装置、电子设备及存储介质 | |
CN114968621B (zh) | 数据通信方法、装置、设备、存储介质和系统 | |
CN111562913B (zh) | 视图组件的预创建方法、装置、设备及计算机可读介质 | |
CN111291199B (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 |