CN117806686A - 应用程序的更新方法、装置、设备及计算机可读存储介质 - Google Patents

应用程序的更新方法、装置、设备及计算机可读存储介质 Download PDF

Info

Publication number
CN117806686A
CN117806686A CN202211175486.3A CN202211175486A CN117806686A CN 117806686 A CN117806686 A CN 117806686A CN 202211175486 A CN202211175486 A CN 202211175486A CN 117806686 A CN117806686 A CN 117806686A
Authority
CN
China
Prior art keywords
variable
global variable
pointer
global
type
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
CN202211175486.3A
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.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies 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 Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN202211175486.3A priority Critical patent/CN117806686A/zh
Priority to PCT/CN2023/104852 priority patent/WO2024066611A1/zh
Publication of CN117806686A publication Critical patent/CN117806686A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • G06F8/656Updates while running

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请公开了应用程序的更新方法、装置、设备及计算机可读存储介质,属于计算机技术领域。在该方法中,首先获取应用程序在更新前运行的第一代码和第一元数据,以及应用程序在更新后需要运行的第二代码和第二元数据。其中,第一元数据用于指示第一代码运行时引用的第一全局变量的属性信息,而第二元数据用于指示第二代码运行时引用的第二全局变量的属性信息。之后,基于第一全局变量的属性信息和第二全局变量的属性信息,得到第二全局变量。接着,基于第二全局变量,由运行第一代码切换为运行第二代码。由此,可以实现应用程序的更新。本申请可以自动的确定第二全局变量,不仅缩短了更新应用程序的耗时,而且实现了无需应用程序重启的热更新。

Description

