1.Hermes源码分析(二)——解析字节码
2.阿里IM技术分享(六):闲鱼亿级IM消息系统的源码离线推送到达率优化
3.火星救援有看的吗?
4.深入浅出JavaScriptCore
Hermes源码分析(二)——解析字节码
前面一节 讲到字节码序列化为二进制是有固定的格式的,这里我们分析一下源码里面是源码怎么处理的这里可以看到首先写入的是魔数,他的源码值为
对应的二进制见下图,注意是源码小端字节序
第二项是字节码的版本,笔者的源码版本是,也即 上图中的源码jquery的源码下载4a
第三项是源码的hash,这里采用的源码是SHA1算法,生成的源码哈希值是位,因此占用了个字节
第四项是源码文件长度,这个字段是源码位的,也就是源码下图中的为0aa,转换成十进制就是源码,实际文件大小也是源码这么多
后面的字段类似,就不一一分析了,源码头部所有字段的源码类型都可以在BytecodeFileHeader.h中看到,Hermes按照既定的内存布局把字段写入后再序列化,就得到了我们看到的字节码文件。
这里写入的数据很多,以函数头的写入为例,我们调用了visitFunctionHeader方法,并通过byteCodeModule拿到函数的签名,将其写入函数表(存疑,在实际的文件中并没有看到这一部分)。注意这些数据必须按顺序写入,因为读出的时候也是按对应顺序来的。
我们知道react-native 在加载字节码的时候需要调用hermes的prepareJavaScript方法, 那这个方法做了些什么事呢?
这里做了两件事情:
1. 判断是否是字节码,如果是则调用createBCProviderFromBuffer,否则调用createBCProviderFromSrc,微信注册源码我们这里只关注createBCProviderFromBuffer
2.通过BCProviderFromBuffer的构造方法得到文件头和函数头的信息(populateFromBuffer方法),下面是这个方法的实现。
BytecodeFileFields的populateFromBuffer方法也是一个模版方法,注意这里调用populateFromBuffer方法的是一个 ConstBytecodeFileFields对象,他代表的是不可变的字节码字段。
细心的读者会发现这里也有visitFunctionHeaders方法, 这里主要为了复用visitBytecodeSegmentsInOrder的逻辑,把populator当作一个visitor来按顺序读取buffer的内容,并提前加载到BytecodeFileFields里面,以减少后面执行字节码时解析的时间。
Hermes引擎在读取了字节码之后会通过解析BytecodeFileHeader这个结构体中的字段来获取一些关键信息,例如bundle是否是字节码格式,是否包含了函数,字节码的版本是否匹配等。注意这里我们只是解析了头部,没有解析整个字节码,后面执行字节码时才会解析剩余的部分。
evaluatePreparedJavaScript这个方法,主要是调用了HermesRuntime的 runBytecode方法,这里hermesPrep时上一步解析头部时获取的BCProviderFromBuffer实例。
runBytecode这个方法比较长,主要做了几件事情:
这里说明一下,Domain是用于垃圾回收的运行时模块的代理, Domain被创建时是空的,并跟随着运行时模块进行传播, 在运行时模块的整个生命周期内都一直存在。在某个Domain下创建的所有函数都会保持着对这个Domain的强引用。当Domain被回收的美团网源码时候,这个Domain下的所有函数都不能使用。
未完待续。。。
阿里IM技术分享(六):闲鱼亿级IM消息系统的离线推送到达率优化
本文由阿里闲鱼技术团队逸昂分享,原题“消息链路优化之弱感知链路优化”,有修订和改动,感谢作者的分享。
引言:闲鱼的IM消息系统作为买家与卖家的沟通工具,对于提升用户体验和商品成交至关重要。随着业务体量的快速增长,当前这套消息系统正面临离线推送到达率问题,这是影响用户体验的关键因素。
系列文章:本文是系列文章的第6篇,主要探讨解决离线推送的到达率问题的技术实践。内容包括问题分析和技术优化思路等,旨在为读者提供启发。
通信链路类型的划分:将消息链路分为强感知链路和弱感知链路。强感知链路强调端到端延迟和消息到达率,而弱感知链路则主要关注消息的到达率,因为接收方可能是离线状态。
弱感知链路定义:弱感知链路指的是离线消息推送系统,相对于在线消息和端内推送,离线推送难以确保用户的感知。常见问题包括消息未发送到用户设备、被系统折叠或忽略。
弱感知链路逻辑构成:弱感知链路包含Hermes、agoo、远控 vc源码厂商、设备、用户和承接页等环节。消息从推送产生到用户最终进入APP,共经历5个步骤。
弱感知链路具体问题:核心问题在于优化到达设备的阶段,提升消息到达率。通过漏斗图分析,确定优化重点,并针对每个步骤进行优化。
技术优化手段:首先优化agoo受理率,通过明确用户对应的设备信息,避免无效调用。其次优化厂商推送通道受理率,标记不同类型消息,避免触发厂商的推送限制。最后优化Push点击率,增加跳过广告功能并优化权限校验。
实际优化效果:通过技术优化,弱感知链路的离线消息到达率有了明显提升,整体效果显著。
总结:本文主要关注IM消息系统中弱感知链路的优化,特别是离线消息送达率问题。在复杂的消息系统发展中,面临的问题和挑战将继续分享和探讨。
相关资料:提供了一系列相关资料链接,涵盖IM系统设计、优化和实践等内容,音视频 源码旨在为开发者提供全面的学习资源。
学习交流:推荐多篇移动端IM开发入门文章和开源IM框架源码,鼓励开发者深入学习和实践。文章已同步发布于“即时通讯技术圈”公众号,欢迎关注。
火星救援有看的吗?
科幻片是否伟大,要看它是否经得起以十年为单位的时间考验。
毫无疑问,《火星救援》的导演,雷德利.斯科特就有执导伟大科幻**的能力。
火星救援是年美国导演雷德利.斯科特执导的科幻**。**根据安迪.威尔年小说火星,它被改编成剧本由德鲁.戈达德。主演马特达蒙。
导演雷德利.斯科特国内的观众朋友们很熟悉,国内观众们非常熟悉的《异形》系列即是斯科特的作品。而对笔者来说,年的《银翼杀手》才是笔者最崇敬的科幻**,没有之一。
而剧本德鲁.戈达德正是《林中小屋》的编剧。
事实上,世纪福克斯安排金牌制片人赛蒙.金伯格参加本片,其意图已经非常明显,那就是将本片作为公司冲击年奥斯卡的主打**。
笔者美国的同行有人将火星救援与年时代华纳的Gravity比较,笔者难以认同,同样为制作规模较小的**,《火星救援》有远远丰满的剧情。下面笔者简要介绍一下《火星救援》的故事。
**开始,直接切入主人公的火星任务,天气突变,在火星表面执行任务的队员必须马上返回。主人公Mark Watney在一阵混乱中被科考仪器击中,消失在沙尘暴中。
队长(参演星际穿越的Jessica Chastain饰演)Lewis下令放弃Mark Watney,立即驾驶Hermes号飞船返回地球。第二天,Mark Watney并没有死,而是利用之前建设的火星科考站的设备,成功自救。在接下来的时间内,因为科考站失了与地球联系的通讯装置,Mark Watney必须在所有人默认他已经牺牲的情况下,利用有限的水和食物,养活自己,并且期待NASA能够发展他还活着。于是Mark利用自己生物学家的身份,各种开大,用他自己的话说,“science the shit out of this”。
这个时候,NASA正在宣布Mark Watney的意外牺牲。而一位女科学家意外的从NASA部署在火星表面的卫星,发现了科考站的全地形车被移动了,从而启动营救Mark Watney的行动。
Mark Watney在保证基本生存的同时,不忘与地面取得联系。主角光环再次启动,Mark天才的想到年NASA发射的火星探测器PathFinder当年的着陆地点离科考站并不远,主人公成功获得并且(不出意外)的激活了老古董通讯器。与此同时,地球上NASA方面的科学家Vincent发现Mark激活Pathfinder之后,从NASA的仓库中找出当年的副品研究。Pathfinder上安装有一个可以度旋转的摄像头,NASA方面经过研究发现,可以从地球控制火星上的摄像头,但不能传递除此之外的信息。正在剧情再次陷入困局之时,Mark再次(不出意外的)天才的将摄像头周围的度分割为格,从而将摄像头转化为可以传递制信息,从而NASA方面终于可以勉强向Mark传递制信息,但是为了更方面沟通,NASA告诉Mark在PathFinder上修改源代码,从而建立了NASA与火星科考站的双向文字通信。
Mark与NASA方面迅速交换了彼此的现况,NASA一方面表示一定会营救Mark,一方面隐瞒着并没有将Mark还幸存的消息传达给正在返航地球的Hermes号飞船上的队员。几经纠结后,NASA将真相告诉Mark,Mark异常愤怒。在这里,观众们非常熟悉的看到了NASA的内部通信系统也自动将Fuck过滤成了F***,令人忍俊不禁。
与此同时,NASA决定将Mark还活着的消息告诉Hermes上的队员。并且全力投入营救Mark。
**就是剧情的不断起伏,正在观众长松一口气之时,Mark在一次例行出行时,意外将科考站的压力门炸毁,整个科考站内部全部被毁,包括Mark栽培,作为主食的土豆,全部被毁。NASA不得不仓促发射补给火箭,但是发射失败,无人火箭爆炸。这时留给Mark的时间已经不多,镜头给到天朝宇航中心,中国方面面临两个选择:1,不告诉美方,中国已经研制成功的太阳神助推器可以完成美方需求。2,告诉美方,但绝密的太阳神推进器项目也宣告彻底曝光,亦即项目失败。天朝非常大国风范的将推进器交给NASA,同时宇航实验室的一位黑人年轻科学家完成了轨道计算,提出一个冒险的方案营救Mark:利用太阳神推进器将补给和其他设备发射进环地轨道,而Hermes在环地轨道上连接太阳神发射出的太空舱获得补给,环绕地球飞信一周之后飞向火星,而在火星上同样,由Mark利用在火星的发射器将自己发射向太空,而Hermes进入环火星轨道,减速,接住Mark。
深入浅出JavaScriptCore
JavaScriptCore在移动前端开发中的重要性不言而喻,它是React Native和Weex等跨平台应用在iOS与Android上运行的关键支持。要深入理解JSCore,首先需要了解浏览器及其历史,尤其是WebKit,它是一个负责页面渲染和逻辑处理的引擎。
WebKit由WebCore和JavaScriptCore两大部分组成,其中WebCore是核心渲染引擎,负责处理HTML、CSS和JavaScript,而JavaScriptCore则是JavaScript引擎,它在WebKit中作为内嵌的虚拟机,负责解释和执行JavaScript代码。多种浏览器引擎,如Google的V8、Mozilla的SpiderMonkey和Facebook的Hermes,虽然基于WebKit,但对JavaScript执行进行了优化。
JSCore的工作流程包括词法分析、语法分析和字节码生成。词法分析将JavaScript源代码分解为Token,而语法分析则创建抽象语法树。生成的字节码在LLInt和JIT的解释执行下运行,LLInt负责常规执行,而JIT在遇到复杂情况时提供优化,如通过堆栈替换(OSR)来提高速度。
JavaScriptCore的单线程机制是其独特之处,由于JS的执行是线程内,事件驱动机制允许在主线程外处理耗时任务。在React Native中,Apple封装的JSCore允许Native与JS交互,提供了一系列关键组件如JSVirtualMachine、JSContext和JSValue,用于执行环境管理、值传递和与Native的交互。
总的来说,JavaScriptCore是连接Native与JavaScript的世界的关键桥梁,其复杂的内部机制和与Native的交互方式,对于前端开发者理解和使用跨平台应用框架如React Native具有重要指导意义。如果你对这些内容感兴趣,不妨深入了解并实践。