版权声明:本文由朱煌原创文章,转载请注明出处: 
文章原文链接:https://www.qcloud.com/community/article/160

来源:腾云阁 https://www.qcloud.com/community

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解决了这些问题,更加稳定,并且支持异步机制、动态回滚等优化特性。

TPatch动态补丁系统(iOS)的更多相关文章

  1. OSGI(面向Java的动态模型系统)

    基本简介编辑 OSGI服务平台提供在多种网络设备上无需重启的动态改变构造的功能.为了最小化耦合度和促使这些耦合度可管理,OSGi技术提供一种面向服务的架构,它能使这些组件动态地发现对方.OSGi联 O ...

  2. Linux生成动态库系统

    Linux生成动态库系统 一个.说明 Linux下动态库文件的扩展名为 ".so"(Shared Object). 依照约定,全部动态库文件名称的形式是libname.so(可能在 ...

  3. OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统

    OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统 OSGi 的核心:模块化.动态.基于 OSGi 就可以模块化的开发 java 应用,模块化的部署 java 应用,还可以动态管理 ...

  4. 双系统IOS\windows7 换成Windows10后果

    昨天将双系统IOS 和Windows7 换成了Windows10后 发现原来在IOS盘"E"盘下面的文件都不显示了,而且盘符都打不开,那叫一个着急啊,开发项目的代码全在那个盘符里面 ...

  5. [COGS257]动态排名系统 树状数组套主席树

    257. 动态排名系统 时间限制:5 s   内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...

  6. OSGi是什么:Java语言的动态模块系统(一)

    OSGi是什么 OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础架构.OSGi容器已有多家开源实现,比如Knoflerfish.Equinox和Apache的Felix.您 ...

  7. bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)

    bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统) cogs zoj bzoj-权限 题解 bzoj和zoj都是骗访问量的233,我没有 ...

  8. YS动态口令系统接入流程

    动态口令是保护用户账户的一种常见有效手段,即用户进行敏感操作(比如登录)时,需要用户提供此动态生成的口令做二次身份验证,假设用户的口令被盗,如果没有动态口令,也无法进行登录或进行敏感操作,保护了用户的 ...

  9. OSGI 面向Java的动态模型系统

    OSGI (面向Java的动态模型系统) OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范.OSGi一方面指维护OSGi规范的OSG ...

随机推荐

  1. 看懂UML类图和时序图

    看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...

  2. MyBatis的返回参数类型和查询结果遍历

    MyBatis的返回参数类型分两种 1. 对应的分类为: 1.1.resultMap: 1.2.resultType: 2 .对应返回值类型: 2.1.resultMap:结果集 2.2.result ...

  3. QT笔记之VS2010 Qt中导入qrc资源文件

    转载1:http://qimo601.iteye.com/blog/1404693 转载2:http://blog.sina.com.cn/s/blog_92cde3060101lobm.html 转 ...

  4. Struts2的处理结果(二)——处理结果的类型

    Struts2的处理结果(二) --处理结果的类型 1.Struts2內建的支持的结果类型: 在<result>元素中的type属性,确定了结果类型. chain:Action链式处理的结 ...

  5. SqlSever基础 over与avg配合,将平均值添加到原表的右侧,并为新列起名

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  6. LTMP手动编译安装以及全自动化部署实践(附详细代码)

    大家使用LNMP架构,一般可以理解为Linux Shell为CentOS/RadHat/Fedora/Debian/Ubuntu/等平台安装LNMP(Nginx/MySQL /PHP),LNMPA(N ...

  7. BZOJ 1797 最小割

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1797 题意:给出一个有向图,每条边有流量,给出源点汇点s.t.对于每条边,询问:(1)是 ...

  8. web后门top

    看到了一个博客  觉得关键点很有用 1)出现频率最高的DDoS后门文件名 abc.php, xl.php, Xml.php, dedetag.class.php, counti.php, plase. ...

  9. C# WPF MVVM 实战 – 4 - 善用 IValueConverter

    IValueConverter,做 WPF 的都应该接触过,把值换成 Visibility .Margin 等等是最常见的例子,也有很多很好的博文解释过用法.本文只是解释一下,MVVM 中一些情景. ...

  10. ARM家族大检阅

    首先列举下几个名称: 6410 2440 210 A8 ARM9 ARM11 ARMv7 ARMv6 进行分类: 1.芯片名称: 2440 6410 210 2.ARM核: A8 ARM9 ARM11 ...