应用程序的更新方法、装置、设备及计算机可读存储介质
技术领域
本申请涉及计算机技术领域,特别涉及应用程序的更新方法、装置、设备及计算机可读存储介质。
背景技术
在计算机设备中,安装有应用程序,应用程序可以运行代码。其中,通过对应用程序运行的代码进行切换,可以实现应用程序的更新,以使得应用程序满足各种业务需求。
发明内容
本申请提供了一种应用程序的更新方法、装置、设备及计算机可读存储介质,以实现应用程序的更新。本申请提供的技术方案包括如下几个方面。
第一方面,提供了一种应用程序的更新方法,在该方法中,首先获取应用程序在更新前运行的第一代码和第一元数据,以及应用程序在更新后需要运行的第二代码和第二元数据。其中,第一元数据用于指示第一代码运行时引用的第一全局变量的属性信息,而第二元数据用于指示第二代码运行时引用的第二全局变量的属性信息。之后,基于第一全局变量的属性信息和第二全局变量的属性信息,得到第二全局变量。接着,基于第二全局变量,由运行第一代码切换为运行第二代码。
本申请可以根据第一元数据获取第一全局变量的属性信息,根据第二元数据获取第二全局变量的属性信息,从而可以基于第一全局变量的属性信息和第二全局变量的属性信息,自动的得到第二全局变量。之后,便可以基于得到的第二全局变量,由第一代码切换为运行第二代码,从而实现应用程序的更新。
其中,由于第二代码运行时需要引用第二全局变量,而本申请已得到了第二全局变量,因而无需重启应用程序即可运行第二代码,也即是,无需应用程序便可以实现应用程序的更新,此种更新属于热更新。并且,本申请中是自动得到第二全局变量的,得到该第二全局变量的耗时较短,因而也缩短了更新应用程序的耗时,从而实现了应用程序的快速更新。由此可见,本申请可以对应用程序进行快速的热更新。
在一种可能的实现方式中,第一全局变量的属性信息包括第一全局变量的类型和名称,第二全局变量的属性信息包括第二全局变量的类型和名称;基于第一全局变量的属性信息和第二全局变量的属性信息,得到第二全局变量,包括:在第一全局变量与第二全局变量具有相同的类型和名称的情况下,基于第一全局变量得到第二全局变量。
如果第一全局变量与第二全局变量具有相同的类型和名称,则说明第一全局变量和第二全局变量属于同一个全局变量。因此,可以基于第一全局变量得到第二全局变量,保证了得到的第二全局变量的准确性。
在一种可能的实现方式中,第一元数据包括第一指针组,第一指针组包括第一全局变量类型指针和第一全局变量名称指针,第二元数据包括第二指针组,第二指针组包括第二全局变量类型指针和第二全局变量名称指针。其中,基于第一全局变量的属性信息和第二全局变量的属性信息,得到第二全局变量之前,方法还包括:根据第一指针组中的第一全局变量类型指针获取第一全局变量的类型,根据第一指针组中的第一全局变量名称指针获取第一全局变量的名称,第一全局变量的属性信息包括第一全局变量的类型和名称;根据第二指针组中的第二全局变量类型指针获取第二全局变量的类型,根据第二指针组中的第二全局变量名称指针获取第二全局变量的名称,第二全局变量的属性信息包括第二全局变量的类型和名称。
本申请中,通过第一元数据包括的第一指针组,以及第二元数据包括的第二指针组,实现对于第一全局变量和第二全局变量的类型和名称的获取。
在一种可能的实现方式中,第一全局变量的类型和第二全局变量的类型为基本类型。基于第一全局变量得到第二全局变量,包括:将第一全局变量作为第二全局变量。
如果第一全局变量和第二全局变量的类型均为基本类型,则说明第一全局变量和第二全局变量均为一个数值,直接将第一全局变量作为第二全局变量即可。
在一种可能的实现方式中,第一指针组包括第一全局变量地址指针,第二指针组还包括第二全局变量地址指针。将第一全局变量作为第二全局变量,包括:根据第一全局变量地址指针获取目标堆内存指针,目标堆内存指针用于获取第一全局变量;令第二全局变量地址指针指示目标堆内存指针。
由于令第二全局变量地址指针指示目标堆内存指针,因而根据第二全局变量指针可以获取目标堆内存指针。其中,目标堆内存指针用于指示第一全局变量在堆内存中的地址,因而根据目标堆内存指针又可以获取第一全局变量,也就相当于将第一全局变量作为了第二全局变量。此种方式直接复用了目标堆内存指针,缩短了得到第二全局变量的耗时,并且无需生成额外的指针,也无需占用额外的堆内存。
在一种可能的实现方式中,第一全局变量的类型和第二全局变量的类型为引用类型。基于第一全局变量得到第二全局变量,包括:在第一成员变量与第二成员变量全部相同的情况下,基于第二元数据更新第一全局变量,得到更新后的第一全局变量,第一成员变量为第一全局变量对应的成员变量,第二成员变量为第二全局变量对应的成员变量;将更新后的第一全局变量作为第二全局变量。
在第一全局变量对应的第一成员变量与第二全局变量对应的第二成员变量全部相同的情况下,说明第一全局变量的布局与第二全局变量的布局相同,全局变量的布局通过成员变量来体现。由于第一全局变量的类型和第二全局变量的类型均为引用类型,因而说明第一全局变量和第二全局变量均为对象,则需要基于第二元数据更新第一全局变量,将更新得到的更新后的第一全局变量作为第二全局变量。
在一种可能的实现方式中,第一指针组包括第一全局变量地址指针,第一元数据包括第三指针组,第二指针组包括第二全局变量地址指针,第二元数据包括第四指针组。基于第二元数据更新第一全局变量,得到更新后的第一全局变量,包括:根据第一全局变量地址指针获取目标堆内存指针;根据目标堆内存指针获取第一全局变量;令第一全局变量包括的头指针由指示第三指针组更新为指示第四指针组;将更新后的第一全局变量作为第二全局变量,包括:令第二全局变量地址指针指示目标堆内存指针。
第一全局变量和第二全局变量均为对象,具有对象头,对象头包括头指针,基于第二元数据对第一全局变量的更新,也即是将第一全局变量包括的头指针由指向第三指针组更新为指向第四指针组。并且,由于令第二全局变量地址指针指示目标堆内存指针,因而根据第二全局变量指针可以获取目标堆内存指针。其中,目标堆内存指针用于指示更新后的第一全局变量在堆内存中的地址,因而根据目标堆内存指针又可以获取更新后的第一全局变量,也就相当于将更新后的第一全局变量作为了第二全局变量。此种方式仅需简单的第一全局变量进行更新,便可以直接复用目标堆内存指针,缩短了得到第二全局变量的耗时,并且无需生成额外的指针,也无需占用额外的堆内存。
在一种可能的实现方式中,第一全局变量的类型和第二全局变量的类型为引用类型。则,基于第一全局变量得到第二全局变量,包括:在第一成员变量与第二成员变量部分相同的情况下,基于第二元数据生成第三全局变量,第一成员变量为第一全局变量对应的成员变量,第二成员变量为第二全局变量对应的成员变量,第三全局变量包括的头指针指示第二元数据包括的第四指针组,第三全局变量还包括第二成员变量的初始实例数据。基于第一全局变量包括的目标成员变量的实例数据,更新第三全局变量包括的目标成员变量的初始实例数据,得到更新后的第三全局变量,目标成员变量为第一成员变量和第二成员变量中相同的成员变量,将更新后的第三全局变量作为第二全局变量。
由于第一成员变量与第二成员变量是部分相同,而不再是全部相同,因而说明第一全局变量的布局与第二全局变量的布局不同。因此,不能再简单的更新第一全局变量,而是需要充分利用第二元数据生成新的第三全局变量,再基于第一全局变量更新第三全局变量,将更新后的第三全局变量作为第二全局变量。
在一种可能的实现方式中,第一元数据包括第三指针组,第三指针组包括第一父类指针和第一成员变量指针,第二元数据包括第四指针组,第四指针组包括第二父类指针和第二成员变量指针。方法还包括:根据第三指针组中的第一父类指针和第一成员变量指针获取第一成员变量的类型和名称,根据第四指针组中的第二父类指针和第二成员变量指针获取第二成员变量的类型和名称,基于第一成员变量和第二成员变量具有的类型和名称,确定第一成员变量与第二成员变量全部相同或者部分相同。
在本申请中,通过第一元数据包括的第三指针组,以及第二元数据包括的第四指针组,可以确定第一成员变量的类型和名称,以及第二成员变量的类型和名称。从而,可以基于第一成员变量和第二成员变量具有的类型和名称,确定第一成员变量与第二成员变量是部分相同还是全部相同。其中,将具有相同类型和名称的成员变量认为是相对应的成员变量,则如果第一成员变量与第二成员变量可以一一对应,说明第一成员变量与第二成员变量全部相同。如果第一成员变量与第二成员变量不可以一一对应,说明第一成员变量与第二成员变量部分相同。
在一种可能的实现方式中,基于第一全局变量包括的目标成员变量的实例数据,更新第三全局变量包括的目标成员变量的初始实例数据,得到更新后的第三全局变量,包括:在满足第一条件的情况下,将第三全局变量包括的目标成员变量的初始实例数据,更新为第一全局变量包括的目标成员变量的实例数据。第一条件包括:第一成员变量的类型和第二成员变量的类型为基本类型,或者,第一成员变量的类型和第二成员变量的类型为引用类型,且第一子成员变量与第二子成员变量全部相同,第一子成员变量为第一成员变量包括的目标成员变量的子成员变量,第二子成员变量为第二成员变量包括的目标成员变量的子成员变量。
如果第一成员变量和第二成员变量均为数值,或者,第一成员变量与第二成员变量均为对象,但对于第一成员变量和第二成员变量中相同的目标成员变量而言,该目标成员变量的布局未发生改变,则可以在第三全局变量中,将目标成员变量的初始实例数据更新为目标成员变量的实例数据,从而得到更新后的第三全局变量。其中,目标成员变量的布局通过子成员变量来体现,由于第一成员变量包括的目标成员变量的第一子成员变量,与第二成员变量包括的目标成员变量的第二子成员变量全部相同,因而说明目标成员变量的布局未发生改变。
在一种可能的实现方式中,基于第一全局变量包括的目标成员变量的实例数据,更新第三全局变量包括的目标成员变量的初始实例数据,得到更新后的第三全局变量,包括:在满足第二条件的情况下,将目标成员变量的初始实例数据包括的目标子成员变量的初始子实例数据,更新为目标成员变量的实例数据包括的目标子成员变量的子实例数据。其中,第二条件包括:第一成员变量的类型和第二成员变量的类型为引用类型,且第一子成员变量与第二子成员变量部分相同。并且,目标子成员变量为第一子成员变量和第二子成员变量中相同的子成员变量,第一子成员变量为第一成员变量包括的目标成员变量的子成员变量,第二子成员变量为第二成员变量包括的目标成员变量的子成员变量。
在此种实现方式中,由于第一子成员变量和第二子成员变量部分相同,因而说明目标成员变量的布局发生了改变,需要确定第一子成员变量和第二子成员变量中相同的目标子成员变量。其中,第三全局变量包括目标成员变量的初始实例数据,而目标成员变量的初始实例数据又包括各个第二子成员变量的初始子实例数据,目标子成员变量属于第二子成员变量,因而目标成员变量的初始实例数据包括了目标子成员变量的初始子实例数据。类似的,第一全局变量包括目标成员变量的实例数据,目标成员变量的实例数据又包括目标子成员变量的子实例数据。因此,可以将目标子成员变量的初始子实例数据替换为目标子成员变量的子实例数据,从而得到更新后的第三全局变量。
在一种可能的实现方式中,将更新后的第三全局变量作为第二全局变量,包括:令第二全局变量地址指针指示参考堆内存指针,参考堆内存指针用于获取更新后的第三全局变量。
由于令第二全局变量地址指针指示了参考堆内存指针,而根据参考堆内存指针可以获取更新后的第三全局变量,因而相当于将更新后的第三全局变量作为了第二全局变量,以保证第二代码运行时,能够根据第二全局地址指针正常引用第二全局变量。
在一种可能的实现方式中,方法还包括:在存在引用第一代码包括的第一符号的第三代码的情况下,将第三代码对应的全局偏移(global offset table,GOT)表中记载的第一符号的指针,修改为第二代码包括的第二符号的指针。其中,第一符号包括第一全局变量,且第二符号包括第二全局变量,第一全局变量和第二全局变量具有相同的类型和名称,和/或,第一符号包括第一函数,第二符号包括第二函数,第一函数和第二函数为相同的函数。
由此,第一符号和第二符号属于相同的符号,由于将第一符号的指针修改为第二符号的指针,因而可以使得第三代码不再引用第一符号,而是引用与第一符号相同的第二符号。也即是,解除了第三代码对旧的第一代码的依赖,使得第三代码重新依赖新的第二代码。
在一种可能的实现方式中,方法还包括:删除得到第二全局变量之后不需要使用的第一全局变量,和/或,删除第一代码和第一元数据。
将不需要使用的第一全局变量、第一代码、第一元数据删除之后,能够释放不需要使用的第一全局变量、第一代码、第一元数据所占用的内存,避免内存的浪费。
第二方面,提供了一种应用程序的更新装置,该装置包括:
获取模块,用于获取应用程序在更新前运行的第一代码和第一元数据,第一元数据用于指示第一代码运行时引用的第一全局变量的属性信息;
获取模块,还用于获取应用程序在更新后需要运行的第二代码和第二元数据,第二元数据用于指示第二代码运行时引用的第二全局变量的属性信息;
得到模块,用于基于第一全局变量的属性信息和第二全局变量的属性信息,得到第二全局变量;
切换模块,用于基于第二全局变量,由运行第一代码切换为运行第二代码。
在一种可能的实现方式中,第一全局变量的属性信息包括第一全局变量的类型和名称,第二全局变量的属性信息包括第二全局变量的类型和名称;得到模块,用于在第一全局变量与第二全局变量具有相同的类型和名称的情况下,基于第一全局变量得到第二全局变量。
在一种可能的实现方式中,第一元数据包括第一指针组,第一指针组包括第一全局变量类型指针和第一全局变量名称指针,第二元数据包括第二指针组,第二指针组包括第二全局变量类型指针和第二全局变量名称指针;获取模块,还用于根据第一指针组中的第一全局变量类型指针获取第一全局变量的类型;根据第一指针组中的第一全局变量名称指针获取第一全局变量的名称,第一全局变量的属性信息包括第一全局变量的类型和名称;根据第二指针组中的第二全局变量类型指针获取第二全局变量的类型;根据第二指针组中的第二全局变量名称指针获取第二全局变量的名称,第二全局变量的属性信息包括第二全局变量的类型和名称。
在一种可能的实现方式中,第一全局变量的类型和第二全局变量的类型为基本类型;得到模块,用于将第一全局变量作为第二全局变量。
在一种可能的实现方式中,第一指针组包括第一全局变量地址指针,第二指针组还包括第二全局变量地址指针;得到模块,用于根据第一全局变量地址指针获取目标堆内存指针,目标堆内存指针用于获取第一全局变量;令第二全局变量地址指针指示目标堆内存指针。
在一种可能的实现方式中,第一全局变量的类型和第二全局变量的类型为引用类型;得到模块,用于在第一成员变量与第二成员变量全部相同的情况下,基于第二元数据更新第一全局变量,得到更新后的第一全局变量,第一成员变量为第一全局变量对应的成员变量,第二成员变量为第二全局变量对应的成员变量;将更新后的第一全局变量作为第二全局变量。
在一种可能的实现方式中,第一指针组包括第一全局变量地址指针,第一元数据包括第三指针组,第二指针组包括第二全局变量地址指针,第二元数据包括第四指针组;得到模块,用于根据第一全局变量地址指针获取目标堆内存指针;根据目标堆内存指针获取第一全局变量;令第一全局变量包括的头指针由指示第三指针组更新为指示第四指针组;令第二全局变量地址指针指示目标堆内存指针。
在一种可能的实现方式中,第一全局变量的类型和第二全局变量的类型为引用类型;得到模块,用于在第一成员变量与第二成员变量部分相同的情况下,基于第二元数据生成第三全局变量,第一成员变量为第一全局变量对应的成员变量,第二成员变量为第二全局变量对应的成员变量,第三全局变量包括的头指针指示第二元数据包括的第四指针组,第三全局变量还包括第二成员变量的初始实例数据;基于第一全局变量包括的目标成员变量的实例数据,更新第三全局变量包括的目标成员变量的初始实例数据,得到更新后的第三全局变量,目标成员变量为第一成员变量和第二成员变量中相同的成员变量;将更新后的第三全局变量作为第二全局变量。
在一种可能的实现方式中,第一元数据包括第三指针组,第三指针组包括第一父类指针和第一成员变量指针,第二元数据包括第四指针组,第四指针组包括第二父类指针和第二成员变量指针;获取模块,还用于根据第三指针组中的第一父类指针和第一成员变量指针获取第一成员变量的类型和名称;根据第四指针组中的第二父类指针和第二成员变量指针获取第二成员变量的类型和名称;基于第一成员变量和第二成员变量具有的类型和名称,确定第一成员变量与第二成员变量全部相同或者部分相同。
在一种可能的实现方式中,得到模块,用于在满足第一条件的情况下,将第三全局变量包括的目标成员变量的初始实例数据,更新为第一全局变量包括的目标成员变量的实例数据;第一条件包括:第一成员变量的类型和第二成员变量的类型为基本类型,或者,第一成员变量的类型和第二成员变量的类型为引用类型,且第一子成员变量与第二子成员变量全部相同,第一子成员变量为第一成员变量包括的目标成员变量的子成员变量,第二子成员变量为第二成员变量包括的目标成员变量的子成员变量。
在一种可能的实现方式中,得到模块,用于在满足第二条件的情况下,将目标成员变量的初始实例数据包括的目标子成员变量的初始子实例数据,更新为目标成员变量的实例数据包括的目标子成员变量的子实例数据,目标子成员变量为第一子成员变量和第二子成员变量中相同的子成员变量,第一子成员变量为第一成员变量包括的目标成员变量的子成员变量,第二子成员变量为第二成员变量包括的目标成员变量的子成员变量;第二条件包括:第一成员变量的类型和第二成员变量的类型为引用类型,且第一子成员变量与第二子成员变量部分相同。
在一种可能的实现方式中,得到模块,用于令第二全局变量地址指针指示参考堆内存指针,参考堆内存指针用于获取更新后的第三全局变量。
在一种可能的实现方式中,装置还包括:修改模块,用于在存在引用第一代码包括的第一符号的第三代码的情况下,将第三代码对应的全局偏移GOT表中记载的第一符号的指针,修改为第二代码包括的第二符号的指针;第一符号包括第一全局变量,且第二符号包括第二全局变量,第一全局变量和第二全局变量具有相同的类型和名称,和/或,第一符号包括第一函数,第二符号包括第二函数,第一函数和第二函数为相同的函数。
在一种可能的实现方式中,装置还包括:删除模块,用于删除得到第二全局变量之后不需要使用的第一全局变量,和/或,删除第一代码和第一元数据。
第三方面,提供了一种应用程序的更新设备,设备包括存储器及处理器;存储器中存储有至少一条指令,至少一条指令由处理器加载并执行,以使应用程序的更新设备实现第一方面及其对应的可能的实现方式提供的应用程序的更新方法。
可选地,处理器为一个或多个,存储器为一个或多个。
可选地,存储器可以与处理器集成在一起,或者存储器与处理器分离设置。
第四方面,提供了一种计算机可读存储介质,计算机可读存储介质中存储有至少一条指令,指令由处理器加载并执行以实现第一方面及其对应的可能的实现方式提供的应用程序的更新方法。
第五方面,提供了一种计算机程序产品,计算机程序产品包括计算机程序/指令,计算机程序/指令被处理器执行,以使计算机实现第一方面及其对应的可能的实现方式提供的应用程序的更新方法。
第六方面,提供了一种芯片,包括处理器,用于从存储器中调用并运行存储器中存储的指令,使得安装有芯片的计算机执行第一方面及其对应的可能的实现方式提供的应用程序的更新方法。
第七方面,提供另一种芯片,包括:输入接口、输出接口、处理器和存储器,输入接口、输出接口、处理器以及存储器之间通过内部连接通路相连,处理器用于执行存储器中的代码,当代码被执行时,安装有芯片的计算机执行第一方面及其对应的可能的实现方式提供的应用程序的更新方法。
应当理解的是,本申请的第二方面至第七方面的技术方案及对应的可能的实现方式所取得的技术效果,可以参见上述对第一方面及其对应的可能的实现方式的技术效果,此处不再赘述。
附图说明
图1为本申请实施例提供的一种对象的结构示意图;
图2为本申请实施例提供的一种元数据的示意图;
图3为本申请实施例提供的另一种元数据的示意图;
图4为本申请实施例提供的又一种元数据的示意图;
图5为本申请实施例提供的再一种元数据的示意图;
图6为本申请实施例提供的还一种元数据的示意图;
图7为本申请实施例提供的一种应用程序的更新方法的流程图;
图8为本申请实施例提供的一种获取第一全局变量的流程图;
图9为本申请实施例提供的一种基于第一全局变量得到第二全局变量的流程图;
图10为本申请实施例提供的另一种获取第一全局变量的流程图;
图11为本申请实施例提供的一种修改符号的指针的流程图;
图12为本申请实施例提供的一种实施环境的示意图;
图13为本申请实施例提供的另一种实施环境的示意图;
图14为本申请实施例提供的一种得到第二共享库的流程图;
图15为本申请实施例提供的一种加载及内部链接的流程图;
图16为本申请实施例提供的一种进行删除的流程图;
图17为本申请实施例提供的又一种实施环境的示意图;
图18为本申请实施例提供的一种相关技术一的示意图;
图19为本申请实施例提供的一种相关技术二的示意图;
图20为本申请实施例提供的一种应用程序的更新装置的示意图;
图21为本申请实施例提供的一种应用程序的更新设备的示意图。
具体实施方式
本申请的实施方式部分使用的术语仅用于对本申请的具体实施例进行解释,而非旨在限定本申请。
本申请实施例提供了一种应用程序的更新方法,该应用程序的更新方法可以应用于计算机设备中,计算机设备例如为终端,在此不作限定。在应用程序的开发阶段,开发人员可能需要对应用程序进行调试,计算机设备通过执行该方法实现应用程序的更新,从而实现对应用程序的调试。在应用程序的使用阶段,开发人员可能需要修复应用程序存在的问题,或者对应用程序进行优化,优化例如为增加应用程序可以提供的功能,计算机设备通过执行该方法实现应用程序的更新,从而实现对应用程序的修复或优化。其中,对于应用程序的使用阶段,计算机设备可以在接收到服务器的指令时,执行该方法。
在说明本申请实施例提供的方法之前,首先对本申请实施例提供的方法所涉及的名词进行说明。
应用程序:属于一种软件,又称为应用软件。应用程序包括主(main)文件,执行main文件时需要运行共享库,也即是需要引用共享库。应用程序具有对应的进程。
共享库:包括代码和元数据,通过将源码编译为目标高级语言,能够得到代码。目标高级语言为任意一种计算机设备可以识别并执行的机器语言,在此不作限定。代码运行时需要引用代码记载的函数、常量和全局变量。采集全局变量的属性信息可以得到元数据,该元数据用于指示全局变量的属性信息。其中,共享库包括的代码和元数据均属于二进制文件。在Linux(一种操作***)中,该二进制文件的后缀为.so。在应用程序引用共享库之前,需要将共享库加载至内存,也即是共享库占用一块内存。
全局变量:全局变量的类型包括基本类型和引用类型。在全局变量的类型为基本类型的情况下,全局变量为一个数值。在全局变量的类型为引用类型的情况下,全局变量为一个对象。对象属于类的一个实例,类包括至少一个成员变量。类可以具有父类,父类也可以包括至少一个成员变量。成员变量的类型也可以包括基本类型和引用类型,在此不作赘述。
参见图1,对象包括对象头和实例数据,实例数据包括对象(也即是全局变量)对应的成员变量的实例数据,比如成员变量0的实例数据、成员变量1的实例数据等等。其中,当成员变量的类型为基本类型时,成员变量的实例数据为一个数值。当成员变量的类型为引用类型时,成员变量的实例数据为一个对象。在本申请实施例中,一个对象对应的成员变量包括但不限于:该对象对应的类包括的成员变量,和,该对象对应的类所具有的父类包括的成员变量。应理解的是,对象属于哪个类的实例,则哪个类即为对象对应的类。
元数据:如前所述,元数据用于指示全局变量的属性信息,结合图2至图6对元数据进行说明。
参见图2,图2为元数据的入口,每个共享库对应一个图2。该图2包括至少一个全局变量指针,比如全局变量0的全局变量指针、全局变量1的全局变量指针等等。共享库包括的代码所引用的每个全局变量对应一个全局变量指针。该全局变量指针用于指示内存中的一段地址,这段地址用于存储全局变量对应的图3,因而根据全局变量指针可以确定全局变量对应的图3。示例性地,图2还可以包括全局变量的总数量。
参见图3,每个变量对应一个图3。该变量可以是上述的全局变量或者成员变量。该图3包括变量类型指针、变量名称指针和变量地址/偏移指针。变量类型指针用于指示内存中的一段地址,这段地址用于存储变量的类型,即基本类型或引用类型,因而根据变量类型指针可以获取变量的类型。变量名称指针用于指示内存中的一段地址,这段地址用于存储变量的名称,因而根据变量名称指针可以获取变量的名称。
当变量为全局变量时,该变量地址/偏移指针为变量地址指针,该变量地址指针用于指示内存中的一段地址,这段地址用于存储一个堆内存指针,因而根据变量地址指针可以获取堆内存指针。该堆内存指针用于指示堆内存中的一段地址。当全局变量的类型为基本类型时,由于全局变量为一个数值,因而该堆内存中的一段地址用于存储一个数值。而当全局变量的类型为引用类型时,由于全局变量为一个对象,因而该堆内存中的一段地址用于存储一个对象。由此可见,根据堆内存指针可以获取全局变量,全局变量为一个数值或一个对象。其中,堆内存属于内存,但堆内存与共享库占用的内存为不同内存。也即是,将一整块内存划分为两部分,一部分内存由共享库占用,另一部分内存作为堆内存。
或者,当变量为成员变量时,该变量地址/偏移指针为变量偏移指针,该变量偏移指针用于指示内存中的一段地址,这段地址用于存储一个偏移值,该偏移值代表了成员变量的实例数据在对象中的偏移,根据该偏移值可以从对象中,获取成员变量的实例数据。由此可见,根据该变量偏移指针可以获取成员变量的实例数据。
示例性地,可以基于以上的说明将图3细化为图4和图5。其中,图4对应变量为全局变量的情况,图4包括全局变量地址指针、全局变量类型指针和全局变量名称指针。图5对应变量为成员变量的情况,图5包括成员变量偏移指针、成员变量类型指针和成员变量名称指针。图4和图5包括的各个指针,参见图3对应的说明即可,在此不作赘述。
参见图6,每个对象对应的类,对应一个图6。根据上文说明可知,对象包括对象头,参见图1可知,该对象头包括头指针,该头指针用于指示内存中的一段地址,该段地址用于存储对象对应的类所对应的图6,因而根据对象头包括的头指针可以从元数据中定位对象对应的类所对应的图6。
该图6包括类名称指针、成员变量指针和父类指针。类名称指针用于指示内存中的一段地址,这段地址用于存储类的名称,因而根据类名称指针可以获取类的名称。类包括的每个成员变量对应一个成员变量指针,该成员变量指针用于指示内存中的一段地址,这段地址用于存储成员变量对应的图5,因而根据该成员变量指针可以获取类包括的成员变量对应的图5。进而,可以根据图5包括的各个指针获取类包括的成员变量的实例数据、类包括的成员变量的类型和类包括的成员变量的名称。
父类指针用于指示内存中的一段地址。这段地址用于存储父类对应的图6,因而根据父类指针可以确定类的父类对应的图6。父类对应的图6也可以包括类名称指针、成员变量指针和父类指针。在该父类对应的图6中,根据类名称指针可以获取父类的名称,根据成员变量指针可以确定父类包括的成员变量对应的图5,进而可以根据图5包括的各个指针获取父类包括的成员变量的实例数据、父类包括的成员变量的类型和父类包括的成员变量的名称,而根据父类指针可以进一步确定父类的父类对应的图6。
对于一个类而言,可以根据该类对应的图6获取到该类包括的成员变量的实例数据、类型和名称,还可以根据该类对应的图6进行追溯,从而获取该类的所有父类包括的成员变量的实例数据、类型和名称。该类的所有父类包括但不限于该类的父类,该类的父类的父类等等,以此类推。
示例性地,该图6还可以包括接口指针,接口指针用于指示内存中的一段地址,该段地址用于存储对象所属的类所具有的接口。其中,接口是与父类并列的概念,一个类仅能具有一个父类,而一个类可以具有多个接口。
基于以上说明的各个名词,本申请实施例提供了一种应用程序的更新方法,该方法可以应用于计算机设备中。如图7所示,该方法包括如下的步骤701至步骤704。
步骤701,获取应用程序在更新前运行的第一代码和第一元数据,第一元数据用于指示第一代码运行时引用的第一全局变量的属性信息。
其中,第一代码和第一元数据位于第一共享库,该第一共享库是应用程序更新之前运行的,或者说引用的,旧共享库。在一些实施方式中,计算机设备获取旧版本源码之后,基于旧版本源码采集第一全局变量的属性信息,生成用于指示该第一全局变量的属性信息的第一元数据。并且,计算机设备将旧版本源码编译为目标高级语言,得到第一代码,该第一代码运行时需要引用第一全局变量。在另一些实施方式中,计算机设备可以直接获取第一代码和第一元数据,而无需自行生成及编译。第一元数据和第一全局变量的属性信息可以参见后文说明,此处暂不赘述。
示例性地,计算机设备可以接收服务器发送的旧版本源码,或者,获取开发人员输入的旧版本源码。在示例性实施例中,无论计算机设备如何获取旧版本源码,计算机设备均可以在获取到旧版本源码之后,检查该旧版本源码是否存在错误,例如语法错误。如果不存在错误,则计算机设备可以编译该旧版本源码得到第一代码。如果存在错误,则计算机设备可以对旧版本源码进行纠错,再编译纠错后的源码得到第一代码。该纠错过程可以由计算机设备执行,也可以由计算机设备提示开发人员执行。另外,对于计算机设备直接获取第一代码和第一元数据的情况,该第一代码和第一元数据也可以是服务器直接发送的,或是开发人员直接输入的。
当第一全局变量的类型为基本类型时,第一全局变量为一个数值。当第一全局变量的类型为引用类型时,第一全局变量为一个对象。对象为类的一个实例,类可以具有父类,类和父类可以分别包括至少一个成员变量,即第一全局变量对应的第一成员变量。第一成员变量的类型可以为基本类型或者引用类型。基本类型的第一成员变量为一个数值,引用类型的第一成员变量为一个对象,该对象也为类的一个实例,类也可以具有父类,类和父类又可以分别包括至少一个子成员变量,即第一成员变量对应的第一子成员变量,第一子成员变量的类型也可以为基本类型或者引用类型。按照全局变量、成员变量、子成员变量、更底层的成员变量的顺序可以不断类推,直至最底层的成员变量的类型均为基本类型为止。换言之,最底层的成员变量均为数值。
由此可见,无论第一全局变量的类型是基本类型还是引用类型,都可以认为第一全局变量由数值构成。如前所述,应用程序在更新之前会运行第一代码,而第一代码运行时需要引用第一全局变量。其中,在第一代码还未运行之前,构成该第一全局变量的数值均为初始值,该初始值可以根据实际需求进行设置,在此不作限定。在第一代码开始运行之后,随着该第一代码的不断运行,构成该第一全局变量的数值也可能发生变化,使得构成第一全局变量的数值不同于初始值。当然,无论构成第一全局变量的数值是否发生变化,用于指示第一全局变量的属性信息的第一元数据均不会发生变化。
步骤702,获取应用程序在更新后需要运行的第二代码和第二元数据,第二元数据用于指示第二代码运行时引用的第二全局变量的属性信息。
其中,第二代码和第二元数据位于第二共享库,该第二共享库是应用程序更新之后需要运行的,或者说需要引用的,新共享库。对应用程序的更新,也就是使得该应用程序由运行旧的第一代码,切换为运行新的第二代码。第一元数据和第一全局变量的属性信息可以参见后文说明,此处暂不赘述。
示例性地,计算机设备可以直接获取第二代码和第二元数据。或者,计算机设备获取新版本源码,基于新版本源码采集第二全局变量的属性信息,生成用于指示该第二全局变量的属性信息的第二元数据。并且,计算机设备将新版本源码编译为目标高级语言,得到第二代码,该第二代码运行时需要引用第二全局变量。计算机设备获取新版本源码的方式可以参见步骤701中获取旧版本源码的方式,计算机设备编译得到第二代码的方式可以参见步骤701中编译得到第一代码的方式,在此不作赘述。
当第二全局变量的类型为基本类型时,第二全局变量为一个数值。当第二全局变量的类型为引用类型时,第二全局变量为一个对象。其中,对象为类的一个实例,类可以具有父类,类和父类可以分别包括至少一个成员变量,即第二全局变量对应的第二成员变量。第二成员变量的类型可以为基本类型或引用类型。当第二成员变量为引用类型时,第二成员变量还可以包括第二子成员变量、更底层的成员变量等等。
在获取第二代码和第二元数据之后,计算机设备需要将第二代码和第二元数据加载至内存中,以便于应用程序在更新后运行第二代码。比如,计算机设备从硬盘中读取第二代码和第二元数据,将第二代码和第二元数据写入内存,从而实现将第二代码和第二元数据加载至内存。示例性地,计算机在完成加载之后,还可能需要进行内部链接和外部链接。
在一些实施方式中,如果第二代码定义的一个符号,被第二代码本身所引用,需要针对该符号进行内部符号链接。内部符号链接即为确定该符号与该符号的指针之间的对应关系,该对应关系用于引用该符号。在另一些实施方式中,如果第二代码需要引用其他共享库定义的符号,则需要对该符号进行外部符号链接。外部符号链接也是确定该符号与该符号的指针之间的对应关系,该对应关系也用于引用该符号。只不过该符号的指针由其他共享库提供,其他共享库也称为第二共享库依赖的共享库。示例性地,计算机设备可以上述对应关系存储于指定的表格中。比如,对于外部符号链接得到的对应关系,可以存储于GOT表中。
比如,符号为全局变量,此种情况下符号的指针即为图4所示的全局变量地址指针。又比如,符号为函数,此种情况下符号的指针即为函数入口地址指针,该函数入口地址指针用于指示内存中的一段地址,这段地址用于存储该函数。
上文说明了计算机设备将第二代码和第二元数据加载至内存,以及基于第二代码进行内部链接和外部链接的过程。应理解的是,在应用程序更新前运行第一代码之前,也会将第一代码和第一元数据加载至内存,并基于第一代码进行内部链接和外部链接,此处不再赘述。
步骤703,基于第一全局变量的属性信息和第二全局变量的属性信息,得到第二全局变量。
根据步骤701中的说明可知,应用程序运行第一代码之后,构成第一全局变量的数值可能发生变化,使得构成第一全局变量的数值不同于初始值。因此,可能需要基于第一全局变量得到第二全局变量,从而实现第一全局变量与第二全局变量的同步,参见如下的说明。
由于第一元数据指示第一全局变量的属性信息,因而可以根据第一元数据确定第一全局变量的属性信息。由于第二元数据指示第二全局变量的属性信息,因而可以根据第二元数据确定第二全局变量的属性信息。
示例性地,第一全局变量的属性信息包括第一全局变量的类型和名称,第二全局变量的属性信息包括第二全局变量的类型和名称。第一元数据包括第一指针组,第一指针组包括第一全局变量类型指针和第一全局变量名称指针,第二元数据包括第二指针组,第二指针组包括第二全局变量类型指针和第二全局变量名称指针。
相应地,基于第一全局变量的属性信息和第二全局变量的属性信息,得到第二全局变量之前,本申请实施例提供的方法还包括:根据第一指针组中的第一全局变量名称指针获取第一全局变量的名称,根据第一指针组中的第一全局变量类型指针获取第一全局变量的类型,根据第二指针组中的第二全局变量类型指针获取第二全局变量的类型,根据第二指针组中的第二全局变量名称指针获取第二全局变量的名称。
其中,虽然第一元数据包括上述的第一指针组,该第一指针组例如为图4所示的指针组,但计算机设备可能不确定第一指针组在第一元数据中的位置,因而需要从第一元数据中定位该第一指针组。第一元数据还可以包括第一全局变量指针,例如图2所示的全局变量指针,从而可以根据第一全局变量指针从第一元数据中定位第一指针组。相应地,第二元数据还可以包括第二全局变量指针,从而可根据第二全局变量指针从第二元数据中定位第二指针组。
由于获取了第一全局变量和第二全局变量所具有的类型和名称,因而相应地,基于第一全局变量的属性信息和第二全局变量的属性信息,得到第二全局变量,包括:在第一全局变量与第二全局变量具有相同的类型和名称的情况下,基于第一全局变量得到第二全局变量。
其中,对于一个第二全局变量而言,如果存在一个与该第二全局变量的类型相同、名称也相同的第一全局变量,则说明这个第二全局变量与这个第一全局变量为同一个全局变量,因而可以基于第一全局变量得到第二全局变量。当然,如果不存在这样的第一全局变量,则无需再基于第一全局变量得到第二全局变量,而是直接确定构成该第二全局变量的数值的初始值即可。
应理解的是,想要基于第一全局变量得到第二全局变量,则需要先获取第一全局变量,以实现基于第一全局变量得到第二全局变量。示例性地,参见图8,提供了一种获取第一全局变量的流程图,包括步骤81至步骤85。
步骤81,判断是否存在未遍历的第一全局变量指针。
根据上文说明可知,根据每个第一全局变量指针,可以定位一个第一指针组,从而可以确定一个第一全局变量的类型和名称,完成一次确定过程。计算机设备可以使用计数器记录完成确定过程的次数,每完成一次确定过程,计数器记录的次数加一。如果计数器记录的次数与第一元数据记录的全局变量的总数量相同,则可以确定已经遍历了所有的第一全局变量指针,也即是不存在未遍历的第一全局变量指针,可以结束遍历过程。或者,如果计数器记录的次数小于第一元数据记录的全局变量的总数量,则可以确定未遍历所有的第一全局变量指针,也即是还存在未遍历的第一全局变量指针,进入步骤82。
步骤82,判断是否存在与第一全局变量为同一个全局变量的第二全局变量。
每确定一个第一全局变量的类型和名称之后,遍历第二共享库中的第二全局变量指针,基于第二全局变量指针从第二元数据中定位第二指针组,根据第二指针组获取第二全局变量的类型和名称。如果第二全局变量的类型与第一全局变量的类型相同,且第二全局变量的名称与第二全局变量的名称相同,则说明存在与第一全局变量为同一个全局变量的第二全局变量,该第一全局变量为需要获取的全局变量,后续可以基于该第一全局变量得到第二全局变量,因而可以继续执行步骤83。当然,如果不存在与第一全局变量为同一个全局变量的第二全局变量,则可以返回至步骤81。
步骤83,判断需要获取的第一全局变量的类型是否为引用类型。
如果需要获取的第一全局变量的类型为引用类型,则继续执行步骤84。如果需要获取的第一全局变量的类型为引用类型,则继续执行步骤85。
步骤84,获取第一全局变量,第一全局变量为数值。
由于第一全局变量的类型为基本类型,因而第一全局变量为一个数值,则只需要获取第一全局变量即可。获取第一全局变量之后可以返回至步骤81。
步骤85,获取第一全局变量,第一全局变量包括第一成员变量。
由于第一全局变量的类型为引用类型,因而第一全局变量为一个对象,获取的第一全局变量包括第一全局变量对应的第一成员变量。之后,如果第一成员变量的类型为基本类型,则该第一成员变量为数值。或者,如果第一成员变量的类型为引用类型,则获取的第一成员变量仍为对象,第一成员变量包括第一子成员变量,以此类推,此处不再赘述。
在基于上述步骤81至步骤85获取第一全局变量之后,可以按照如下的三种情况,基于第一全局变量得到第二全局变量。
情况一,第一全局变量的类型和第二全局变量的类型为基本类型,则基于第一全局变量得到第二全局变量,包括:将第一全局变量作为第二全局变量。由于类型为基本类型,因而第一全局变量为一个数值,第二全局变量也应当为一个数值,直接将第一全局变量作为第二全局变量即可。
示例性地,第一指针组还包括第一全局变量地址指针,第二指针组还包括第二全局变量地址指针,第一指针组和第二指针组可以参见图4。相应地,将第一全局变量作为第二全局变量,包括:根据第一全局变量地址指针获取目标堆内存指针,目标堆内存指针用于获取第一全局变量;令第二全局变量地址指针指示目标堆内存指针。由于已经令第二全局变量地址指针指示目标堆内存指针,因而根据第二全局变量地址指针可以获取目标堆内存指针,根据目标堆内存指针可以获取第一全局变量,从而实现了将第一全局变量作为第二全局变量。
或者,区别于上述的情况一,第一全局变量的类型和第二全局变量的类型为引用类型,则可以参见如下的情况二和情况三。
情况二,在第一成员变量与第二成员变量全部相同的情况下,则基于第一全局变量得到第二全局变量,包括:基于第二元数据更新第一全局变量,得到更新后的第一全局变量,将更新后的第一全局变量作为第二全局变量。其中,第一成员变量为第一全局变量对应的成员变量,第二成员变量为第二全局变量对应的成员变量。情况二又称为对象复用。
比如,第一全局变量包括的第一成员变量,以及第二全局变量包括的第二成员变量,均为且仅为:成员变量0、成员变量1和成员变量2,则说明第一成员变量与第二成员变量全部相同。或者说,第一全局变量的布局与第二全局变量的布局相同,全局变量的布局通过成员变量来体现。
示例性地,可以基于第一成员变量和所述第二成员变量具有的类型和名称,确定所述第一成员变量与所述第二成员变量是否全部相同。比如说,可以遍历所有的第二成员变量,如果对于每个第二成员变量而言,均存在一个与该第二成员变量的类型相同、名称也相同的第一成员变量,且除了这些第一成员变量之外也不存在其他的第一成员变量,则说明第一成员变量与第二成员变量全部相同。
由于需要使用第一成员变量和第二成员变量的类型和名称,因而需要对第一成员变量和第二成员变量的类型和名称进行获取。示例性地,第一元数据包括第三指针组,第三指针组包括第一父类指针和第一成员变量指针,第二元数据包括第四指针组,第四指针组包括第二父类指针和第二成员变量指针。方法还包括,根据第三指针组中的第一父类指针和第一成员变量指针获取第一成员变量的类型和名称,根据第四指针组中的第二父类指针和第二成员变量指针获取第二成员变量的类型和名称。
其中,第三指针组和第四指针组例如为图6所示的指针组。示例性地,第一指针组还可以包括第一全局变量地址指针,第三指针组还可以包括第一类名称指针,第二指针组还可以包括第二全局变量地址指针,第四指针组还可以包括第二类名称指针。则,首先根据第一全局变量地址指针获取目标堆内存指针,根据该目标堆内存指针获取第一全局变量,该第一全局变量包括的头指针指示第三指针组,因而根据第一全局变量包括的头指针可从第一元数据中定位第三指针组。之后,根据第一指针组中的第一类名称指针可以获取第一全局变量对应的类的名称,根据第一全局变量的类的名称可以确定第四指针组。第一全局变量对应的类的名称,与根据第四指针组中的第二类名称指针获取的第二全局变量对应的类的名称相同。也即是,在确定过程中,根据哪个第四指针组包括的第二类名称指针获取的第二全局变量对应的类的名称,与第一全局变量对应的类的名称相同,则从第二元数据中定位出哪个第四指针组。
针对该第三指针组,根据第三指针组中的第一父类指针可以获取父类包括的成员变量的类型和父类包括的成员变量的名称,根据第三指针组中的第一成员变量指针可以获取类包括的成员变量的类型和类包括的成员变量的名称。其中,第一全局变量对应的第一成员变量,包括:第一全局变量对应的类包括的成员变量,以及,该类的父类包括的成员变量。因此,根据第一父类指针和第一成员变量指针所获取的,即为第一全局变量对应的第一成员变量的类型和名称。
其中,第一成员变量对应第五指针组,该第五指针组为图5所示的指针组。根据第一父类指针和第一成员变量指针,均可以获取第一成员变量的第五指针组,该第五指针组包括第一成员变量偏移指针、第一成员变量类型指针和第一成员变量名称指针。由此,便可以根据第一成员变量类型指针获取第一成员变量的类型,根据第一成员变量名称指针获取第一成员变量的名称。另外,根据第一成员变量偏移指针,可以从第一全局变量中获取第一成员变量的实例数据,该第一成员变量的实例数据的作用参见后文说明。
针对该第四指针组,根据第四指针组中的第二父类指针可以获取父类包括的成员变量的类型和父类包括的成员变量的名称,根据第四指针组中的第二成员变量指针可以获取类包括的成员变量的类型和类包括的成员变量的名称,从而得到第二全局变量对应的第二成员变量的类型和名称。
其中,第二成员变量对应第六指针组,该第六指针组包括第二成员变量偏移指针、第二成员变量类型指针和第二成员变量名称指针,该第六指针组为图5所示的指针组。根据第二成员变量类型指针可获取第二成员变量的类型,根据第二成员变量名称指针获取第二成员变量的名称。另外,根据第二成员变量偏移指针,可以从第二全局变量中获取第二成员变量的实例数据,该第二成员变量的实例数据的作用参见后文说明。
示例性地,在情况二中,基于第二元数据更新第一全局变量,得到更新后的第一全局变量,包括:根据第一全局变量地址指针获取目标堆内存指针;根据目标堆内存指针获取第一全局变量;令第一全局变量包括的头指针由指示第三指针组更新为指示第四指针组。
其中,由于第一全局变量为第一代码引用的全局变量,第一元数据与第一代码位于同一个第一共享库中,因而第一全局变量的头指针指示的指针组,为第一元数据包括的第三指针组。但是,由于第一共享库已经是旧共享库,后续不再使用该旧共享库,因而需要修改第一全局变量的头指针,使得第一全局变量的头指针指示位于新共享库的第二元数据包括的第四指针组,新共享库也即是第二共享库。修改了头指针的第一全局变量,也即是更新后的第一全局变量。
相应地,将更新后的第一全局变量作为第二全局变量,包括:令第二全局变量地址指针指示目标堆内存指针。由于已经令第二全局变量地址指针指示目标堆内存指针,因而根据第二全局变量地址指针可以获取目标堆内存指针,根据目标堆内存指针可以获取更新后的第一全局变量,从而实现了将更新后的第一全局变量作为第二全局变量。
情况三,在第一成员变量与第二成员变量部分相同的情况下,则基于第一全局变量得到第二全局变量,包括:基于第二元数据生成第三全局变量;基于第一全局变量包括的目标成员变量的实例数据,更新第三全局变量包括的目标成员变量的初始实例数据,得到更新后的第三全局变量;将更新后的第三全局变量作为第二全局变量。其中,第一成员变量为第一全局变量对应的成员变量,第二成员变量为第二全局变量对应的成员变量。
比如,第一全局变量包括的第一成员变量为成员变量0和成员变量1,那么如果第二全局变量包括的第二成员变量仅为成员变量0,或者仅为成员变量1,或者除了包括成员变量0和成员变量1之外还包括成员变量3,则说明第一成员变量与第二成员变量部分相同。由于第一成员变量与第二成员变量部分相同,且全局变量的布局通过成员变量来体现,因而第一全局变量的布局与第二全局变量的布局不同。
示例性地,可以基于第一成员变量和所述第二成员变量具有的类型和名称,确定所述第一成员变量与所述第二成员变量是否部分相同。本申请实施例中,可以遍历所有的第一成员变量,以及所有的第二成员变量。如果对于一个第一成员变量而言,不存在一个与该第一成员变量的类型、名称均相同的第二成员变量,和/或,对于一个第二成员变量而言,不存在一个与该第二成员变量的类型、名称均相同的第一成员变量,则说明第一成员变量与第二成员变量仅部分相同。对于第一成员变量和第二成员变量所具有的类型和名称的获取方式,可以参见上文情况二中的说明,在此不作赘述。
其中,本申请实施例将第一成员变量和第二成员变量中相同的成员变量,作为目标成员变量。例如,第一成员变量为成员变量0,第二成员变量为成员变量0和成员变量1,则目标成员变量即为成员变量0。
如前所述,第三全局变量基于第二元数据生成,因而第三全局变量包括的头指针指示第二元数据包括的第四指针组。另外,第三全局变量还包括第二成员变量的初始实例数据,类似于全局变量,成员变量也可以认为是由数值构成的,初始实例数据即为初始值。
需要说明的是,相比于第一全局变量,该第三全局变量占用堆内存中的一段新的地址。需要使得第三全局变量占用一段新的地址的原因在于,第一成员变量与第二成员变量仅部分相同,如果仍然使用第一全局变量在堆内存中占用的旧的地址,则该旧的地址的长度可能并不合适。比如,第二成员变量多于第一成员变量,则这段旧的地址无法存储每个第二成员变量的实例数据。又比如,第二成员变量少于第一成员变量,则这段旧的地址虽然可以存储每个第二成员变量的实例数据,但会造成堆内存的浪费。因此,在第一成员变量与第二成员变量仅部分相同的情况下,需要基于第二元数据生成第三全局变量,该第三全局变量占用堆内存中的一段新的地址。
在示例性实施例中,情况三可以进一步分为如下的情况1和情况2。
情况1,基于第一全局变量包括的目标成员变量的实例数据,更新第三全局变量包括的目标成员变量的初始实例数据,得到更新后的第三全局变量,包括:在满足第一条件的情况下,将第三全局变量包括的目标成员变量的初始实例数据,更新为第一全局变量包括的目标成员变量的实例数据。情况1又称为浅拷贝。
该第一条件为:第一成员变量的类型和第二成员变量的类型为基本类型。或者,第一条件为:第一成员变量的类型和第二成员变量的类型为引用类型,且第一子成员变量与第二子成员变量全部相同。如果第一子成员变量与第二子成员变量全部相同,则说明第一成员变量的布局与第二成员变量的布局相同,成员变量的布局通过子成员变量来体现。其中,第一子成员变量为第一成员变量包括的目标成员变量的子成员变量,第二子成员变量为第二成员变量包括的目标成员变量的子成员变量。
其中,第一全局变量的属性信息还包括第一成员变量的第一子成员变量的属性信息,例如第一子成员变量的类型和名称。第二全局变量的属性信息还包括第二成员变量的子成员变量的属性信息,例如第二子成员变量的类型和名称。相应地,基于第一子成员变量的和第二子成员变量的类型和名称可以确定第一子成员变量与第二子成员变量是否全部相同。获取子成员变量的类型和名称的方式,以及确定子成员变量是否全部相同的方式,可参考上文说明中获取成员变量的类型和名称的方式,以及确定成员变量是否全部相同的方式,不再赘述。
另外,根据上文说明可知,根据第一成员变量偏移指针,可以从第一全局变量中获取第一成员变量的实例数据。由于目标成员变量属于第一成员变量,因而根据该第一成员变量偏移指针便可以从第一全局变量中获取目标成员变量的实例数据。根据上文说明还可知,根据第二成员变量偏移指针,可以从第二全局变量中获取第二成员变量的实例数据,由于第二成员变量偏移指针位于第二元数据中,而第三全局变量是基于第二元数据生成的,因而基于第二成员变量偏移指针可以从第三全局变量中获取目标成员变量的初始实例数据。
以前一种第一条件为例。第一成员变量包括成员变量0,成员变量0的实例数据为数值5。第二成员变量包括成员变量0和成员变量1,第三成员变量中,成员变量0的初始实例数据为数值1,成员变量1的初始实例数据0。由于目标成员对象为成员变量0,因而在第三成员变量中,将成员变量0由数值1替换为数值5,而成员变量1的数值1保持不变,得到更新后的第三成员变量。
又比如,以后一种第一条件为例,第一成员变量包括成员变量0,而成员变量0的第一子成员变量包括子成员变量01和子成员变量02。第二成员变量包括成员变量0和成员变量1,且成员变量0的第二子成员变量包括子成员变量01和子成员变量02。由此可见,第一成员变量与第二成员变量部分相同,相同的目标成员变量为成员变量0,且第一子成员变量与第二子成员变量全部相同,属于该情况1。因此,在第三成员变量中,成员变量1的初始实例数据保持不变,成员变量0的初始实例数据,被替换为第一全局变量包括的成员变量0的实例数据。或者说,第一全局变量包括的成员变量0的实例数据,覆盖了第三成员变量中的成员变量0的初始实例数据。由此,得到更新后的第三全局变量。
情况2,基于第一全局变量包括的目标成员变量的实例数据,更新第三全局变量包括的目标成员变量的初始实例数据,得到更新后的第三全局变量,包括:在满足第二条件的情况下,将目标成员变量的初始实例数据包括的目标子成员变量的初始子实例数据,更新为目标成员变量的实例数据包括的目标子成员变量的子实例数据,目标子成员变量为第一子成员变量和第二子成员变量中相同的子成员变量,第一子成员变量为第一成员变量包括的目标成员变量的子成员变量,第二子成员变量为第二成员变量包括的目标成员变量的子成员变量。情况2又称为深拷贝。
其中,第二条件包括:第一成员变量的类型和第二成员变量的类型为引用类型,第一子成员变量和第二子成员变量部分相同。也即是,第一成员变量的布局与第二成员变量的布局不同。本申请实施例可以基于第一子成员变量的和第二子成员变量的类型和名称,确定第一子成员变量与第二子成员变量是否部分相同。确定子成员变量是否部分相同的方式,可参考上文说明中确定成员变量是否部分相同的方式,不再赘述。
比如,第一成员变量包括成员变量0,而成员变量0的第一子成员变量包括子成员变量01和子成员变量02。第二成员变量包括成员变量0和成员变量1,且成员变量0的第二子成员变量包括子成员变量01和子成员变量03。由此可见,第一成员变量与第二成员变量部分相同,相同的目标成员变量为成员变量0,且第一子成员变量与第二子成员变量部分相同,相同的目标子成员变量为子成员变量01,属于该情况2。因此,在第三成员变量中,成员变量1的初始实例数据保持不变,在成员变量0中,子成员变量03的初始实例数据保持不变,而子成员变量03的初始子实例数据,被替换为第一全局变量包括的子成员变量01的子实例数据。或者说,第一全局变量包括的子成员变量01的子实例数据,覆盖了第三成员变量中的子成员变量01的初始子实例数据。由此,得到更新后的第三全局变量。
示例性地,无论是情况1还是情况2,将更新后的第三全局变量作为第二全局变量,均可以包括:令第二全局变量地址指针指示参考堆内存指针,参考堆内存指针用于获取更新后的第三全局变量。由于已经令第二全局变量地址指针指示参考堆内存指针,因而根据第二全局变量地址指针可以获取参考堆内存指针,根据参考堆内存指针可以获取更新后的第三全局变量,从而实现了将更新后的第三全局变量作为第二全局变量。
综合以上的情况一、情况二和情况三,本申请实施例中基于第一全局变量得到第二全局变量的过程,或者说将第一全局变量同步为第二全局变量的过程,可以为图9所示的过程,该过程包括步骤91至步骤912。
步骤91,判断是否存在未完成同步的第二全局变量。
如果存在未完成同步的第二全局变量,则需要继续执行步骤92。如果不存在未完成同步的第二全局变量,也即是所有需要进行同步的第二全局变量都完成同步,则结束。
步骤92,判断第二全局变量的类型是否为引用类型。
如果第二全局变量的类型不是引用类型,即第二全局变量的类型为基本类型,则继续执行步骤93。或者,如果第二全局变量的类型为引用类型,则继续执行步骤94。
步骤93,将第一全局变量作为第二全局变量。
步骤93的实现方式可以参见上文情况一中的说明。完成步骤93后,返回至步骤91。
步骤94,判断第一全局变量对应的第一成员变量和第二全局变量对应的第二成员变量是否全部相同。
如果第一成员变量和第二成员变量全部相同,则可以继续执行步骤95。如果第一成员变量和第二成员变量部分相同,则可以继续执行步骤96。
步骤95,更新第一全局变量,并将更新后的第一全局变量作为第二全局变量。
步骤95的实现方式可以参见上文情况二中的说明。完成步骤95后,返回至步骤91。
步骤96,基于第二元数据生成第三全局变量。
步骤96的实现方式可以参见上文情况三中的说明。完成步骤96之后,需要继续执行步骤97。
步骤97,确定目标成员变量。
将第一成员变量与第二成员变量中相同的成员变量确定为目标成员变量,然后继续执行步骤98。
步骤98,判断是否满足第一条件。
如果满足第一条件,则执行步骤99。如果不满足第一条件,继续执行步骤910。其中,第一条件参见上文情况三包括的情况1中的说明。
步骤99,将第三全局变量包括的目标成员变量的初始实例数据,更新为第一全局变量包括的目标成员变量的实例数据。
步骤99的实现方式参见上文情况三包括的情况1中的说明,在完成步骤99之后,继续执行步骤912。
步骤910,满足第二条件。
其中,由于不满足第一条件,因而满足第二条件,第二条件参见上文情况三包括的情况2中的说明。在完成步骤910之后,继续执行步骤911。
步骤911,将目标成员变量包括的目标子成员变量的初始子实例数据,更新为目标成员变量包括的目标子成员变量的子实例数据。
步骤911的实现方式参见上文情况三包括的情况2中的说明,在完成步骤911之后,也继续执行步骤912。
步骤912,将更新后的第三全局变量作为第二全局变量。
步骤912的实现方式参见上文情况三中的说明。在完成步骤912后,返回至步骤91。
基于上述步骤91至步骤912,能够实现第一全局变量与第二全局变量的同步,也即是实现了基于第一全局变量得到第二全局变量。
步骤704,基于第二全局变量,由运行第一代码切换为运行第二代码。
通过步骤703,已经确定了第二全局变量,则第二代码可以引用该第二全局变量并运行。因此,应用程序可以由运行旧的第一代码切换为运行新的第二代码,从而实现了应用程序的更新。由于本申请实施例提供了一种确定第二全局变量的方式,因而无需开发人员手动同步第一全局变量与第二全局变量,提高了更新应用程序的效率。另外,正是由于确定了第二全局变量,因而无需再重新启动应用程序并通过赋初始值的方式确定第二全局变量,使得对于应用程序的更新是既无需重新启动计算机设备、也无需重新启动应用程序的热更新过程。
在示例性实施例中,不同共享库之间可能存在依赖关系。比如存在第三共享库,依赖于旧的第一共享库。其中,第三共享库依赖于第一共享库是指,第三共享库包括的第三代码需要引用第一共享库包括的符号,相应地,本申请实施例提供的方法还包括:在存在引用第一代码包括的第一符号的第三代码的情况下,将第三代码对应的GOT表中记载的第一符号的指针,修改为第二代码包括的第二符号的指针。也就是说,如果存在依赖于第一共享库的第三共享库,则将第一共享库更新为第二共享库之后,也使得第三共享库不再依赖于第一共享库,解除了第三共享库与第一共享库之间的依赖关系,第三共享库改为依赖第二共享库。
其中,第一符号包括第一全局变量,且第二符号包括第二全局变量,该第一全局变量与第二全局变量具有相同的类型和名称。和/或,第一符号包括第一函数,第二符号包括第二函数,第一函数和第二函数为相同的函数。也即是,符号包括全局变量和/或函数。符号的指针可以参见上文步骤702中关于符号的指针的说明,在此不作赘述。
在示例性实施例中,参见图10,由于第三共享库包括的第三代码需要引用第一共享库包括的符号,因而除了获取第一全局变量之外,还需要确定依赖第一共享库的第三共享库,即图10所示的步骤101。另外,图10所示的步骤102至步骤106即为获取第一全局变量的步骤,这些步骤参见分别参见图8对应的步骤81至步骤85即可,此处不再赘述。
另外,参见图11,图11示出了修改符号的指针的过程,包括步骤111至步骤115。
步骤111,判断其他共享库是否依赖另外的共享库。
应用程序在运行时可能需要引用多个共享库,多个共享库之间可能存在依赖关系。其他共享库是指应用程序在更新前引用的各个共享库中除第一共享库之外的共享库,如果其他共享库依赖另外的共享库,也就是依赖除它本身之外的共享库,则继续执行步骤112,如果其他共享库不依赖任何共享库,则结束方法。
步骤112,判断其他共享库依赖的共享库是否为第一共享库。
如果其他共享库只依赖于除第一共享库之外的共享库,则认为在将第一共享库更新为第二共享库之后,不影响其他共享库,可以结束方法,如果其他共享库依赖第一共享库,则认为将第一共享库更新为第二共享库之后可能会对其他共享库产生影响,则需要继续执行步骤113。
步骤113,判断其他共享库依赖的符号是否为第一符号。
如果其他共享库的代码中依赖的符号不是第一符号,则认为将第一符号更新为第二符号之后,不影响其他共享库,可以结束方法,而如果其他共享库的代码中依赖的符号为第一符号,则认为其他共享库属于上述的第三共享库,第三共享库包括上述引用第一符号的第三代码。因此,将第一符号更新为第二符号之后会影响该第三代码,需要继续执行步骤114。
步骤114,第二共享库中查找第一符号对应的第二符号的指针。
在将第一符号更新为第二符号之前,第三共享库中的GOT表中记载第一符号的指针,由于将第一符号更新为第二符号,需要将GOT表中记载的第一符号的指针修改为第二符号的指针。因此,在第二共享库中查找第二符号的指针,并且继续执行步骤115。
步骤115,第二符号的指针写入其他共享库的GOT表。
将第三代码对应的GOT表中记载的第一符号的指针,修改为步骤114中查找的第二符号的指针,以解除第三共享库与第一共享库之间的依赖关系,第三共享库由依赖第一共享库改为依赖第二共享库。
在示例性实施例中,方法还包括:删除得到第二全局变量之后不需要使用的第一全局变量,和/或,删除第一代码和第一元数据。
其中,除了上述的情况一中被作为第二全局变量的第一全局变量,以及上述的情况二中被作为第二全局变量的更新后的第一全局变量之外,其他第一全局变量均可以认为是确定第二全局变量之后不需要使用的第一全局变量。另外,由于已经有新的第二代码和新的第二元数据,因而不再需要使用旧的第一代码和旧的第一元数据,从而可以删除第一代码和第一元数据。通过及时删除,可以释放内存,避免浪费内存。
本申请实施例提供的应用程序的更新方法,可以应用于图12所示的实施场景中,该实施场景位于计算机设备中。参见图12,该实施场景包括编译器、共享库模块和运行时引擎,编译器和运行时引擎均为软件。
编译器包括代码生成模块和元数据生成模块,代码生成模块用于将源码编译为目标高级语言,得到代码,元数据生成模块用于生成元数据,元数据指示代码引用的全局变量的属性信息。对于旧版本源码,生成的第一代码和第一元数据位于第一共享库内,应用程序的主文件在更新前运行第一共享库,第一共享库可以表示为lib*.so。而对于新版本源码,生成的第二代码和第二元数据位于第二共享库内,应用程序的主文件在更新后运行第二共享库,第二共享库可以表示为libnew*.so。示例性地,编译器还可以包括图12未示出的优化模块,用于在编译过程中进行纠错等优化。
运行时引擎包括内存管理模块和更新模块,更新模块包括加载模块、链接模块、同步模块和卸载模块。其中,加载模块用于在接收到更新请求之后,将第二代码和第二元数据加载至内存,即第二共享库占用的内存该内存由内存管理模块分配。链接模块用于针对第二代码和第二元数据实现内部符号链接和外部符号链接。同步模块用于基于第一全局变量得到第二全局变量,内存管理模块还用于分配堆内存,该堆内存用于存储第二全局变量。在实现应用程序更新之后,卸载模块可以调用内存管理模块,删除确定第二全局变量之后不需要使用的第一全局变量,并删除第一代码和第一元数据,从而释放内存。卸载模块也称为回收模块。示例性地,运行时引擎还可以包括其他功能模块,在此不作限定。比如,其他功能模块可以为异常处理模块,该异常处理模块用于处理应用程序在运行时出现的异常情况。
本申请实施例还提供了一种不存在依赖关系的实施场景,参见图13,该实施场景包括:插件化组件、容器、操作***(operating system,OS)和硬件层,插件化组件中包括至少一个组件,例如组件1、组件2,容器中可以包括但不限于运行时引擎。其中,一个组件即可以作为一个共享库,运行时引擎例如为图12所示的运行时引擎。在该实施场景中,各个组件之间没有依赖关系,并且各个组件之间通过容器进行消息传递。比如,容器中可以具有进程通信管理模块、信号管理模块、消息处理包括和数据库管理模块中的至少一个模块,可以通过该至少一个模块进行消息传递。在该实施场景中,实施步骤包括如下的步骤131至步骤135。
步骤131,参见图14,获取第二全局变量的属性信息,并根据第二全局变量的属性信息生成第二元数据,第二全局变量的属性信息和第二元数据可参见方法实施例中的说明。另外,将第二元数据保存至第二共享库中,即新共享库中。
步骤132,参见图15,将第二共享库加载至内存中,进行第二共享库的内部链接工作。
步骤133,获取第一全局变量。其中,步骤133可以参见步骤703中图8对应的说明。
步骤134,基于第一全局变量得到第二全局变量。步骤134可以参见步骤703中图9对应的说明。
步骤135,参见图16,删除不需要使用的第一全局变量,删除第一代码和第一元数据。
本申请实施例还提供了另一种存在依赖关系的实施场景,参见图17,该实施场景为安卓组件化框架设计场景,例如一个应用程序壳工程。该实施场景包括:业务组件、公共组件和运行环境。业务组件中包括至少一个子业务组件,例如子业务组件1、子业务组件2等等,子业务组件用于提供用户登录等功能。公共组件中包括但不限于网络库和适配库两部分,适配库用于将应用程序壳工程适配于不同的运行环境,网络库有多种形式,用于存储应用程序壳工程所需的网络数据。运行环境包括运行时引擎,该运行时引擎例如为图12所示的运行时引擎。
在该实施场景中,一个子业务组件可以作为一个共享库,公共组件也可以作为一个共享库。示例性地,子业务组件与公共组件之间可以具有依赖关系。另外,不同的子业务组件之间可以不存在依赖关系。如果存在多个公共组件,则不同的公共组件之间也具有依赖关系,也可以不具有依赖关系。在该实施场景中,实施步骤包括如下的步骤171至步骤176。
步骤171,参见图14,获取第二全局变量的属性信息,生成第二元数据,将第二元数据保存至第二共享库中。
步骤172,将第二共享库加载至内存中,进行第二共享库的内部链接工作。此外,还进行第二共享库的外部链接工作。步骤172可以参见步骤702中的说明。比如,如果一个公共组件为第二共享库,依赖于另一个公共组件,则在完成加载之后,需要针对第二共享库进行内部链接工作和外部链接工作。
步骤173,获取第一全局变量。其中,步骤173可以参见步骤703中图8对应的说明。
步骤174,基于第一全局变量得到第二全局变量。步骤174可以参见步骤703中图9对应的说明。
步骤175,修改符号的指针。比如,如果一个公共组件为第二共享库,而一个子业务组件依赖于该第二共享库,也即是子业务组件包括的代码引用了第二共享库对应的第一共享库,则需要修改该子业务组件包括的GOT表中符号的指针,参见步骤704中的说明。
步骤176,参见图16,删除不需要使用的第一全局变量,删除第一代码和第一元数据。
下面,对相关技术一、相关技术二和本申请实施例进行对比说明。
相关技术一在更新应用程序时,需要依赖一种Erlang(一种动态编程语言)虚拟机,该Erlang虚拟机可以参见图18。
在更新过程中,开发人员开发新版本源码,将新版本源码编译为新版本文件,该新版本文件具有Erlang虚拟机所能识别的特定格式,即Erlang指定的格式。Erlang虚拟机获取新版本文件之后,将新版本文件翻译为新版本代码,新版本代码为应用程序更新之后需要使用的代码。该新版本代码包括Erlang术语存储(Erlang term storage,ETS)对象。其中,Erlang虚拟机不支持全局变量,所以使用ETS对象代替全局变量。
在Erlang虚拟机加载该新版本代码之后,使用Erlang虚拟机的用户需要从ETS表中获取旧版本代码包括的ETS对象,手动将ETS对象拷贝至新版本代码中,旧版本代码为应用程序更新之前使用的代码。在完成手动拷贝后,应用程序可以由运行旧版本代码切换为运行新版本代码。其中,应用程序是基于进程运行各版本代码的。
相关技术一存在的技术问题包括但不限于如下的技术问题一和技术问题二。
技术问题一,需要用户手动进行拷贝,以实现ETS对象的同步。此种方式较为繁琐,效率较低,增加了应用程序的更新时间。
技术问题二,由于不支持全局变量,因而需要采用ETS对象,并配合ETS表使用,使用过程会占用较多的内存。并且,使用Erlang这种动态编程语言的过程,本身也会生成额外的抽象码,导致占用较多的内存。由此可见,相关技术一需要占用较多的内存,影响应用程序的运行速度。
针对技术问题一,本申请实施例可以自动得到全局变量,无需用户手动操作,缩短了应用程序的更新时间。针对技术问题二,本申请实施例支持全局变量,无需采用ETS对象并局限于Erlang,因而占用的内存较少,应用程序运行速度较快。
相关技术二在更新应用程序时,需要依赖于内存数据库(data base memory,DBM),该DBM可以参见图19。
在更新过程中,将应用程序对应的、处于运行中的旧进程的全局变量写入DBM,旧进程基于旧版本源码运行。当检测到旧进程故障,获取新版本源码,退出旧进程,用新版本源码替换旧版本源码基于新版本源码运行应用程序对应的新进程,从而完成进程重启,也即是应用程序的重启。之后,从DBM中读取旧进程的全局变量,用户手动将旧进程的全局变量拷贝至新进程的全局变量,从而恢复进程状态,并完成与其他进程的适配。
相关技术二存在的技术问题包括但不限于如下的技术问题三和技术问题四。
技术问题三,需要重启进程,也即是需要重启应用程序,并由用户手动进行拷贝,因而无法实现热更新,且应用程序更新速度慢。
技术问题四,需要依赖于DBM,不仅内存消耗大,而且DBM性能影响更新的速度和成功率。
针对技术问题三,本申请实施例可以自动得到全局变量,无需用户手动操作,也无需重启应用程序,缩短了应用程序的更新时间。针对技术问题四,本申请实施例无需依赖DBM,占用较少的内存,更新应用程序的速度快、成功率高。
以上介绍了本申请实施例提供的应用程序的更新方法,与上述方法对应,本申请实施例还提供了一种应用程序的更新装置。其中,该装置应用于计算机设备。该装置用于通过图20所示的各个模块执行上述图7中计算机设备所执行的应用程序的更新方法。如图20所示,本申请实施例提供的应用程序的更新装置包括如下几个模块。
获取模块2001,用于获取应用程序在更新前运行的第一代码和第一元数据,第一元数据用于指示第一代码运行时引用的第一全局变量的属性信息;
获取模块2001,还用于获取应用程序在更新后需要运行的第二代码和第二元数据,第二元数据用于指示第二代码运行时引用的第二全局变量的属性信息;
得到模块2002,用于基于第一全局变量的属性信息和第二全局变量的属性信息,得到第二全局变量;
切换模块2003,用于基于第二全局变量,由运行第一代码切换为运行第二代码。
在示例性实施例中,第一全局变量的属性信息包括第一全局变量的类型和名称,第二全局变量的属性信息包括第二全局变量的类型和名称;得到模块2002,用于在第一全局变量与第二全局变量具有相同的类型和名称的情况下,基于第一全局变量得到第二全局变量。
在示例性实施例中,第一元数据包括第一指针组,第一指针组包括第一全局变量类型指针和第一全局变量名称指针,第二元数据包括第二指针组,第二指针组包括第二全局变量类型指针和第二全局变量名称指针;获取模块2001,还用于根据第一指针组中的第一全局变量类型指针获取第一全局变量的类型;根据第一指针组中的第一全局变量名称指针获取第一全局变量的名称,第一全局变量的属性信息包括第一全局变量的类型和名称;根据第二指针组中的第二全局变量类型指针获取第二全局变量的类型;根据第二指针组中的第二全局变量名称指针获取第二全局变量的名称,第二全局变量的属性信息包括第二全局变量的类型和名称。
在示例性实施例中,第一全局变量的类型和第二全局变量的类型为基本类型;得到模块2002,用于将第一全局变量作为第二全局变量。
在示例性实施例中,第一指针组包括第一全局变量地址指针,第二指针组还包括第二全局变量地址指针;得到模块2002,用于根据第一全局变量地址指针获取目标堆内存指针,目标堆内存指针用于获取第一全局变量;令第二全局变量地址指针指示目标堆内存指针。
在示例性实施例中,第一全局变量的类型和第二全局变量的类型为引用类型;得到模块2002,用于在第一成员变量与第二成员变量全部相同的情况下,基于第二元数据更新第一全局变量,得到更新后的第一全局变量,第一成员变量为第一全局变量对应的成员变量,第二成员变量为第二全局变量对应的成员变量;将更新后的第一全局变量作为第二全局变量。
在示例性实施例中,第一指针组包括第一全局变量地址指针,第一元数据包括第三指针组,第二指针组包括第二全局变量地址指针,第二元数据包括第四指针组;得到模块2002,用于根据第一全局变量地址指针获取目标堆内存指针;根据目标堆内存指针获取第一全局变量;令第一全局变量包括的头指针由指示第三指针组更新为指示第四指针组;令第二全局变量地址指针指示目标堆内存指针。
在示例性实施例中,第一全局变量的类型和第二全局变量的类型为引用类型;得到模块2002,用于在第一成员变量与第二成员变量部分相同的情况下,基于第二元数据生成第三全局变量,第一成员变量为第一全局变量对应的成员变量,第二成员变量为第二全局变量对应的成员变量,第三全局变量包括的头指针指示第二元数据包括的第四指针组,第三全局变量还包括第二成员变量的初始实例数据;基于第一全局变量包括的目标成员变量的实例数据,更新第三全局变量包括的目标成员变量的初始实例数据,得到更新后的第三全局变量,目标成员变量为第一成员变量和第二成员变量中相同的成员变量;将更新后的第三全局变量作为第二全局变量。
在示例性实施例中,第一元数据包括第三指针组,第三指针组包括第一父类指针和第一成员变量指针,第二元数据包括第四指针组,第四指针组包括第二父类指针和第二成员变量指针;获取模块2001,还用于根据第三指针组中的第一父类指针和第一成员变量指针获取第一成员变量的类型和名称;根据第四指针组中的第二父类指针和第二成员变量指针获取第二成员变量的类型和名称;基于第一成员变量和第二成员变量具有的类型和名称,确定第一成员变量与第二成员变量全部相同或者部分相同。
在示例性实施例中,得到模块2002,用于在满足第一条件的情况下,将第三全局变量包括的目标成员变量的初始实例数据,更新为第一全局变量包括的目标成员变量的实例数据;第一条件包括:第一成员变量的类型和第二成员变量的类型为基本类型,或者,第一成员变量的类型和第二成员变量的类型为引用类型,且第一子成员变量与第二子成员变量全部相同,第一子成员变量为第一成员变量包括的目标成员变量的子成员变量,第二子成员变量为第二成员变量包括的目标成员变量的子成员变量。
在示例性实施例中,得到模块2002,用于在满足第二条件的情况下,将目标成员变量的初始实例数据包括的目标子成员变量的初始子实例数据,更新为目标成员变量的实例数据包括的目标子成员变量的子实例数据,目标子成员变量为第一子成员变量和第二子成员变量中相同的子成员变量,第一子成员变量为第一成员变量包括的目标成员变量的子成员变量,第二子成员变量为第二成员变量包括的目标成员变量的子成员变量;第二条件包括:第一成员变量的类型和第二成员变量的类型为引用类型,且第一子成员变量与第二子成员变量部分相同。
在示例性实施例中,得到模块2002,用于令第二全局变量地址指针指示参考堆内存指针,参考堆内存指针用于获取更新后的第三全局变量。
在示例性实施例中,装置还包括:修改模块,用于在存在引用第一代码包括的第一符号的第三代码的情况下,将第三代码对应的全局偏移GOT表中记载的第一符号的指针,修改为第二代码包括的第二符号的指针;第一符号包括第一全局变量,且第二符号包括第二全局变量,第一全局变量和第二全局变量具有相同的类型和名称,和/或,第一符号包括第一函数,第二符号包括第二函数,第一函数和第二函数为相同的函数。
在示例性实施例中,装置还包括:删除模块,用于删除得到第二全局变量之后不需要使用的第一全局变量,和/或,删除第一代码和第一元数据。
应理解的是,上述图20提供的装置在实现其功能时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的装置与方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
本申请实施例还提供了一种应用程序的更新设备,设备包括存储器及处理器;存储器中存储有至少一条指令,至少一条指令由处理器加载并执行,以使应用程序的更新设备实现图7对应的应用程序的更新方法。
参见图21,图21示出了本申请一示例性的应用程序的更新设备2100的结构示意图,该应用程序的更新设备2100包括至少一个处理器2101、存储器2103以及至少一个网络接口2104。
处理器2101例如是通用中央处理器(Central Processing Unit,CPU)、数字信号处理器(digital signal processor,DSP)、网络处理器(network processer,NP)、GPU、神经网络处理器(neural-network processing units,NPU)、数据处理单元(DataProcessing Unit,DPU)、微处理器或者一个或多个用于实现本申请方案的集成电路或专用集成电路(application-specific integrated circuit,ASIC)、可编程逻辑器件(programmable logic device,PLD)、其他通用处理器或者其他可编程逻辑器件、分立门、晶体管逻辑器件、分立硬件部件或者其任意组合。PLD例如是复杂可编程逻辑器件(complexprogrammable logic device,CPLD)、现场可编程逻辑门阵列(field-programmable gatearray,FPGA)、通用阵列逻辑(generic array logic,GAL)或其任意组合。通用处理器可以是微处理器或者是任何常规的处理器等。值得说明的是,处理器可以是支持进阶精简指令集机器(advanced RISC machines,ARM)架构的处理器。其可以实现或执行结合本申请公开内容所描述的各种逻辑方框、模块和电路。处理器也可以是实现计算功能的组合,例如包括一个或多个微处理器组合,DSP和微处理器的组合等等。
可选的,应用程序的更新设备2100还包括总线2102。总线2102用于在应用程序的更新设备2100的各组件之间传送信息。总线2102可以是外设部件互连标准(peripheralcomponent interconnect,简称PCI)总线或扩展工业标准结构(extended industrystandard architecture,简称EISA)总线等。总线2102可以分为地址总线、数据总线、控制总线等。为便于表示,图21中仅用一条线表示,但并不表示仅有一根总线或一种类型的总线。
存储器2103例如是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(read-only memory,ROM)、可编程只读存储器(programmable ROM,PROM)、可擦除可编程只读存储器(erasable PROM,EPROM)、电可擦除可编程只读存储器(electrically EPROM,EEPROM)或闪存。易失性存储器可以是随机存取存储器(random access memory,RAM),其用作外部高速缓存。
通过示例性但不是限制性说明,许多形式的ROM和RAM可用。例如,ROM为只读光盘(compact disc read-only memory,CD-ROM)。RAM包括但不限于静态随机存取存储器(static RAM,SRAM)、动态随机存取存储器(dynamic random access memory,DRAM)、同步动态随机存取存储器(synchronous DRAM,SDRAM)、双倍数据速率同步动态随机存取存储器(double data date SDRAM,DDR SDRAM)、增强型同步动态随机存取存储器(enhancedSDRAM,ESDRAM)、同步连接动态随机存取存储器(synchlink DRAM,SLDRAM)和直接内存总线随机存取存储器(direct rambus RAM,DR RAM)。
存储器2103还可以是可存储静态信息和指令的其它类型的存储设备。或者可以是可存储信息和指令的其它类型的动态存储设备。或者可以是其它光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其它磁存储设备,或者是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其它介质,但不限于此。存储器2103例如是独立存在,并通过总线2102与处理器2101相连接。存储器2103也可以和处理器2101集成在一起。
网络接口2104使用任何收发器一类的装置,用于与其它设备或通信网络通信,通信网络可以为以太网、无线接入网(radio access network,RAN)或无线局域网(wirelesslocal area network,WLAN)等。网络接口2104可以包括有线网络接口,还可以包括无线网络接口。具体的,网络接口2104可以为以太(Ethernet)接口,如:快速以太(Fast Ethernet,FE)接口、千兆以太(Gigabit Ethernet,GE)接口,异步传输模式(Asynchronous TransferMode,ATM)接口,WLAN接口,蜂窝网络接口或其组合。以太网接口可以是光接口,电接口或其组合。在本申请的一些实施方式中,网络接口2104可以用于应用程序的更新设备2100与其他设备进行通信。
在具体实现中,作为一些实施方式,处理器2101可以包括一个或多个CPU,如图21中所示的CPU0和CPU1。这些处理器中的每一个可以是一个单核处理器,也可以是一个多核处理器。这里的处理器可以指一个或多个设备、电路、和/或用于处理数据(例如计算机程序指令)的处理核。
在具体实现中,作为一些实施方式,应用程序的更新设备2100可以包括多个处理器,如图21中所示的处理器2101和处理器2105。这些处理器中的每一个可以是一个单核处理器,也可以是一个多核处理器。这里的处理器可以指一个或多个设备、电路、和/或用于处理数据(如计算机程序指令)的处理核。
在一些实施方式中,存储器2103用于存储执行本申请方案的程序指令2110,处理器2101可以执行存储器2103中存储的程序指令2110。也即是,应用程序的更新设备2100可以通过处理器2101以及存储器2103中的程序指令2110,来实现方法实施例提供的方法,即计算机设备执行的图7对应应用程序的更新方法。程序指令2110中可以包括一个或多个软件模块。可选地,处理器2101自身也可以存储执行本申请方案的程序指令。
在具体实施过程中,本申请的应用程序的更新设备2100可对应于用于执行上述方法的第一网元设备,应用程序的更新设备2100中的处理器2101读取存储器2103中的指令,使图21所示的应用程序的更新设备2100能够执行方法实施例中的全部或部分步骤。
应用程序的更新设备2100还可以对应于上述图20所示的装置,图20所示的装置中的每个功能模块采用应用程序的更新设备2100的软件实现。换句话说,图20所示的装置包括的功能模块为应用程序的更新设备2100的处理器2101读取存储器2103中存储的程序指令2110后生成的。
其中,图7所示的方法的各步骤通过应用程序的更新设备2100的处理器中的硬件的集成逻辑电路或者软件形式的指令完成。结合本申请所公开的方法实施例的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法实施例的步骤,为避免重复,这里不再详细描述。
示例性地,本申请实施例还提供了一种计算机可读存储介质,计算机可读存储介质中存储有至少一条指令,指令由处理器加载并执行以实现图7对应的应用程序的更新方法。
在示例性实施例中,本申请实施例还提供了一种计算机程序产品,计算机程序产品包括计算机程序/指令,计算机程序/指令被处理器执行,以使计算机实现图7对应的应用程序的更新方法。
可选地,本申请实施例还提供了一种芯片,包括处理器,用于从存储器中调用并运行存储器中存储的指令,使得安装有芯片的计算机执行图7对应的应用程序的更新方法。
示例性地,本申请实施例还提供了另一种芯片,包括:输入接口、输出接口、处理器和存储器,输入接口、输出接口、处理器以及存储器之间通过内部连接通路相连,处理器用于执行存储器中的代码,当代码被执行时,安装有芯片的计算机执图7对应的应用程序的更新方法。
本申请中术语“第一”“第二”等字样用于对作用和功能基本相同的相同项或相似项进行区分,应理解,“第一”、“第二”、“第n”之间不具有逻辑或时序上的依赖关系,也不对数量和执行顺序进行限定。还应理解,尽管以下描述使用术语第一、第二等来描述各种元素,但这些元素不应受术语的限制。这些术语只是用于将一元素与另一元素区别分开。
还应理解,在本申请的各个实施例中,各个过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
本申请中术语“至少一个”的含义是指一个或多个,本申请中术语“多个”的含义是指两个或两个以上,例如,多个共享库是指两个或两个以上的共享库。
应理解,在本文中对各种所述示例的描述中所使用的术语只是为了描述特定示例,而并非旨在进行限制。如在对各种所述示例的描述和所附权利要求书中所使用的那样,单数形式“一个(“a”,“an”)”和“该”旨在也包括复数形式,除非上下文另外明确地指示。
还应理解,本文中所使用的术语“和/或”是指并且涵盖相关联的所列出的项目中的一个或多个项目的任何和全部可能的组合。术语“和/或”,是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本申请中的字符“/”,一般表示前后关联对象是一种“或”的关系。
还应理解,术语“若”和“如果”可被解释为意指“当...时”(“when”或“upon”)或“响应于确定”或“响应于检测到”。类似地,根据上下文,短语“若确定...”或“若检测到[所陈述的条件或事件]”可被解释为意指“在确定...时”或“响应于确定...”或“在检测到[所陈述的条件或事件]时”或“响应于检测到[所陈述的条件或事件]”。
以上所述仅为本申请的实施例,并不用以限制本申请,凡在本申请的原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (31)

