一种基于模板代码匹配的轻量级热修复方法与流程

文档序号:24499724发布日期:2021-03-30 21:28阅读:123来源:国知局
一种基于模板代码匹配的轻量级热修复方法与流程

本发明涉及移动应用热修复领域,特别涉及一种基于模板代码匹配的轻量级热修复方法。



背景技术:

现有的移动应用功能愈趋丰富,在测试阶段难以完全覆盖所有用户使用场景,应用上架后线上问题时有发生。尤其是在ios平台上,由于苹果的审核机制,在出现线上问题时只能依赖发版,需要较长的周期来完成修复,从而导致线上问题快速扩散。

现有技术中,虽也有热修复功能的开源技术,比如ios平台的jspatch,但是其不符合ios(ios是由苹果公司开发的移动操作系统)应用的热修复规则,限制了热修复功能在ios应用中的使用。因此需要一种能通过系统平台审核并符合ios和android热修复规则的方案。

另外一方面,业内现有的热修复方案大都是代码或逻辑全量替换,修复方式单一。因此,亦需要一种灵活且支持多种技术手段的轻量级热修复方案。



技术实现要素:

本发明要解决的技术问题是克服现有技术的缺陷,提供一种基于模板代码匹配的轻量级热修复方法。

为了解决上述技术问题,本发明提供了如下的技术方案:

本发明一种基于模板代码匹配的轻量级热修复方法,通过后台mis系统下发热修复指令,指令的格式为json文本,其内容包括:

a1、当前热修复指令所针对的客户端版本号;

a2、当前热修复指令的id;

a3、当前热修复指令所针对的客户端的bundleid;

a4、当前热修复指令所嵌入的代码块的类名;

a5、当前热修复指令所嵌入的代码块的方法或函数;

a6、当前热修复指令嵌入方法或函数中的执行时机;

a7、当前热修复指令需要执行的修复内容;

进一步地,移动客户端接收到热修复指令后,其执行步骤为:

s1.判断热修复指令所针对的客户端bundleid和版本号,只有在这两个都匹配上的情况下才会执行热修复指令;

s2.获取热修复指令代码所需嵌入的类和方法名,并使用aop的方式hook住该类中的方法,当该方法执行时附着执行热修复代码;

s3.将指令中的热修复内容在客户端进行模板代码匹配,生成可执行代码后运行;

s4.热修复指令的撤销:

当发现某次下发的热修复指令有问题时,还可以通过下发一个撤销热修复的指令来删除之前下发的热修复指令;

撤销热修复的指令内容为所需撤销的热修复指令的id,数组格式,可一次性撤销多个热修复指令。

与现有技术相比,本发明的有益效果如下:

1.基于模板代码匹配的思路实现线上问题的热修复,符合移动平台的规则并能通过应用审核;

2.可提供多种灵活的动态修复方式。

支持的修复方式包括如下五种:

一、支持在指定函数或方法执行前或执行后动态嵌入热修复代码;

二、支持整体替换指定函数或方法的实现;

三、支持动态新增类的成员变量或属性;

四、支持动态新增类的函数或方法;

五、支持指定热修复代码和逻辑的执行线程。

附图说明

附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:

图1为模板代码库匹配示意图

图2为android平台动态新增成员变量示意图

图3为ios平台动态新增函数或方法示意图

图4为本发明实施流程示意图。

具体实施方式

以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。

实施例1

如图1-4所示,本发明提供一种基于模板代码匹配的轻量级热修复方法,通过后台mis系统下发热修复指令,指令的格式为json文本,其内容包括:

a1、当前热修复指令所针对的客户端版本号;

a2、当前热修复指令的id;

a3、当前热修复指令所针对的客户端的bundleid;

a4、当前热修复指令所嵌入的代码块的类名;

a5、当前热修复指令所嵌入的代码块的方法或函数;

a6、当前热修复指令嵌入方法或函数中的执行时机(原方法或函数执行前/后执行或替代执行);

a7、当前热修复指令需要执行的修复内容;

进一步地,移动客户端接收到热修复指令后,其执行步骤为:

