TPatch动态补丁系统(iOS)

作者:朱煌

TPatch是一套使用JavaScript给iOS打热补丁的系统,能非常有效的解决线上App的Crash和各种问题。

1.从何而来?

对于每一个开发,从写Hello World开始,到使用各种语言,可能都会遇到各种BUG。有的BUG能快速解决,比如Web侧的,发个JS或者Html即可。但是在终端开发中,比如iOS,发现的线上问题往往没那么快能解决,换包可能需要Apple短则几天长则一周以上的审核,成本很高。有没有办法能快速解决iOS App的线上问题?TPatch是其中一种比较好的解决方案。

2.TPatch特点

  • 支持多线程: 使用JS打补丁的天然优势在于JavaScriptCore是线程安全的,虽然锁的粒度有点大,并且有些方法的锁有问题(这些在TPatch都已解决)。
  • 支持Block: JS中的function和OC的Block有很多相似之处。有补丁中定义的function,传递到OC,我们会转成Block,并且Block可以在OC和JS之间传递,这点Lua补丁是很难做到。
  • 异步机制: 由于JavsSciptCore是线程安全的,同时也带来另外一个问题,假如工作线程和主线程都打了补丁,工作线程的补丁耗时非常严重,这时候如果主线程补丁开始运行,就会被阻塞。TPatch引入了异步机制,能让进入JSCore的补丁快速返回,异步执行,减少补丁之间的影响。
  • 支持在线Reset回滚: 在补丁发布后,有可能通过监控发现补丁有问题,这时候用户侧的运行逻辑已经被“污染”。TPatch支持,在补丁后台设置该补丁过期后,用户侧App会删掉本地有问题的补丁包,并且在线Reset,而不是等App重启后再恢复,下次重启可能得好几天。
  • 调试方便: 利用JavaScriptCore的天然优势,其内部提供了Debug接口。我们可以像调试App里面的网页一样,使用Mac下的Safari远程调试补丁,断点、堆栈、异常等一目了然。
  • 精准投放: TPatch支持按用户、iOS版本、业务App版本和Mask标记投放。Mask是一个可扩展的bit标记,业务可以自定义,比如取一位越狱标记,或者网络标记,补丁就可以根据是否越狱和网络标记下发。

3.核心原理

TPatch包括补丁包后台系统和终端组件,其核心原理是补丁后台根据补丁配置,下发一段补丁JS给终端,终端执行这段补丁,利用OC Runtime覆盖有问题的方法或者执行一段逻辑,修正运行时的逻辑,从而达到修复BUG的目的。

4.打补丁流程

1) 在补丁后台下发补丁脚本后,首先会经过iOS7及以上系统自带的JavaScriptCore.framework把JS补丁执行起来,通过调用TPatch.js里面的Bridge接口,调用到OC里面打补丁的方法,打上补丁。 2) 当业务代码执行这段已经打了补丁的功能时,不会是原来的OC代码,而是一段JS代码。JS可以通过JS引起和OC引擎支持Block、异步执行等,并且支持在线Reset回滚。

5.和其他方案对比

  • waxPatch: 是使用Lua+Wax打补丁的方案,App需要集成Lua解释器和Wax框架(接近1M)。不过waxPatch对Block不太完善,多线程补丁也可能有问题,Wax也已经两年没人维护。相比之下TPatch更加轻量,对安装包影响仅200K,功能也更加强大。
  • JSPatch: 同样使用JS来打补丁,和TPatch终端组件核心原理是相似的。不过JSPatch在实际的海量产品中运用还有不少问题没解决,比如Block传递、多线程Crash等问题,TPatch解决了这些问题,更加稳定,并且支持异步机制、动态回滚等优化特性。

文章来源公众号:QQ空间终端开发团队(qzonemobiledev)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏EAWorld

Micronaut:面向未来的微服务和云原生应用框架

原题:MICRONAUT: A JAVA FRAMEWORK FOR THE FUTURE, NOW

1552
来自专栏.NET技术

.net core实践系列之短信服务-Sikiro.SMS.Bus服务的实现

前两篇《.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现》、《.net core实践系列之短信服务-Api的SDK的实现与测试》分别...

671
来自专栏腾讯移动品质中心TMQ的专栏

Crash之防测漏篇

做Android/iOS测试也有一段时间了,随着项目壮大,版本crash问题也越来越突出。如何有效地对crash进行预防拦截呢?请看下文。 1 APP闪退背后...

2188
来自专栏Coding01

使用 PubSubHubbub 制作 RSS 定时器 —— Laravel RSS (三)

由于我们使用 xpath 方式去抓取网站的内容,这些网站更新了内容,但它们不会实时告诉你它们更新了;所以「RSS 阅读器如何做到所谓的的「更新」呢?」

942
来自专栏linux驱动个人学习

各种根文件系统

(1) jffs2   JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2...

3767
来自专栏李蔚蓬的专栏

An overview of the Web(Web概述)

C/S结构和B/S结构是当今世界网绍程序开发体系结构的两大主流.目前,这两种结构都有自己的市 场份和客户群。但是,这两种体系结构又各有各的优点和缺点,下面将从...

723
来自专栏liulun

Nim教程【一】

这应该是国内第一个关于Nim入门的系列教程 什么是Nim 我们先来引述网友 Luikore的一段话: Nim 不是函数式的, 但 ...

2699
来自专栏Hadoop实操

如何在CDH中使用Solr对HDFS中的JSON数据建立全文索引

2804
来自专栏杨建荣的学习笔记

曲折的dump导入及问题分析(r5笔记第47天)

今天下午的时候得到反馈,说开发在导入一个dump的时候报了错误,他们尝试连接数据库,发现连接都有问题,让我们赶紧看看。 这是一个测试环境的库,在服务器上同时还跑...

3525
来自专栏黑白安全

WEB API安全性

应用程序编程接口(API)是允许应用程序彼此通信的软件中介。它为开发人员构建软件应用程序提供例程,协议和工具,同时以可访问的方式提取和共享数据。

1671

扫码关注云+社区