皮皮网
皮皮网

【开发苹果源码】【表达式源码】【新飞飞科技源码】hermes源码

时间:2024-12-28 16:18:39 来源:sniper源码

1.Hermes源码分析(二)——解析字节码
2.阿里IM技术分享(六):闲鱼亿级IM消息系统的源码离线推送到达率优化
3.火星救援有看的吗?
4.深入浅出JavaScriptCore

hermes源码

Hermes源码分析(二)——解析字节码

        前面一节 讲到字节码序列化为二进制是有固定的格式的,这里我们分析一下源码里面是源码怎么处理的

        这里可以看到首先写入的是魔数,他的源码值为

        对应的二进制见下图,注意是源码小端字节序

        第二项是字节码的版本,笔者的源码版本是,也即 上图中的源码开发苹果源码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、springboot启动类源码厂商、设备、用户和承接页等环节。消息从推送产生到用户最终进入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具有重要指导意义。如果你对这些内容感兴趣,不妨深入了解并实践。

更多内容请点击【休闲】专栏