s1.判断热修复指令所针对的客户端bundleid和版本号,只有在这两个都匹配上的情况下才会执行热修复指令;

s2.获取热修复指令代码所需嵌入的类和方法名,并使用aop的方式hook住该类中的方法(比如可使用开源库aspects),当该方法执行时附着执行热修复代码;

s3.将指令中的热修复内容在客户端进行模板代码匹配,生成可执行代码后运行;

s4.热修复指令的撤销:

当发现某次下发的热修复指令有问题时,还可以通过下发一个撤销热修复的指令来删除之前下发的热修复指令;

撤销热修复的指令内容为所需撤销的热修复指令的id,数组格式,可一次性撤销多个热修复指令。

具体的,总体设计为服务端下发热修复的json指令,客户端接受到指令后,将json中的内容通过客户端预置的模板代码库进行解析后执行热修复操作。模板代码的匹配包括表达式和执行语句两个部分的内容。

表达式包括算术运算符,逻辑运算符和关系运算符。

表达式匹配json格式示例如下

对应的模板库代码为,以ios平台为例

对应的执行输出代码为

(3+5)。

执行语句包括成员变量的访问,赋值,条件判断和方法调用四类。成员变量的访问和赋值在ios平台通过kvc的方式实现,在安卓平台通过反射的方式实现。

成员变量访问的json格式示例为

对应的模板库代码,以ios平台为例

return[selfvalueforkey:property[@"name"]];

赋值语句json格式示例如下

对应的模板库代码为,以ios平台为例

return[selfsetvalue:assignment[@"value"]

forkey:assignment[@"name"]];

条件判断的json格式示例为

对应的条件判断模板库解析后的代码为

if((1==2&&1.0>=0.5)//3<0){

}else{

}。

方法调用的json格式示例为

对应的方法调用模板库解析后的代码为,以ios平台为例

[rjmaincontrollercodefromcity:@"nanjing"];。

本发明只是阐述模板库的思想,并未穷举所有模板及其实现细节。理论上只要模板库足够丰富,是可以覆盖大部分热修复场景要求的。

另外一方面,本发明功能特性之二为动态新增成员变量。

新增成员变量或属性在ios平台通过runtime的关联对象来实现,android平台由于没有相关技术,采用存储信息的方式来实现。具体方案分别如下:

ios平台实现原理为通过runtime关联对象的方式来绑定需要新增的成员变量或属性,具体实现为:

android平台实现原理为通过存储信息的方式来实现,存储的key为类名+变量名,value为变量值。

本发明功能特性之三为动态新增函数或方法。目前此功能只在ios平台实现,原理为利用动态决议方法,在ios平台中调用不存在的方法,系统会自动跳转到动态决议方法中,若动态决议方法仍然未提供该方法的实现,则抛出异常。新增方法的原理即在动态决议方法中调用模板匹配代码,来实现新方法的生成和调用。其json指令格式如下:

上面json格式新定义了一个missmethod方法,该方法的实现为调用rjmaincontroller的codefromcity方法。当下发json指令后,系统调用missmethod方法,由于方法不存在,会自动转发到动态决议方法中

-(id)forwardingtargetforselector:(sel)aselector。

在动态决议方法中,判断当前转发过来的方法是否是json中指定的新增方法,若是,则将content中的内容作为模板代码匹配后执行。

本发明功能特性之四为指定热修复代码的执行线程。在json指令中指定代码或者新增方法的执行线程,json格式为:

在ios平台中,主线程和非主线程可以用下面模板代码来匹配

在android平台中,主线程和非主线程可以用下面模板代码来匹配

与现有技术相比,本发明的有益效果如下:

1.基于模板代码匹配的思路实现线上问题的热修复,符合移动平台的规则并能通过应用审核;

2.可提供多种灵活的动态修复方式。

支持的修复方式包括如下五种:

一、支持在指定函数或方法执行前或执行后动态嵌入热修复代码;

二、支持整体替换指定函数或方法的实现;

三、支持动态新增类的成员变量或属性;

四、支持动态新增类的函数或方法;

五、支持指定热修复代码和逻辑的执行线程。

最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1