1.一种应用程序的更新方法,其特征在于,所述方法包括:
获取应用程序在更新前运行的第一代码和第一元数据,所述第一元数据用于指示所述第一代码运行时引用的第一全局变量的属性信息;
获取所述应用程序在更新后需要运行的第二代码和第二元数据,所述第二元数据用于指示所述第二代码运行时引用的第二全局变量的属性信息;
基于所述第一全局变量的属性信息和所述第二全局变量的属性信息,得到所述第二全局变量;
基于所述第二全局变量,由运行所述第一代码切换为运行所述第二代码。
2.根据权利要求1所述的方法,其特征在于,所述第一全局变量的属性信息包括所述第一全局变量的类型和名称,所述第二全局变量的属性信息包括所述第二全局变量的类型和名称;
所述基于所述第一全局变量的属性信息和所述第二全局变量的属性信息,得到所述第二全局变量,包括:
在所述第一全局变量与所述第二全局变量具有相同的类型和名称的情况下,基于所述第一全局变量得到所述第二全局变量。
3.根据权利要求1或2所述的方法,其特征在于,所述第一元数据包括第一指针组,所述第一指针组包括第一全局变量类型指针和第一全局变量名称指针,所述第二元数据包括第二指针组,所述第二指针组包括第二全局变量类型指针和第二全局变量名称指针;
所述基于所述第一全局变量的属性信息和所述第二全局变量的属性信息,得到所述第二全局变量之前,所述方法还包括:
根据所述第一指针组中的第一全局变量类型指针获取所述第一全局变量的类型;
根据所述第一指针组中的第一全局变量名称指针获取所述第一全局变量的名称,所述第一全局变量的属性信息包括所述第一全局变量的类型和名称;
根据所述第二指针组中的第二全局变量类型指针获取所述第二全局变量的类型;
根据所述第二指针组中的第二全局变量名称指针获取所述第二全局变量的名称,所述第二全局变量的属性信息包括所述第二全局变量的类型和名称。
4.根据权利要求2或3所述的方法,其特征在于,所述第一全局变量的类型和所述第二全局变量的类型为基本类型;
所述基于所述第一全局变量得到所述第二全局变量,包括:
将所述第一全局变量作为所述第二全局变量。
5.根据权利要求4所述的方法,其特征在于,所述第一指针组包括第一全局变量地址指针,所述第二指针组还包括第二全局变量地址指针;
所述将所述第一全局变量作为所述第二全局变量,包括:
根据所述第一全局变量地址指针获取目标堆内存指针,所述目标堆内存指针用于获取所述第一全局变量;
令所述第二全局变量地址指针指示所述目标堆内存指针。
6.根据权利要求2或3所述的方法,其特征在于,所述第一全局变量的类型和所述第二全局变量的类型为引用类型;
所述基于所述第一全局变量得到所述第二全局变量,包括:
在第一成员变量与第二成员变量全部相同的情况下,基于所述第二元数据更新所述第一全局变量,得到更新后的第一全局变量,所述第一成员变量为所述第一全局变量对应的成员变量,所述第二成员变量为所述第二全局变量对应的成员变量;
将所述更新后的第一全局变量作为所述第二全局变量。
7.根据权利要求6所述的方法,其特征在于,所述第一指针组包括第一全局变量地址指针,所述第一元数据包括第三指针组,所述第二指针组包括第二全局变量地址指针,所述第二元数据包括第四指针组;
所述基于所述第二元数据更新所述第一全局变量,得到更新后的第一全局变量,包括:
根据所述第一全局变量地址指针获取目标堆内存指针;
根据所述目标堆内存指针获取所述第一全局变量;
令所述第一全局变量包括的头指针由指示所述第三指针组更新为指示所述第四指针组;
所述将所述更新后的第一全局变量作为所述第二全局变量,包括:
令所述第二全局变量地址指针指示所述目标堆内存指针。
8.根据权利要求2或3所述的方法,其特征在于,所述第一全局变量的类型和所述第二全局变量的类型为引用类型;
所述基于所述第一全局变量得到所述第二全局变量,包括:
在第一成员变量与第二成员变量部分相同的情况下,基于所述第二元数据生成第三全局变量,所述第一成员变量为所述第一全局变量对应的成员变量,所述第二成员变量为所述第二全局变量对应的成员变量,所述第三全局变量包括的头指针指示所述第二元数据包括的第四指针组,所述第三全局变量还包括所述第二成员变量的初始实例数据;
基于所述第一全局变量包括的目标成员变量的实例数据,更新所述第三全局变量包括的所述目标成员变量的初始实例数据,得到更新后的第三全局变量,所述目标成员变量为所述第一成员变量和所述第二成员变量中相同的成员变量;
将所述更新后的第三全局变量作为所述第二全局变量。
9.根据权利要求6至8任一所述的方法,其特征在于,所述第一元数据包括第三指针组,所述第三指针组包括第一父类指针和第一成员变量指针,所述第二元数据包括第四指针组,所述第四指针组包括第二父类指针和第二成员变量指针;
所述方法还包括:
根据所述第三指针组中的第一父类指针和第一成员变量指针获取所述第一成员变量的类型和名称;
根据所述第四指针组中的第二父类指针和第二成员变量指针获取所述第二成员变量的类型和名称;
基于所述第一成员变量和所述第二成员变量具有的类型和名称,确定所述第一成员变量与所述第二成员变量全部相同或者部分相同。
10.根据权利要求8所述的方法,其特征在于,所述基于所述第一全局变量包括的目标成员变量的实例数据,更新所述第三全局变量包括的所述目标成员变量的初始实例数据,得到更新后的第三全局变量,包括:
在满足第一条件的情况下,将所述第三全局变量包括的所述目标成员变量的初始实例数据,更新为所述第一全局变量包括的所述目标成员变量的实例数据;
所述第一条件包括:
所述第一成员变量的类型和所述第二成员变量的类型为基本类型,或者,
所述第一成员变量的类型和所述第二成员变量的类型为引用类型,且第一子成员变量与第二子成员变量全部相同,所述第一子成员变量为所述第一成员变量包括的所述目标成员变量的子成员变量,所述第二子成员变量为所述第二成员变量包括的所述目标成员变量的子成员变量。
11.根据权利要求8所述的方法,其特征在于,所述基于所述第一全局变量包括的目标成员变量的实例数据,更新所述第三全局变量包括的所述目标成员变量的初始实例数据,得到更新后的第三全局变量,包括:
在满足第二条件的情况下,将所述目标成员变量的初始实例数据包括的目标子成员变量的初始子实例数据,更新为所述目标成员变量的实例数据包括的所述目标子成员变量的子实例数据,所述目标子成员变量为第一子成员变量和第二子成员变量中相同的子成员变量,所述第一子成员变量为所述第一成员变量包括的所述目标成员变量的子成员变量,所述第二子成员变量为所述第二成员变量包括的所述目标成员变量的子成员变量;
所述第二条件包括:
所述第一成员变量的类型和所述第二成员变量的类型为引用类型,且所述第一子成员变量与所述第二子成员变量部分相同。
12.根据权利要求8、10和11中任一所述的方法,其特征在于,所述将所述更新后的第三全局变量作为所述第二全局变量,包括:
令第二全局变量地址指针指示参考堆内存指针,所述参考堆内存指针用于获取所述更新后的第三全局变量。
13.根据权利要求1-12任一所述的方法,其特征在于,所述方法还包括:
在存在引用所述第一代码包括的第一符号的第三代码的情况下,将所述第三代码对应的全局偏移GOT表中记载的所述第一符号的指针,修改为所述第二代码包括的第二符号的指针;
所述第一符号包括所述第一全局变量,且所述第二符号包括所述第二全局变量,所述第一全局变量和所述第二全局变量具有相同的类型和名称,
和/或,所述第一符号包括第一函数,所述第二符号包括第二函数,所述第一函数和所述第二函数为相同的函数。
14.根据权利要求1-13任一所述的方法,其特征在于,所述方法还包括:
删除得到所述第二全局变量之后不需要使用的第一全局变量,和/或,删除所述第一代码和所述第一元数据。
15.一种应用程序的更新装置,其特征在于,所述装置包括:
获取模块,用于获取应用程序在更新前运行的第一代码和第一元数据,所述第一元数据用于指示所述第一代码运行时引用的第一全局变量的属性信息;
所述获取模块,还用于获取所述应用程序在更新后需要运行的第二代码和第二元数据,所述第二元数据用于指示所述第二代码运行时引用的第二全局变量的属性信息;
得到模块,用于基于所述第一全局变量的属性信息和所述第二全局变量的属性信息,得到所述第二全局变量;
切换模块,用于基于所述第二全局变量,由运行所述第一代码切换为运行所述第二代码。
16.根据权利要求15所述的装置,其特征在于,所述第一全局变量的属性信息包括所述第一全局变量的类型和名称,所述第二全局变量的属性信息包括所述第二全局变量的类型和名称;
所述得到模块,用于在所述第一全局变量与所述第二全局变量具有相同的类型和名称的情况下,基于所述第一全局变量得到所述第二全局变量。
17.根据权利要求15或16所述的装置,其特征在于,所述第一元数据包括第一指针组,所述第一指针组包括第一全局变量类型指针和第一全局变量名称指针,所述第二元数据包括第二指针组,所述第二指针组包括第二全局变量类型指针和第二全局变量名称指针;
所述获取模块,还用于根据所述第一指针组中的第一全局变量类型指针获取所述第一全局变量的类型;根据所述第一指针组中的第一全局变量名称指针获取所述第一全局变量的名称,所述第一全局变量的属性信息包括所述第一全局变量的类型和名称;根据所述第二指针组中的第二全局变量类型指针获取所述第二全局变量的类型;根据所述第二指针组中的第二全局变量名称指针获取所述第二全局变量的名称,所述第二全局变量的属性信息包括所述第二全局变量的类型和名称。
18.根据权利要求16或17所述的装置,其特征在于,所述第一全局变量的类型和所述第二全局变量的类型为基本类型;
所述得到模块,用于将所述第一全局变量作为所述第二全局变量。
19.根据权利要求18所述的装置,其特征在于,所述第一指针组包括第一全局变量地址指针,所述第二指针组还包括第二全局变量地址指针;
所述得到模块,用于根据所述第一全局变量地址指针获取目标堆内存指针,所述目标堆内存指针用于获取所述第一全局变量;令所述第二全局变量地址指针指示所述目标堆内存指针。
20.根据权利要求16或17所述的装置,其特征在于,所述第一全局变量的类型和所述第二全局变量的类型为引用类型;
所述得到模块,用于在第一成员变量与第二成员变量全部相同的情况下,基于所述第二元数据更新所述第一全局变量,得到更新后的第一全局变量,所述第一成员变量为所述第一全局变量对应的成员变量,所述第二成员变量为所述第二全局变量对应的成员变量;将所述更新后的第一全局变量作为所述第二全局变量。
21.根据权利要求20所述的装置,其特征在于,所述第一指针组包括第一全局变量地址指针,所述第一元数据包括第三指针组,所述第二指针组包括第二全局变量地址指针,所述第二元数据包括第四指针组;
所述得到模块,用于根据所述第一全局变量地址指针获取目标堆内存指针;根据所述目标堆内存指针获取所述第一全局变量;令所述第一全局变量包括的头指针由指示所述第三指针组更新为指示所述第四指针组;令所述第二全局变量地址指针指示所述目标堆内存指针。
22.根据权利要求16或17所述的装置,其特征在于,所述第一全局变量的类型和所述第二全局变量的类型为引用类型;
所述得到模块,用于在第一成员变量与第二成员变量部分相同的情况下,基于所述第二元数据生成第三全局变量,所述第一成员变量为所述第一全局变量对应的成员变量,所述第二成员变量为所述第二全局变量对应的成员变量,所述第三全局变量包括的头指针指示所述第二元数据包括的第四指针组,所述第三全局变量还包括所述第二成员变量的初始实例数据;基于所述第一全局变量包括的目标成员变量的实例数据,更新所述第三全局变量包括的所述目标成员变量的初始实例数据,得到更新后的第三全局变量,所述目标成员变量为所述第一成员变量和所述第二成员变量中相同的成员变量;将所述更新后的第三全局变量作为所述第二全局变量。
23.根据权利要求20至22任一所述的装置,其特征在于,所述第一元数据包括第三指针组,所述第三指针组包括第一父类指针和第一成员变量指针,所述第二元数据包括第四指针组,所述第四指针组包括第二父类指针和第二成员变量指针;
所述获取模块,还用于根据所述第三指针组中的第一父类指针和第一成员变量指针获取所述第一成员变量的类型和名称;根据所述第四指针组中的第二父类指针和第二成员变量指针获取所述第二成员变量的类型和名称;基于所述第一成员变量和所述第二成员变量具有的类型和名称,确定所述第一成员变量与所述第二成员变量全部相同或者部分相同。
24.根据权利要求22所述的装置,其特征在于,所述得到模块,用于在满足第一条件的情况下,将所述第三全局变量包括的所述目标成员变量的初始实例数据,更新为所述第一全局变量包括的所述目标成员变量的实例数据;所述第一条件包括:所述第一成员变量的类型和所述第二成员变量的类型为基本类型,或者,所述第一成员变量的类型和所述第二成员变量的类型为引用类型,且第一子成员变量与第二子成员变量全部相同,所述第一子成员变量为所述第一成员变量包括的所述目标成员变量的子成员变量,所述第二子成员变量为所述第二成员变量包括的所述目标成员变量的子成员变量。
25.根据权利要求22所述的装置,其特征在于,所述得到模块,用于在满足第二条件的情况下,将所述目标成员变量的初始实例数据包括的目标子成员变量的初始子实例数据,更新为所述目标成员变量的实例数据包括的所述目标子成员变量的子实例数据,所述目标子成员变量为第一子成员变量和第二子成员变量中相同的子成员变量,所述第一子成员变量为所述第一成员变量包括的所述目标成员变量的子成员变量,所述第二子成员变量为所述第二成员变量包括的所述目标成员变量的子成员变量;所述第二条件包括:所述第一成员变量的类型和所述第二成员变量的类型为引用类型,且所述第一子成员变量与所述第二子成员变量部分相同。
26.根据权利要求22、23和24中任一所述的装置,其特征在于,所述得到模块,用于令第二全局变量地址指针指示参考堆内存指针,所述参考堆内存指针用于获取所述更新后的第三全局变量。
27.根据权利要求15-26任一所述的装置,其特征在于,所述装置还包括:
修改模块,用于在存在引用所述第一代码包括的第一符号的第三代码的情况下,将所述第三代码对应的全局偏移GOT表中记载的所述第一符号的指针,修改为所述第二代码包括的第二符号的指针;所述第一符号包括所述第一全局变量,且所述第二符号包括所述第二全局变量,所述第一全局变量和所述第二全局变量具有相同的类型和名称,和/或,所述第一符号包括第一函数,所述第二符号包括第二函数,所述第一函数和所述第二函数为相同的函数。
28.根据权利要求15-27任一所述的装置,其特征在于,所述装置还包括:
删除模块,用于删除得到所述第二全局变量之后不需要使用的第一全局变量,和/或,删除所述第一代码和所述第一元数据。
29.一种应用程序的更新设备,其特征在于,所述设备包括存储器及处理器;所述存储器中存储有至少一条指令,所述至少一条指令由所述处理器加载并执行,以使所述应用程序的更新设备实现权利要求1-14中任一所述的应用程序的更新方法。
30.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有至少一条指令,所述指令由处理器加载并执行以实现如权利要求1-14中任一所述的应用程序的更新方法。
31.一种计算机程序产品,其特征在于,所述计算机程序产品包括计算机程序/指令,所述计算机程序/指令被处理器执行,以使计算机实现权利要求1-14中任一所述的应用程序的更新方法。
CN202211175486.3A 2022-09-26 2022-09-26 应用程序的更新方法、装置、设备及计算机可读存储介质 Pending CN117806686A (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202211175486.3A CN117806686A (zh) 2022-09-26 2022-09-26 应用程序的更新方法、装置、设备及计算机可读存储介质
PCT/CN2023/104852 WO2024066611A1 (zh) 2022-09-26 2023-06-30 应用程序的更新方法、装置、设备及计算机可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211175486.3A CN117806686A (zh) 2022-09-26 2022-09-26 应用程序的更新方法、装置、设备及计算机可读存储介质

Publications (1)

Publication Number Publication Date
CN117806686A true CN117806686A (zh) 2024-04-02

Family

ID=90427433

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211175486.3A Pending CN117806686A (zh) 2022-09-26 2022-09-26 应用程序的更新方法、装置、设备及计算机可读存储介质

Country Status (2)

Country Link
CN (1) CN117806686A (zh)
WO (1) WO2024066611A1 (zh)

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109597631B (zh) * 2017-09-28 2022-04-05 阿里巴巴集团控股有限公司 一种进程的升级方法、装置及电子设备
CN110187910B (zh) * 2019-05-30 2023-09-05 腾讯科技(上海)有限公司 一种热更新方法、装置、设备及计算机可读存储介质
CN110275722B (zh) * 2019-06-21 2023-08-08 北京百度网讯科技有限公司 用于升级应用的方法、装置、设备和存储介质
CN111930398B (zh) * 2020-07-24 2023-06-27 北京柠檬微趣科技股份有限公司 应用程序更新方法、装置、***、介质及设备

Also Published As

Publication number Publication date
WO2024066611A1 (zh) 2024-04-04

Similar Documents

Publication Publication Date Title
US7992141B2 (en) Method and apparatus for building executable computer programs using compiled program libraries
US7318215B1 (en) Stored procedure interface language and tools
JP2021002317A (ja) アプリケーションをアップグレードするための方法、装置、デバイスならびに記憶媒体
JP7212793B2 (ja) 関数ジャンプを実現するための方法、装置及びコンピュータ記憶媒体
JP2008505423A (ja) 最適化されたプログラムのためのアンワインド情報の生成
EP4231138A1 (en) Method and apparatus for fixing weak memory ordering problem
CN111666210A (zh) 一种芯片验证方法及装置
CN113204571A (zh) 涉及写入操作的sql执行方法、装置及存储介质
CN112882718A (zh) 编译处理方法、装置、设备及存储介质
CN114756456A (zh) 一种持续集成方法、装置以及计算机可读存储介质
CN115756451A (zh) 一种多项目代码文件重用的方法、装置、设备、存储介质
CN109284222B (zh) 软件单元、数据处理***中的项目测试方法、装置及设备
US20220244931A1 (en) Image file obtaining method and apparatus
CN109558121A (zh) 接口驱动程序的开发方法、装置、设备及存储介质
CN111488144A (zh) 一种数据处理方法以及设备
US20080040705A1 (en) Method for building software project
CN117806686A (zh) 应用程序的更新方法、装置、设备及计算机可读存储介质
CN110045962B (zh) 一种支持多语言脚本执行的方法和装置
CN114416057A (zh) 项目代码打包方法、装置、终端设备及存储介质
CN109857380B (zh) 一种工作流文件编译方法及装置
CN113741950A (zh) 代码同步方法、服务器及存储介质
CN114579135B (zh) 一种安装包生成方法及装置
US6782523B2 (en) Parallel configurable IP design methodology
CN117033497B (zh) 数据湖上数据更新与读取的方法及相关设备
CN111273944B (zh) 生成程序文件并上传至代码仓库的方法及装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication