CN110457151B - 热修复方法、装置及可读存储介质 - Google Patents
热修复方法、装置及可读存储介质 Download PDFInfo
- Publication number
- CN110457151B CN110457151B CN201910620523.9A CN201910620523A CN110457151B CN 110457151 B CN110457151 B CN 110457151B CN 201910620523 A CN201910620523 A CN 201910620523A CN 110457151 B CN110457151 B CN 110457151B
- Authority
- CN
- China
- Prior art keywords
- function
- repaired
- target
- class
- name
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/0703—Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
- G06F11/0793—Remedial or corrective actions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例提供了一种热修复方法、装置及可读存储介质。本发明热修复方法包括:通过获取与应用程序对应的热修复JS脚本;通过热修复JS脚本,确定至少一个待修复OC函数的函数签名;根据至少一个待修复OC函数的函数签名,生成至少一个待修复OC函数各自的新函数指针;采用至少一个待修复OC函数各自的新函数指针替换至少一个待修复OC函数各自的原函数指针;若至少一个待修复OC函数中的目标待修复OC函数执行时,则执行目标待修复OC函数的新函数指针,以调用第一回调函数;通过调用第一回调函数,确定与目标待修复OC函数对应的目标OC函数,并执行目标OC函数进行处理,实现了对APP版本进行高效率的热修复。
Description
技术领域
本发明涉及互联网技术领域,特别是涉及一种热修复方法、装置及可读存储介质。
背景技术
随着互联网的快速发展,移动终端已经成为人们生活中不可或缺的工具之一。为了增加移动终端的使用灵活性,第三方服务器基于移动终端的运行***开发出多种实现不同功能的应用程序(Application,APP),用户只需要在移动终端中安装能够实现某种功能的APP,就可以通过移动终端进行相应功能的活动。
现有技术中,针对发布后的APP的某些功能异常时,最通用的技术手段是采用开源的JSPatch框架对存在异常的APP进行热修复。具体的热修复方案为:JSPath在JS文件(JS文件为通过Javascript编写的JS代码文件)下发到移动终端后,将JS文件进行正则检测,用特定的JS函数模板替换JS文件中的JS函数,在特定函数模板中获取需要修复的OC函数名、返回值、参数等信息,在消息转发时通过JS代码执行OC代码,其中,OC函数为通过Objective-C语言编写的函数。
由于JSPatch利用了Objective-C语言的消息转发机制,Objective-C语言的消息转发执行时机相对靠后,在大量循环通过Javascript编写的JS代码执行OC代码时,执行效率较低。
发明内容
鉴于上述问题,提出了本发明实施例以便提供一种克服上述问题或者至少部分地解决上述问题的一种热修复方法、装置及可读存储介质。
本发明的第一方面,提供了一种热修复方法,包括:
获取与应用程序对应的热修复JS脚本;
通过所述热修复JS脚本,确定至少一个待修复OC函数的函数签名;
根据所述至少一个待修复OC函数的函数签名,生成所述至少一个待修复OC函数各自的新函数指针;
采用所述至少一个待修复OC函数各自的新函数指针替换所述至少一个待修复OC函数各自的原函数指针;
若所述至少一个待修复OC函数中的目标待修复OC函数执行时,则执行所述目标待修复OC函数的新函数指针,以调用第一回调函数;
通过调用所述第一回调函数,确定与所述目标待修复OC函数对应的目标OC函数,并执行所述目标OC函数进行处理。
本发明的第二方面,提供了一种热修复装置,包括:
获取模块,用于获取与应用程序对应的热修复JS脚本;
确定模块,用于通过所述热修复JS脚本,确定至少一个待修复OC函数的函数签名;
生成模块,用于根据所述至少一个待修复OC函数的函数签名,生成所述至少一个待修复OC函数各自的新函数指针;
替换模块,用于采用所述至少一个待修复OC函数各自的新函数指针替换所述至少一个待修复OC函数各自的原函数指针;
执行模块,用于若所述至少一个待修复OC函数中的目标待修复OC函数执行时,则执行所述目标待修复OC函数的新函数指针,以调用第一回调函数;
所述确定模块,还用于通过调用所述第一回调函数,确定与所述目标待修复OC函数对应的目标OC函数,并执行所述目标OC函数进行处理。
本发明的第三方面,提供了一种计算机可读存储介质,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如上任一所述的热修复方法的步骤。
本发明的第四方面,提供了一种热修复装置,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如上任一项所述的热修复方法的步骤。
本发明实施例包括以下优点:
本实施例提供的热修复方法、装置及可读存储介质,通过获取与应用程序对应的热修复JS脚本;通过热修复JS脚本,确定至少一个待修复OC函数的函数签名;根据至少一个待修复OC函数的函数签名,生成至少一个待修复OC函数各自的新函数指针;采用至少一个待修复OC函数各自的新函数指针替换至少一个待修复OC函数各自的原函数指针;若至少一个待修复OC函数中的目标待修复OC函数执行时,则执行目标待修复OC函数的新函数指针,以调用第一回调函数;通过调用第一回调函数,确定与目标待修复OC函数对应的目标OC函数,并执行目标OC函数进行处理。本发明实施例采用了与JSPatch不同的技术方案,且整个过程不涉及消息转发机制,因此保证了对APP版本进行高效率的热修复。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1为本发明实施例提供的一种热修复方法的步骤流程图;
图2为本发明实施例提供的另一种热修复方法的步骤流程图;
图3为本发明实施例所提供的一种热修复装置的结构示意图;
图4为本发明实施例所提供的另一种热修复装置的结构示意图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
应当理解,此处所描述的具体实施例仅用以解释本发明,仅仅是本发明一部分实施例,而不是全部的实施例,并不用于限定本发明。
参照图1,图1为本发明实施例提供的一种热修复方法的步骤流程图,本实施例提供的热修复方法适用于操作***中的应用程序进行热修复的情况,其中,操作***可以包括手持设备操作***(iPhone Operating System,简称IOS)***、安卓***等其它操作***,该方法可以由热修复装置来执行,该装置可由硬件以及软件组成,一般可集成在电脑、服务器以及所有包含对应用程序进行热修复的终端中。如图1所示,该方法具体包括如下步骤。
步骤101、获取与应用程序对应的热修复JS脚本。
本发明实施例中,APP为通过OC语言编写的,热修复JS脚本为通过Javascript(简称JS)语言编写的代码文件。
本实施例中以手持设备操作***(iPhone Operating System,简称IOS)***为例进行介绍,IOS客户端在每次启动时,客户端会向服务端发送请求消息,请求消息包含APP的版本号,服务端根据请求消息和本地存储的配置文件判断是否向客户端下发热修复JS脚本,若请求消息中包含的APP版本号与配置文件中保存的APP版本号一致,则向客户端下发与APP版本号对应的热修复JS脚本,客户端就能够获得与应用程序版本号对应的热修复JS脚本。
步骤102、通过热修复JS脚本,确定至少一个待修复OC函数的函数签名。
其中,每个函数都可以由函数名、参数个数、参数类型、返回值组成,函数签名由参数个数与参数类型组成。
步骤103、根据至少一个待修复OC函数的函数签名,生成至少一个待修复OC函数各自的新函数指针。
生成新函数指针的过程可以通过MABlockClosure来实现,MABlockClosure为基于Libffi的第三方框架,可以根据函数描述快速创建一个函数指针,Libffi为一个可以动态调用C语言函数的开源框架。
MABlockClosure是基于libffi的封装。libffi的原理如下:根据函数的函数签名可以获取到这个函数的返回值类型、参数类型和参数个数,根据函数的返回值类型、参数类型和参数个数可以生成该函数的新函数指针。本实施例中,根据步骤102中确定的至少一个待修复OC函数中的每个待修复OC函数各自的函数签名,可以每个待修复OC函数各自的新函数指针,例如,如果待修复OC函数为OC函数1和OC函数2,则可以根据OC函数1的函数签名生成OC函数1的新函数指针,根据OC函数2的函数签名生成OC函数2的新函数指针。
步骤104、采用至少一个待修复OC函数各自的新函数指针替换至少一个待修复OC函数各自的原函数指针。
生成新函数指针后,则可以用新函数指针替换原函数指针。例如,采用OC函数1的新函数指针替换OC函数1的原函数指针,采用OC函数2的新函数指针替换OC函数2的原函数指针。
步骤105、若至少一个待修复OC函数中的目标待修复OC函数执行时,则执行目标待修复OC函数的新函数指针,以调用第一回调函数。
步骤106、通过调用第一回调函数,确定与目标待修复OC函数对应的目标OC函数,并执行目标OC函数进行处理。
在步骤105和步骤106中,例如,如果目标待修复OC函数为OC函数1,则在OC函数1执行时,则执行OC函数1的新函数指针,以调用第一回调函数,通过调用第一回调函数,确定与OC函数1对应的目标OC函数,并执行目标OC函数进行热修复。
本实施例提供的热修复方法,通过获取与应用程序对应的热修复JS脚本;通过热修复JS脚本,确定至少一个待修复OC函数的函数签名;根据至少一个待修复OC函数的函数签名,生成至少一个待修复OC函数各自的新函数指针;采用至少一个待修复OC函数各自的新函数指针替换至少一个待修复OC函数各自的原函数指针;若至少一个待修复OC函数中的目标待修复OC函数执行时,则执行目标待修复OC函数的新函数指针,以调用第一回调函数;通过调用第一回调函数,确定与目标待修复OC函数对应的目标OC函数,并执行目标OC函数进行处理。本实施例整个过程不涉及消息转发机制,因此保证了对APP版本进行高效率的热修复。
在上述实施例的基础上,图2为本发明实施例提供的另一种热修复方法的步骤流程图,如图2所示,该方法可以包括:
步骤201、获取与应用程序对应的热修复JS脚本。
客户端可以通过如下方式获取与应用程序对应的热修复JS脚本:向服务端发送请求消息,请求消息包含应用程序的版本号;接收服务端根据请求消息和本地存储的配置文件下发的与应用程序的版本号对应的热修复JS脚本。
步骤202、通过热修复JS脚本,获得应用程序中的至少一个待修复OC类名、至少一个待修复OC类的待修复实例方法对应的第一JS函数列表、以及,至少一个待修复OC类的待修复OC类方法对应的第二JS函数列表。
步骤203、根据至少一个待修复OC类名、至少一个待修复OC类的待修复实例方法对应的第一JS函数列表中的每个第一JS函数名,确定每个第一JS函数名各自对应的待修复OC函数的函数签名;以及,
根据至少一个待修复OC类名、至少一个待修复OC类的待修复类方法对应的第二JS函数列表中的每个第二JS函数名,确定每个第二JS函数名各自对应的待修复OC函数的函数签名。
需要说明的是,通过步骤201客户端获得与应用程序对应的热修复JS脚本后,可以执行热修复JS脚本。当执行热修复JS脚本时,首先执行热修复JS脚本的入口函数,入口函数可以为:startPatch(),startPatch的函数体中包含类定义函数defineClass,执行入口函数时会立即执行defineClass函数,通过执行defineClass函数获得APP中的至少一个待修复OC类名、至少一个待修复OC类中的待修复实例方法对应的第一JS函数列表,以及,至少一个待修复OC类中的待修复OC类方法对应的第二JS函数列表。例如,若待修复OC类名包括第一待修复OC类名和第二待修复OC类名,第一待修复OC类的待修复实例方法对应的第一JS函数列表中包括的每个第一JS函数名为JS函数1和JS函数2,第一待修复OC类的待修复OC类方法对应的第二JS函数列表中的每个第二JS函数名为JS函数3和JS函数4;第二待修复OC类的待修复实例方法对应的第一JS函数列表中包括的每个第一JS函数名为JS函数5和JS函数6,第二待修复OC类的待修复OC类方法对应的第二JS函数列表中的每个第二JS函数名为JS函数7和JS函数8。则可以根据第一待修复OC类名和JS函数1确定一个与JS函数1对应的待修复OC函数(OC函数1),并通过OC函数1获取OC函数1的函数签名;根据第一待修复OC类名和JS函数2确定一个与JS函数2对应的待修复OC函数(OC函数2),并通过OC函数2获取OC函数2的函数签名;根据第一待修复OC类名和JS函数3确定一个与JS函数3对应的待修复OC函数(OC函数3),并通过OC函数3获取OC函数3的函数签名;根据第一待修复OC类名和JS函数4确定一个与JS函数4对应的待修复OC函数(OC函数4),并通过OC函数4获取OC函数4的函数签名。同样,可以获取到JS函数5对应的待修复OC函数的函数签名,JS函数6对应的待修复OC函数的函数签名,JS函数7对应的待修复OC函数的函数签名,JS函数8对应的待修复OC函数的函数签名,在此不一一举例介绍。
其中,在获得应用程序中的至少一个待修复OC类名、至少一个待修复OC类的待修复实例方法对应的第一JS函数列表、以及,至少一个待修复OC类的待修复OC类方法对应的第二JS函数列表之后,可以将至少一个待修复OC类各自的待修复实例方法对应的第一JS函数列表中的每个第一JS函数,以及,至少一个待修复OC类各自的待修复OC类方法对应的第二JS函数列表中的每个第二JS函数,保存在至少一个待修复OC类各自对应的字典中。例如,将第一待修复OC类的待修复实例方法对应的第一JS函数列表中的JS函数1和JS函数2和第一待修复OC类的待修复OC类方法对应的第二JS函数列表中的JS函数3和JS函数4保存在第一待修复OC类对应的字典1中,即将JS函数1、JS函数2、JS函数3和JS函数4保存在第一待修复OC类对应的字典1中,同理,将JS函数5、JS函数6、JS函数7和JS函数8保存在第二待修复OC类对应的字典2中。需要说明的是,字典为MABlockClosure的一种数据结构。
步骤204、根据每个第一JS函数名各自对应的待修复OC函数的函数签名,生成与每个第一JS函数名各自对应的待修复OC函数的新函数指针;以及,根据每个第二JS函数名各自对应的待修复OC函数的函数签名,生成与每个第二JS函数名各自对应的待修复OC函数的新函数指针。
其中,根据每个第一JS函数名各自对应的待修复OC函数的函数签名,生成与每个第一JS函数名各自对应的待修复OC函数的新函数指针可以通过如下方式实现:
根据每个第一JS函数名各自对应的待修复OC函数的函数签名,获取每个第一JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数;根据每个第一JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数,生成每个第一JS函数名各自对应的待修复OC函数的新函数指针。
例如,根据OC函数1的返回值类型、参数类型和参数个数生成OC函数1的新函数指针,根据OC函数2的返回值类型、参数类型和参数个数生成OC函数2的新函数指针,
根据每个第二JS函数名各自对应的待修复OC函数的函数签名,生成与每个第二JS函数名各自对应的待修复OC函数的新函数指针可以通过如下方式实现:
根据每个第二JS函数名各自对应的待修复OC函数的函数签名,获取每个第二JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数;根据每个第二JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数,生成每个第二JS函数名各自对应的待修复OC函数的新函数指针。
例如,根据OC函数3的返回值类型、参数类型和参数个数生成OC函数3的新函数指针,根据OC函数4的返回值类型、参数类型和参数个数生成OC函数4的新函数指针。
步骤205、若至少一个待修复OC函数中的目标待修复OC函数执行时,则执行目标待修复OC函数的新函数指针。
若目标待修复OC函数为OC函数1,则在OC函数1执行时,执行OC函数1的新函数指针。
步骤206、通过调用第一回调函数获取目标待修复OC函数的对象指针。
在步骤205至步骤206中,例如,在OC函数1执行时,则执行OC函数1的新函数指针,在OC函数1的新函数指针执行时,可以调用第一回调函数获取OC函数1的对象指针。其中,第一回调函数可以为MABlockClosure的回调函数。
步骤207、根据对象指针,从至少一个待修复OC类中确定目标待修复OC函数所属的目标待修复OC类。
步骤208、根据目标待修复OC类,确定与目标待修复OC函数对应的目标OC函数。
根据目标待修复OC类,确定与目标待修复OC函数对应的目标OC函数可以通过如下方式实现:
根据目标待修复OC类,从目标待修复OC类的待修复实例方法对应的第一JS函数列表以及目标待修复OC类的目标待修复OC类方法对应的第二JS函数列表中,确定与目标待修复OC函数关联的热修复JS函数;根据热修复JS函数,确定与目标待修复OC函数对应的目标OC函数。
具体的,通过步骤207和步骤208,根据对象指针可以索引到目标待修复OC函数所属的目标待修复OC类,由于每个待修复OC类各自对应一个字典,一个待修复OC类对应的字典中保存有该待修复OC类中的待修复实例方法对应的第一JS函数列表中的每个第一JS函数和该待修复OC类中的待修复OC类方法对应的第二JS函数列表中的每个第二JS函数。因此,在确定目标待修复OC类后,可以从目标待修复OC类对应的字典中保存的目标待修复OC类的待修复实例方法对应的第一JS函数列表以及目标待修复OC类的目标待修复OC类方法对应的第二JS函数列表中确定与目标待修复OC函数对应热修复JS函数。
例如,如果第一待修复OC类对应字典1,在OC函数1的新函数指针指向的OC函数1执行时,可以根据OC函数1的对象指针索引到MABlockClosure中的字典1,由于可以将JS函数1、JS函数2、JS函数3和JS函数4保存在第一待修复OC类对应的字典1中,将JS函数5、JS函数6、JS函数7和JS函数8保存在第二待修复OC类对应的字典2中,因此在OC函数1为目标待修复OC函数时,通过步骤207和步骤208可以从字典1中确定与OC函数1关联的热修复JS函数。与OC函数1关联的热修复JS函数可以为与OC函数1同名的热修复JS函数。
其中,根据热修复JS函数,确定与目标待修复OC函数对应的目标OC函数可以通过如下步骤实现:
当热修复JS函数执行时,调用热修复JS函数的JS子函数;当JS子函数执行时,通过调用第二回调函数获取正在执行的JS子函数的函数名;根据获取的JS子函数的函数名确定与JS子函数的函数名关联的OC函数,将与JS子函数的函数名关联的OC函数确定为目标OC函数。
例如,如果与OC函数1关联的热修复JS函数为JS函数1,在热修复JS函数(也即JS函数1)执行时,调用JS函数1的子函数,如果JS函数1的子函数名为JS子函数1、JS子函2,可以根据JS子函数1确定与JS子函数1关联的OC函数,根据JS子函数2确定与JS子函数2关联的OC函数,与JS子函数1关联的OC函数可以为与JS子函数1同名的OC函数,与JS子函数2关联的OC函数可以为与JS子函数2同名的OC函数。本发明实施例对JS子函数的个数不限制,在此仅以JS子函数1、JS子函数2为例进行介绍。
步骤209、执行目标OC函数进行处理。
在执行目标OC函数进行处理之前,还可以包括以下步骤:
通过调用第一回调函数获取目标待修复OC函数的参数列表的参数及参数的参数类型;将参数和参数类型封装成自定义类型的第一数据;将第一数据传递给JS端,以使JS端根据第一数据执行热修复JS函数。
例如,通过第一回调函数获取OC函数1的参数列表的参数和参数的参数类型,将OC函数1的参数列表的参数和参数的参数类型封装成自定义类型的第一数据。其中,自定义类型可以为PHOVlaue类型,也即将OC函数1的参数列表的参数和参数的参数类型封装成PHOVlaue类型的第一数据。PHOObject_definition是自定义的JS类名,PHOObject_definition的对象绑定了PHOValue类型的数据,若要将第一数据(PHOValue类型的数据)传递到JS端,需要将第一数据设置成PHOObject_definition的私有数据(private数据)再传递到JS端。
将OC函数1的参数列表的参数和参数的参数类型封装成PHOVlaue类型的过程如下:根据OC函数1的参数的参数类型,开辟该参数类型所需的空间;记录OC函数1的参数的参数类型;将OC函数1的参数列表的参数指针所指向的内容拷贝到所开辟的空间中。
其中,执行目标OC函数进行处理可以通过如下步骤实现:
当JS子函数执行时,通过调用第二回调函数获取正在执行的JS子函数的参数和JS子函数的参数的参数类型;将JS子函数的参数和JS子函数的参数的参数类型封装成自定义类型的第二数据;将第二数据传递给OC端,以使OC端根据第二数据执行目标OC函数进行处理。
例如,如果JS子函数1的参数为a和b,把参数a和b以及a和b的参数类型封装成自定义类型(PHOValue类型)的第二数据后,第二数据为PHOObject_definition的私有数据,将第二数据传递给OC端,执行OC函数要先对PHOValue类型数据进行转换,把PHOValue类型的第二数据转成与JS子函数的参数类型一致的类型的数据,然后再根据转换成的与JS子函数1的参数类型一致的类型的数据执行目标OC函数,从而实现对OC函数1的热修复。需要说明的是,例如,如果与JS子函数1关联的OC函数(目标OC函数)执行后,将得到的返回值处理成PHOObject_definition的数据,并将处理后的返回值传递到JS端,以便执行下一个JS子函数。例如JS子函数1为:变量c=a+b,JS子函数2为:变量d=c+2,在JS子函数1执行完后需要把结果c返回给JS端,如果不返回,那么JS子函数2没法执行。
当其他待修复OC函数执行时,对其他待修复OC函数的热修复方法为与OC函数1为目标待修复OC函数的方法相同,此处不再赘述。
本发明实施例采用了与JSPatch不同的技术方案,由于整个过程不涉及消息转发机制,因此实现了对APP版本进行高效率的热修复。
图3为本发明实施例所提供的一种热修复装置的结构示意图。该热修复装置通常以硬件和/或软件的方式来实现。该热修复装置300包括如下模块:获取模块310、确定模块320、生成模块330、替换模块340和执行模块350。
获取模块310用于获取与应用程序对应的热修复JS脚本;确定模块320用于通过热修复JS脚本,确定至少一个待修复OC函数的函数签名;生成模块330用于根据至少一个待修复OC函数的函数签名,生成至少一个待修复OC函数各自的新函数指针;替换模块340用于采用至少一个待修复OC函数各自的新函数指针替换至少一个待修复OC函数各自的原函数指针;执行模块350用于若至少一个待修复OC函数中的目标待修复OC函数执行时,则执行目标待修复OC函数的新函数指针,以调用第一回调函数;确定模块320还用于通过调用第一回调函数,确定与目标待修复OC函数对应的目标OC函数,并执行目标OC函数进行处理。
本实施例提供的热修复装置,通过获取与应用程序对应的热修复JS脚本;通过热修复JS脚本,确定至少一个待修复OC函数的函数签名;根据至少一个待修复OC函数的函数签名,生成至少一个待修复OC函数各自的新函数指针;采用至少一个待修复OC函数各自的新函数指针替换至少一个待修复OC函数各自的原函数指针;若至少一个待修复OC函数中的目标待修复OC函数执行时,则执行目标待修复OC函数的新函数指针,以调用第一回调函数;通过调用第一回调函数,确定与目标待修复OC函数对应的目标OC函数,并执行目标OC函数进行处理。本发明实施例采用了与JSPatch不同的技术方案,由于不涉及消息转发机制,因此实现了对APP版本进行高效率的热修复。
可选的,确定模块320具体用于通过热修复JS脚本,获得应用程序中的至少一个待修复OC类名、至少一个待修复OC类的待修复实例方法对应的第一JS函数列表、以及,至少一个待修复OC类的待修复OC类方法对应的第二JS函数列表;
根据至少一个待修复OC类名、至少一个待修复OC类的待修复实例方法对应的第一JS函数列表中的每个第一JS函数名,确定每个第一JS函数名各自对应的待修复OC函数的函数签名;以及,
根据至少一个待修复OC类名、至少一个待修复OC类的待修复类方法对应的第二JS函数列表中的每个第二JS函数名,确定每个第二JS函数名各自对应的待修复OC函数的函数签名。
可选的,还包括:
保存模块,用于在通过热修复JS脚本,获得应用程序中的至少一个待修复OC类名、至少一个待修复OC类的待修复实例方法对应的第一JS函数列表、以及,至少一个待修复OC类的待修复OC类方法对应的第二JS函数列表之后,将至少一个待修复OC类各自的待修复实例方法对应的第一JS函数列表中的每个第一JS函数,以及,至少一个待修复OC类各自的待修复OC类方法对应的第二JS函数列表中的每个第二JS函数,保存在至少一个待修复OC类各自对应的字典中。
可选的,生成模块330,具体用于根据每个第一JS函数名各自对应的待修复OC函数的函数签名,生成与每个第一JS函数名各自对应的待修复OC函数的新函数指针;以及,
根据每个第二JS函数名各自对应的待修复OC函数的函数签名,生成与每个第二JS函数名各自对应的待修复OC函数的新函数指针。
可选的,生成模块330具体用于根据每个第一JS函数名各自对应的待修复OC函数的函数签名,获取每个第一JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数;根据每个第一JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数,生成每个第一JS函数名各自对应的待修复OC函数的新函数指针;以及,
根据每个第二JS函数名各自对应的待修复OC函数的函数签名,获取每个第二JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数;根据每个第二JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数,生成每个第二JS函数名各自对应的待修复OC函数的新函数指针。
可选的,确定模块320具体用于通过调用第一回调函数获取目标待修复OC函数的对象指针;根据对象指针,从至少一个待修复OC类中确定目标待修复OC函数所属的目标待修复OC类;根据目标待修复OC类,确定与目标待修复OC函数对应的目标OC函数。
可选的,确定模块320具体用于根据目标待修复OC类,从目标待修复OC类的待修复实例方法对应的第一JS函数列表以及目标待修复OC类的目标待修复OC类方法对应的第二JS函数列表中,确定与目标待修复OC函数关联的热修复JS函数;根据热修复JS函数,确定与目标待修复OC函数对应的目标OC函数。
可选的,确定模块320具体用于当热修复JS函数执行时,调用热修复JS函数的JS子函数;当JS子函数执行时,通过调用第二回调函数获取正在执行的JS子函数的函数名;根据获取的JS子函数的函数名确定与JS子函数的函数名关联的OC函数,将与JS子函数的函数名关联的OC函数确定为目标OC函数。
可选的,获取模块310还用于在执行目标OC函数进行处理之前,通过调用第一回调函数获取目标待修复OC函数的参数列表的参数及所述参数的参数类型;将所述参数和所述参数类型封装成自定义类型的第一数据;将所述第一数据传递给JS端,以使所述JS端根据所述第一数据执行所述热修复JS函数。
可选的,所述确定模块320具体用于当所述JS子函数执行时,通过调用所述第二回调函数获取正在执行的所述JS子函数的参数和所述JS子函数的参数的参数类型;将所述JS子函数的参数和所述JS子函数的参数的参数类型封装成所述自定义类型的第二数据;将所述第二数据传递给OC端,以使所述OC端根据所述第二数据执行所述目标OC函数进行处理。
可选的,所述获取模块310还用于通过调用所述第一回调函数获取所述目标待修复OC函数的返回值地址;当所述目标待修复OC函数执行后,将执行所述目标待修复OC函数得到的返回值赋值到所述返回值地址。
可选的,所述获取模块310具体用于向服务端发送请求消息,所述请求消息包含所述应用程序的版本号;接收所述服务端根据所述请求消息和本地存储的配置文件下发的与所述应用程序的版本号对应的所述热修复JS脚本。
另外,本发明实施例还提供一种热修复装置,如图4所示,图4为本发明实施例所提供的另一种热修复装置的结构示意图。该热修复装置400包括处理器410,存储器420以及存储在存储器420上并可在处理器410上运行的计算机程序,该计算机程序被处理器410执行时实现上述实施例的热修复方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
本发明实施例还提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述的热修复方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。其中,的计算机可读存储介质,可以为只读存储器(Read-Only Memory,简称ROM)、随机存取存储器(Random Access Memory,简称RAM)、磁碟或者光盘等。
本发明实施例还提供了一种计算机程序,该计算机程序可以存储在云端或本地的存储介质上。在该计算机程序被计算机或处理器运行时用于执行本发明实施例的热修复方法的相应步骤,并且用于实现根据本发明实施例的热修复装置中的相应模块。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
Claims (26)
1.一种热修复方法,其特征在于,包括:
获取与应用程序对应的热修复JS脚本;
通过所述热修复JS脚本,确定至少一个待修复OC函数的函数签名;
根据所述至少一个待修复OC函数的函数签名,生成所述至少一个待修复OC函数各自的新函数指针;
采用所述至少一个待修复OC函数各自的新函数指针替换所述至少一个待修复OC函数各自的原函数指针;
若所述至少一个待修复OC函数中的目标待修复OC函数执行时,则执行所述目标待修复OC函数的新函数指针,以调用第一回调函数;
通过调用所述第一回调函数,确定与所述目标待修复OC函数对应的目标OC函数,并执行所述目标OC函数进行处理;所述新函数指针根据所述函数签名对应的返回值类型、参数类型和参数个数生成,所述第一回调函数用于获取所述目标待修复OC函数的对象指针,以确定所述目标待修复函数对应的目标OC函数。
2.根据权利要求1所述的方法,其特征在于,所述通过所述热修复JS脚本,确定至少一个待修复OC函数的函数签名,包括:
通过所述热修复JS脚本,获得所述应用程序中的至少一个待修复OC类名、至少一个待修复OC类的待修复实例方法对应的第一JS函数列表、以及,至少一个待修复OC类的待修复OC类方法对应的第二JS函数列表;
根据所述至少一个待修复OC类名、所述至少一个待修复OC类的待修复实例方法对应的第一JS函数列表中的每个第一JS函数名,确定每个所述第一JS函数名各自对应的待修复OC函数的函数签名;以及,
根据所述至少一个待修复OC类名、所述至少一个待修复OC类的待修复类方法对应的第二JS函数列表中的每个第二JS函数名,确定每个所述第二JS函数名各自对应的待修复OC函数的函数签名。
3.根据权利要求2所述的方法,其特征在于,在所述通过所述热修复JS脚本,获得所述应用程序中的至少一个待修复OC类名、至少一个待修复OC类的待修复实例方法对应的第一JS函数列表、以及,至少一个待修复OC类的待修复OC类方法对应的第二JS函数列表之后,还包括:
将所述至少一个待修复OC类各自的待修复实例方法对应的第一JS函数列表中的每个第一JS函数,以及,所述至少一个待修复OC类各自的待修复OC类方法对应的第二JS函数列表中的每个第二JS函数,保存在所述至少一个待修复OC类各自对应的字典中。
4.根据权利要求2或3所述的方法,其特征在于,所述根据所述至少一个待修复OC函数的函数签名,生成所述至少一个待修复OC函数各自的新函数指针,包括:
根据每个所述第一JS函数名各自对应的待修复OC函数的函数签名,生成与每个所述第一JS函数名各自对应的待修复OC函数的新函数指针;以及,
根据每个所述第二JS函数名各自对应的待修复OC函数的函数签名,生成与每个所述第二JS函数名各自对应的待修复OC函数的新函数指针。
5.根据权利要求4所述的方法,其特征在于,所述根据每个所述第一JS函数名各自对应的待修复OC函数的函数签名,生成与每个所述第一JS函数名各自对应的待修复OC函数的新函数指针,包括:
根据每个所述第一JS函数名各自对应的待修复OC函数的函数签名,获取每个所述第一JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数;根据每个所述第一JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数,生成每个所述第一JS函数名各自对应的待修复OC函数的新函数指针;以及,
所述根据每个所述第二JS函数名各自对应的待修复OC函数的函数签名,生成与每个所述第二JS函数名各自对应的待修复OC函数的新函数指针,包括:
根据每个所述第二JS函数名各自对应的待修复OC函数的函数签名,获取每个所述第二JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数;根据每个所述第二JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数,生成每个所述第二JS函数名各自对应的待修复OC函数的新函数指针。
6.根据权利要求5所述的方法,其特征在于,所述通过调用所述第一回调函数,确定与所述目标待修复OC函数对应的目标OC函数,包括:
通过调用所述第一回调函数获取所述目标待修复OC函数的对象指针;
根据所述对象指针,从所述至少一个待修复OC类中确定所述目标待修复OC函数所属的目标待修复OC类;
根据所述目标待修复OC类,确定与所述目标待修复OC函数对应的所述目标OC函数。
7.根据权利要求6所述的方法,其特征在于,所述根据所述目标待修复OC类,确定与所述目标待修复OC函数对应的所述目标OC函数,包括:
根据所述目标待修复OC类,从所述目标待修复OC类的待修复实例方法对应的第一JS函数列表以及所述目标待修复OC类的目标待修复OC类方法对应的第二JS函数列表中,确定与所述目标待修复OC函数关联的热修复JS函数;
根据所述热修复JS函数,确定与所述目标待修复OC函数对应的所述目标OC函数。
8.根据权利要求7所述的方法,其特征在于,所述根据所述热修复JS函数,确定与所述目标待修复OC函数对应的所述目标OC函数,包括:
当所述热修复JS函数执行时,调用所述热修复JS函数的JS子函数;
当所述JS子函数执行时,通过调用第二回调函数获取正在执行的所述JS子函数的函数名;
根据获取的所述JS子函数的函数名确定与所述JS子函数的函数名关联的OC函数,将与所述JS子函数的函数名关联的OC函数确定为所述目标OC函数。
9.根据权利要求8所述的方法,其特征在于,在所述执行所述目标OC函数进行处理之前,还包括:
通过调用所述第一回调函数获取所述目标待修复OC函数的参数列表的参数及所述参数的参数类型;
将所述参数和所述参数类型封装成自定义类型的第一数据;
将所述第一数据传递给JS端,以使所述JS端根据所述第一数据执行所述热修复JS函数。
10.根据权利要求9所述的方法,其特征在于,所述执行所述目标OC函数进行处理,包括:
当所述JS子函数执行时,通过调用所述第二回调函数获取正在执行的所述JS子函数的参数和所述JS子函数的参数的参数类型;
将所述JS子函数的参数和所述JS子函数的参数的参数类型封装成所述自定义类型的第二数据;
将所述第二数据传递给OC端,以使所述OC端根据所述第二数据执行所述目标OC函数进行处理。
11.根据权利要求10所述的方法,其特征在于,还包括:
通过调用所述第一回调函数获取所述目标待修复OC函数的返回值地址;
当所述目标待修复OC函数执行后,将执行所述目标待修复OC函数得到的返回值赋值到所述返回值地址。
12.根据权利要求1-3中任一项所述的方法,其特征在于,所述获得与应用程序对应的热修复JS脚本,包括:
向服务端发送请求消息,所述请求消息包含所述应用程序的版本号;
接收所述服务端根据所述请求消息和本地存储的配置文件下发的与所述应用程序的版本号对应的所述热修复JS脚本。
13.一种热修复装置,其特征在于,包括:
获取模块,用于获取与应用程序对应的热修复JS脚本;
确定模块,用于通过所述热修复JS脚本,确定至少一个待修复OC函数的函数签名;
生成模块,用于根据所述至少一个待修复OC函数的函数签名,生成所述至少一个待修复OC函数各自的新函数指针;
替换模块,用于采用所述至少一个待修复OC函数各自的新函数指针替换所述至少一个待修复OC函数各自的原函数指针;
执行模块,用于若所述至少一个待修复OC函数中的目标待修复OC函数执行时,则执行所述目标待修复OC函数的新函数指针,以调用第一回调函数;
所述确定模块,还用于通过调用所述第一回调函数,确定与所述目标待修复OC函数对应的目标OC函数,并执行所述目标OC函数进行处理;所述新函数指针根据所述函数签名对应的返回值类型、参数类型和参数个数生成,所述第一回调函数用于获取所述目标待修复OC函数的对象指针,以确定所述目标待修复函数对应的目标OC函数。
14.根据权利要求13所述的装置,其特征在于,所述确定模块,具体用于通过所述热修复JS脚本,获得所述应用程序中的至少一个待修复OC类名、至少一个待修复OC类的待修复实例方法对应的第一JS函数列表、以及,至少一个待修复OC类的待修复OC类方法对应的第二JS函数列表;
根据所述至少一个待修复OC类名、所述至少一个待修复OC类的待修复实例方法对应的第一JS函数列表中的每个第一JS函数名,确定每个所述第一JS函数名各自对应的待修复OC函数的函数签名;以及,
根据所述至少一个待修复OC类名、所述至少一个待修复OC类的待修复类方法对应的第二JS函数列表中的每个第二JS函数名,确定每个所述第二JS函数名各自对应的待修复OC函数的函数签名。
15.根据权利要求14所述的装置,其特征在于,还包括:
保存模块,用于在所述通过所述热修复JS脚本,获得所述应用程序中的至少一个待修复OC类名、至少一个待修复OC类的待修复实例方法对应的第一JS函数列表、以及,至少一个待修复OC类的待修复OC类方法对应的第二JS函数列表之后,将所述至少一个待修复OC类各自的待修复实例方法对应的第一JS函数列表中的每个第一JS函数,以及,所述至少一个待修复OC类各自的待修复OC类方法对应的第二JS函数列表中的每个第二JS函数,保存在所述至少一个待修复OC类各自对应的字典中。
16.根据权利要求14或15所述的装置,其特征在于,所述生成模块,具体用于根据每个所述第一JS函数名各自对应的待修复OC函数的函数签名,生成与每个所述第一JS函数名各自对应的待修复OC函数的新函数指针;以及,
根据每个所述第二JS函数名各自对应的待修复OC函数的函数签名,生成与每个所述第二JS函数名各自对应的待修复OC函数的新函数指针。
17.根据权利要求16所述的装置,其特征在于,所述生成模块,具体用于根据每个所述第一JS函数名各自对应的待修复OC函数的函数签名,获取每个所述第一JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数;根据每个所述第一JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数,生成每个所述第一JS函数名各自对应的待修复OC函数的新函数指针;以及,
根据每个所述第二JS函数名各自对应的待修复OC函数的函数签名,获取每个所述第二JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数;根据每个所述第二JS函数名各自对应的待修复OC函数的返回值类型、参数类型和参数个数,生成每个所述第二JS函数名各自对应的待修复OC函数的新函数指针。
18.根据权利要求17所述的装置,其特征在于,所述确定模块,具体用于通过调用所述第一回调函数获取所述目标待修复OC函数的对象指针;根据所述对象指针,从所述至少一个待修复OC类中确定所述目标待修复OC函数所属的目标待修复OC类;根据所述目标待修复OC类,确定与所述目标待修复OC函数对应的所述目标OC函数。
19.根据权利要求18所述的装置,其特征在于,所述确定模块,具体用于根据所述目标待修复OC类,从所述目标待修复OC类的待修复实例方法对应的第一JS函数列表以及所述目标待修复OC类的目标待修复OC类方法对应的第二JS函数列表中,确定与所述目标待修复OC函数关联的热修复JS函数;根据所述热修复JS函数,确定与所述目标待修复OC函数对应的所述目标OC函数。
20.根据权利要求19所述的装置,其特征在于,所述确定模块,具体用于当所述热修复JS函数执行时,调用所述热修复JS函数的JS子函数;当所述JS子函数执行时,通过调用第二回调函数获取正在执行的所述JS子函数的函数名;根据获取的所述JS子函数的函数名确定与所述JS子函数的函数名关联的OC函数,将与所述JS子函数的函数名关联的OC函数确定为所述目标OC函数。
21.根据权利要求20所述的装置,其特征在于,所述获取模块,还用于在所述执行所述目标OC函数进行处理之前,通过调用所述第一回调函数获取所述目标待修复OC函数的参数列表的参数及所述参数的参数类型;将所述参数和所述参数类型封装成自定义类型的第一数据;将所述第一数据传递给JS端,以使所述JS端根据所述第一数据执行所述热修复JS函数。
22.根据权利要求21所述的装置,其特征在于,所述确定模块,具体用于当所述JS子函数执行时,通过调用所述第二回调函数获取正在执行的所述JS子函数的参数和所述JS子函数的参数的参数类型;将所述JS子函数的参数和所述JS子函数的参数的参数类型封装成所述自定义类型的第二数据;将所述第二数据传递给OC端,以使所述OC端根据所述第二数据执行所述目标OC函数进行处理。
23.根据权利要求22所述的装置,其特征在于,所述获取模块,还用于通过调用所述第一回调函数获取所述目标待修复OC函数的返回值地址;当所述目标待修复OC函数执行后,将执行所述目标待修复OC函数得到的返回值赋值到所述返回值地址。
24.根据权利要求13-15中任一项所述的装置,其特征在于,所述获取模块具体用于向服务端发送请求消息,所述请求消息包含所述应用程序的版本号;接收所述服务端根据所述请求消息和本地存储的配置文件下发的与所述应用程序的版本号对应的所述热修复JS脚本。
25.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如权利要求1至12中任一项所述的热修复方法的步骤。
26.一种热修复装置,其特征在于,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至12中任一项所述的热修复方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910620523.9A CN110457151B (zh) | 2019-07-10 | 2019-07-10 | 热修复方法、装置及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910620523.9A CN110457151B (zh) | 2019-07-10 | 2019-07-10 | 热修复方法、装置及可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110457151A CN110457151A (zh) | 2019-11-15 |
CN110457151B true CN110457151B (zh) | 2022-01-28 |
Family
ID=68482473
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910620523.9A Active CN110457151B (zh) | 2019-07-10 | 2019-07-10 | 热修复方法、装置及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110457151B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113656207B (zh) * | 2021-08-16 | 2023-11-03 | 北京百度网讯科技有限公司 | 故障处理方法、装置、电子设备和介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101553769A (zh) * | 2005-10-11 | 2009-10-07 | 努雅公司 | 用于跟踪并监控计算机应用的***和方法 |
CN105589701A (zh) * | 2014-10-21 | 2016-05-18 | 阿里巴巴集团控股有限公司 | 一种客户端应用程序局部更新方法及装置 |
CN106547580A (zh) * | 2015-09-22 | 2017-03-29 | 腾讯科技(深圳)有限公司 | 挂钩函数的方法和装置 |
CN107391171A (zh) * | 2017-06-14 | 2017-11-24 | 广东网金控股股份有限公司 | 一种解决iOS热修复问题的方法以及用户终端 |
CN109101254A (zh) * | 2018-07-20 | 2018-12-28 | 江苏满运软件科技有限公司 | 一种热修复方法及设备 |
CN109144601A (zh) * | 2018-06-22 | 2019-01-04 | 北京奇艺世纪科技有限公司 | 在ios应用内调用函数的方法及*** |
CN109271187A (zh) * | 2018-09-17 | 2019-01-25 | 五八有限公司 | 一种应用程序的热修复方法、装置、存储介质及终端 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8924782B2 (en) * | 2007-01-26 | 2014-12-30 | The Trustees Of Columbia University In The City Of New York | Systems, methods, and media for recovering an application from a fault or attack |
WO2014022980A1 (en) * | 2012-08-08 | 2014-02-13 | Intel Corporation | Isa bridging including support for call to overidding virtual functions |
CN105988798B (zh) * | 2015-02-12 | 2020-07-31 | 南京中兴软件有限责任公司 | 补丁处理方法及装置 |
CN108415840A (zh) * | 2018-03-14 | 2018-08-17 | 百度在线网络技术(北京)有限公司 | 修复函数缺陷的方法、装置及服务器 |
-
2019
- 2019-07-10 CN CN201910620523.9A patent/CN110457151B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101553769A (zh) * | 2005-10-11 | 2009-10-07 | 努雅公司 | 用于跟踪并监控计算机应用的***和方法 |
CN105589701A (zh) * | 2014-10-21 | 2016-05-18 | 阿里巴巴集团控股有限公司 | 一种客户端应用程序局部更新方法及装置 |
CN106547580A (zh) * | 2015-09-22 | 2017-03-29 | 腾讯科技(深圳)有限公司 | 挂钩函数的方法和装置 |
CN107391171A (zh) * | 2017-06-14 | 2017-11-24 | 广东网金控股股份有限公司 | 一种解决iOS热修复问题的方法以及用户终端 |
CN109144601A (zh) * | 2018-06-22 | 2019-01-04 | 北京奇艺世纪科技有限公司 | 在ios应用内调用函数的方法及*** |
CN109101254A (zh) * | 2018-07-20 | 2018-12-28 | 江苏满运软件科技有限公司 | 一种热修复方法及设备 |
CN109271187A (zh) * | 2018-09-17 | 2019-01-25 | 五八有限公司 | 一种应用程序的热修复方法、装置、存储介质及终端 |
Also Published As
Publication number | Publication date |
---|---|
CN110457151A (zh) | 2019-11-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112765023B (zh) | 测试用例生成方法、装置 | |
CN110007926B (zh) | 语言转换方法及装置 | |
CN111596920B (zh) | 文件编译方法、装置、编译设备及存储介质 | |
WO2020177429A1 (zh) | 在应用中嵌入代码的方法、装置及电子设备 | |
CN110457151B (zh) | 热修复方法、装置及可读存储介质 | |
CN110795162B (zh) | 生成容器镜像文件的方法和装置 | |
CN111552464A (zh) | 一种sdk生成方法、装置、设备及介质 | |
CN108595178B (zh) | 一种基于hook的数据采集方法、装置及设备 | |
CN109032612B (zh) | 混合型应用的接口调用方法、装置及计算机可读存储介质 | |
CN104252413A (zh) | 一种自动化脚本生成方法、装置及*** | |
CN112801302A (zh) | 一种基于接口的机器学习模型发布方法和*** | |
CN109508193B (zh) | 一种应用部署运行方法、装置、终端设备和介质 | |
CN114115884A (zh) | 一种编程服务的管理方法以及相关装置 | |
CN113342447B (zh) | 基于Flutter的页面生成方法、装置、设备及存储介质 | |
US10474443B2 (en) | Code lineage tool | |
CN116755788A (zh) | 一种线上规则修改方法、装置、设备及存储介质 | |
CN110750310A (zh) | 基于ios***组件化开发的二进制和源码切换方法 | |
US20180373512A1 (en) | Method and device for simulating synchronous blocking in asynchronous environment, storage medium, server and terminal | |
CN110286936B (zh) | 热修复方法、装置、电子设备以及存储介质 | |
CN107943539B (zh) | 应用页面启动方法和应用页面启动装置 | |
CN106161050B (zh) | 问题资源指示装置及问题资源指示方法 | |
CN113708971A (zh) | 一种Openstack云平台的部署方法及相关装置 | |
CN114327593A (zh) | Unity打包Android生成aar的方法、***及电子设备 | |
CN114764335A (zh) | 一种生成镜像的方法、装置、终端及存储介质 | |
CN115168175A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |