1.阿里IM技术分享(六):闲鱼亿级IM消息系统的仿闲仿闲离线推送到达率优化
2.腾讯nft是哪个链上的
3.如何用 Flutter 实现混合开发?闲鱼公开源代码实例
阿里IM技术分享(六):闲鱼亿级IM消息系统的离线推送到达率优化
本文由阿里闲鱼技术团队逸昂分享,原题“消息链路优化之弱感知链路优化”,鱼a源码鱼A源码有修订和改动,仿闲仿闲感谢作者的鱼a源码鱼A源码分享。
引言:闲鱼的仿闲仿闲IM消息系统作为买家与卖家的沟通工具,对于提升用户体验和商品成交至关重要。鱼a源码鱼A源码商城积分系统源码随着业务体量的仿闲仿闲快速增长,当前这套消息系统正面临离线推送到达率问题,鱼a源码鱼A源码这是仿闲仿闲影响用户体验的关键因素。
系列文章:本文是鱼a源码鱼A源码系列文章的第6篇,主要探讨解决离线推送的仿闲仿闲到达率问题的技术实践。内容包括问题分析和技术优化思路等,鱼a源码鱼A源码旨在为读者提供启发。仿闲仿闲
通信链路类型的鱼a源码鱼A源码划分:将消息链路分为强感知链路和弱感知链路。强感知链路强调端到端延迟和消息到达率,仿闲仿闲而弱感知链路则主要关注消息的到达率,因为接收方可能是离线状态。
弱感知链路定义:弱感知链路指的是离线消息推送系统,相对于在线消息和端内推送,离线推送难以确保用户的感知。常见问题包括消息未发送到用户设备、被系统折叠或忽略。
弱感知链路逻辑构成:弱感知链路包含Hermes、agoo、厂商、设备、用户和承接页等环节。消息从推送产生到用户最终进入APP,共经历5个步骤。
弱感知链路具体问题:核心问题在于优化到达设备的阶段,提升消息到达率。通过漏斗图分析,确定优化重点,并针对每个步骤进行优化。
技术优化手段:首先优化agoo受理率,通过明确用户对应的设备信息,避免无效调用。其次优化厂商推送通道受理率,标记不同类型消息,避免触发厂商的推送限制。最后优化Push点击率,增加跳过广告功能并优化权限校验。
实际优化效果:通过技术优化,弱感知链路的离线消息到达率有了明显提升,整体效果显著。
总结:本文主要关注IM消息系统中弱感知链路的优化,特别是离线消息送达率问题。在复杂的消息系统发展中,面临的问题和挑战将继续分享和探讨。
相关资料:提供了一系列相关资料链接,涵盖IM系统设计、优化和实践等内容,旨在为开发者提供全面的学习资源。
学习交流:推荐多篇移动端IM开发入门文章和开源IM框架源码,鼓励开发者深入学习和实践。文章已同步发布于“即时通讯技术圈”公众号,欢迎关注。
腾讯nft是哪个链上的
什么是NFT?
nft称为非同质化代币。
nft其实是在区块链系统中的一个应用,因为在区块链上可以记录数据,且数据因为可以达到防篡改,不可逆性,所以写在区块链上的东西是极度安全的,又因为区块链是公开的,所以所以人都可以看到。
当一个东西记录在上面,这时每个人都可以看到这个东西是属于你的,比如一个头像,一个歌曲,或是一张门票,都可以转化成区块链上的数据,这个东西就是世界上唯一的,且因为区块链的特性,任何人也不能改变他的所有权。将你打算出售给别人时,赚客系统源码也在链上记录一条,这时所有权就发生了改变,且买到的那个人可以溯源,知道自己买东西时出自哪里的。这样对买家来说,不会买到仿制品,对创作者来说可以让自己的利益最大化,没有中间商赚差价。
你可以想象一下,迈克尔乔丹晃到拉塞尔获得生涯最后一冠的那个画面,如果将这一段视频进行nft化之后,你购买了后,那么这一段视频的拥有者就是你的了,全世界篮球迷脑海中都有的一个画面,但是这个瞬间的拥有者是属于你的。这是多酷的一件事呢,或许有一天乔老爷想发个朋友圈怀念一下这个瞬间,那都需要经过你的授权才行。
在未来,任何东西都可nft化,使得对财产,知识产权的一个更好的保护。
NFT的全称是Non-fungibleToken,中文翻译为“不可同质化代币/不可替代代币”简单的说,NFT是区块链的一个条目,而区块链是类似于比特币等加密货币的去中心化数字账本技术。
因为其不可替代的特性,就意味着他可以用来代表独一无二的东西,比如博物馆里面的蒙娜丽莎原画,或者是一块土地的所有权。
目前nft市场较火爆,支付宝的鲸探,腾讯入场的幻核等等。但是狂欢之下,nft正在偏离原本的价值,目前市场炒作严重。
最后还是希望大家能够理性的看待nft,注意风险
NFT全称为Non-FungibleToken,即非同质化通证,是“具有区块链管理所有权的独特数字物品”。与传统的比特币、以太坊等数字货币不同,NFT自身的特性使它成为数字资产真实性与所有权的可靠证明。
独特性:NFT上有永久保存且不能被更改的元数据
稀缺性:开发者可以确定其相应的稀缺程度,比如数量
不可分割性:多数情况下,NFT不可被切分,只能作为整体进行购买
NFT的创造者、真伪、持有者、购买方式都被明确地记录在了区块链上,大大提升了交易的便捷性与安全性,使得数字艺术收藏成为NFT中广最为热门的领域。
腾讯上线国内首个NFT交易APP“幻核”,助力数字未来
继阿里、网易等科技巨头纷纷涉足NFT领域后,腾讯也要加速入局NFT的传闻四起。据悉,腾讯即将发布NFT交易APP“幻核”,首发的NFT项目来自知名文化访谈节目《十三邀》,有声《十三邀》数字艺术收藏NFT将限量发售枚。
从目前已公开的资料来看,该项目来自腾讯平台与内容事业群(PCG),属于其创新业务。依托于区块链技术,在数字艺术与收藏、IP周边开发等业务中均实现了NFT艺术品的发售。
在多个软件下载平台上,幻核APP的介绍为:在幻核App里,可以购买到不可篡改、不可分割的数字文化商品,用户的权益将被永久记录在区块链上。每个画面、视频或模型,都将变得真实而稀缺。极乐空间ol源码用户将不再担心储存、流通、损耗、盗窃、运输等问题。可以方便快捷地购买、欣赏和管理各类数字收藏品。
可以看出,幻核APP定位为数字艺术品收藏平台。在这里,不仅有海量的艺术资源供用户欣赏和交流,还解决了艺术收藏品长久以来存在的问题:真假难辨、运输磨损、储存空间有限等。用户在幻核app上全方位了解、收藏商品的同时,区块链技术使得商品得以数字确权及永久保存。
此前,阿里就曾在旗下支付宝的“蚂蚁链粉丝粒”小程序上限量发行了名为“敦煌飞天"和“九色鹿"的付款码皮肤。这两款NFT付款码皮肤全球限量发行共个,一经推出,就被抢购一空。这一举动不仅宣告了阿里正式进军NFT领域,也让NFT真正走进了大众视野,不再是行业内部人员小范围讨论的理念。
值得注意的是,阿里发行的这两款NFT付款码皮肤,官方给出的规则介绍里都特别强调了:NFT数字作品的版权归发行方或原作者所有,除另行取得版权拥有者书面同意外,用户不得将NFT数字作品用于任何商业用途。蚂蚁链仅为NFT数字作品在蚂蚁链上的信息存证和唯一标识提供区块链技术服务,不承担内容和版权的相关责任。支付宝给出的解释是:NFT与虚拟货币等同质化代币存在本质不同,有数字商品的实际价值作支撑,也不具备支付功能等任何货币属性。
也就是说,即使用户付费购买了NFT作品,但版权还是属于发行方,用户不能转售、商用,只能用来收藏,这和大家熟悉的区块链领域的NFT有所出入。区块链领域的NFT在用户拍得后,拥有数字作品本身的版权,可以自由交易,且有增值的可能性。
也许是因为国内监管政策的不断升级,互联网大厂推出的NFT大多都不可自由交易,仅建立在私有链或联盟链上。因此,目前市面上的NFT只能说具有NFT属性,但不等同于区块链世界的NFT。
因NFT的爆炸式出圈,也带来了诸多隐患。在阿里推出NFT付款码皮肤后,网络上立即形成了炒作之风。不平衡的供求关系使得抢到NFT付款码的用户,将其挂在闲鱼平台上售卖,希望能大赚一笔。付款码的价格从刚开始的几十元到几百元,一路炒到了万!而在支付宝首发时的售价仅需要支付宝积分+9.9元人民币。
这种疯狂的哄抬价格的行为,已经严重扰乱了正常的市场秩序。甚至让很多根本不清楚NFT究竟是什么的用户也加入了这场混战,把炒NFT当作“一夜暴富”的好机会。这场闹剧以闲鱼出手制止、下架所有NFT商品终结。但目前,在闲鱼上搜索“NFT”,腾讯的幻核“限量版十三邀黑胶唱片NFT”已经炒到了万,后续发展如何,我们拭目以待。
为什么“万物皆可NFT“成为了流行?这和NFT在海内外的火爆有很大关系。仅今年上半年,主机php源码下载NFT市场的交易额已达到亿美元,而这个数据还在屡创新高,NFT市场规模扩张速度之快实在惊人。但NFT的价值不应该和炒作的价格混为一谈。我们只有把目光放得长远一些,不断推进区块链技术的进步,才能确保NFT健康、有序地发展下去。
阿里腾讯纷纷入局,NFT究竟有何魔力一夜之间,NFT成了风口。
这个看似只会流行于极客圈的概念,如今在“圈外”异常火爆。年开始,从埃隆·马斯克到姚明,从可口可乐到迪士尼、漫威,再到LV、GUCCI、eBay、Facebook,各路人马都开始玩起NFT。
天价拍卖是NFT出圈的重要推手——数字视觉艺术家Beeple的一套作品《Everydays:TheFirstDays》,以NFT的方式在佳士得拍出了万美元的天价;推特CEO发布的那条仅由五个字组成的“世界上第一条推特”被转让拍出万美元。目前,世界上已有4位加密艺术家因其作品在NFT领域受到热捧而身价上亿。
千奇百怪的东西被铸成了NFT,例如乔布斯手写的“工作申请”、NBA赛场的高光时刻、球鞋、微信/QQ头像、虚拟石头、佛教护身符、房产、万维网源代码、诺贝尔奖论文、《时代周刊》封面等。
“万物皆可NFT”的场面里,NFT到底是什么?
NFT是非同质化通证(Non-FungibleToken),其“非同质化”意味着每一个NFT都是独一无二、不可分割的。这意味着当一件作品被铸成NFT之后,这个作品就成为了区块链上独一无二的数字资产。
技术革命、版权保护变量、投机泡沫、元宇宙序曲……不同人眼里NFT承载的意义大不相同。随着NFT在海外市场高歌猛进,国内也有越来越多的玩家拥抱这一新事物。在艺术领域兴起后,国内的互联网巨头也相继寻求入局NFT。它究竟会带来什么变化,大厂们又意欲何为?
从最实际的技术落地成果看,文娱、艺术产业是目前NFT最热情的拥抱者。
NFT则为解决版权问题提供了新思路。当一个作品被铸成NFT上链之后,这个作品便被赋予了一个无法篡改的独特编码,以确保其唯一性和真实性。这样,无论该作品被复制、传播了多少次,原作者始终都是这份作品的唯一所有者。
不仅如此,相比于传统的艺术品交易形式,当NFT流通时,其所有权的每一次转移都意味着创作者能从中获利,以交易平台SuperRare为例,进行一手交易时,艺术家获得%的收益,平台获得%;再次交易时,卖家将获得%,艺术家则获得%。而在传统交易方式中,繁体任务平台源码即便原作在多次流通中被炒至天价,艺术家也难以从中再次获利。
潜在的获利可能性吸引了投机客到来,加上已有的NFT高回报案例,不少入局者期望买下的NFT能一夜升值。
跟踪NFT市场活动的网站nonfungible.com的数据显示,今年Beeple的作品在佳士得以超过万美元的价格成交后,当周的NFT市场交易额首次达到1亿美元。尽管此后加密货币市场的走低对NFT交易额有一定影响,但是在5月初,NFT市场当周的交易额飙升一度接近2亿美元。
在热情高涨的艺术家、极客、投资者等各方的拥趸之下,海外已经逐渐形成一套成熟的NFT交易机制——创作者将NFT首次发布后,其他买家能够在NFT交易平台中不断进行二次转手和购买。
一件NFT被首次售出的过程发生在一级市场。海外市场中,火爆的NFT项目颇多,nonfungible.com的数据显示,年第二季度中,有三个NFT项目在一级市场中的销售额超过万美元,且目前市场有四个项目价值在千万以上,其中最有价值的NFT项目MeeBits价值万美元。此外,售卖NBA球星高光集锦的NBATopShot和出售像素头像的CryptoPunks等也是非常火爆的NFT项目。
发行后的流通过程即是二级市场交易。除了全球最大的数字藏品交易平台OpenSea以外,交易平台NiftyGateway、MakersPlace、Rarible等也十分活跃。多数NFT交易平台基于公链“以太坊”,但由于以太坊吞吐量低、交易费用高、通道拥挤,一些平台也会选择基于Flow、GSC等新型公链。此外,OpenSea、Rarible等大型NFT交易平台也具备一级市场的“发行”功能。
相比海外的火爆,NFT在国内的发展稍微晚了一步,但如今入局NFT的国内玩家已经越来越多。
NFT在中国的流行,也是以艺术为起点。中国加密艺术家宋婷,是年中国NFT加密艺术拍卖记录保持者。今年3月以来,音乐人高嘉丰、阿朵先后发布了自己的NFT数字音乐作品,并被高价买下。
不过动作更显眼、影响更大的是企业和机构的入局,目前,最为积极拥抱NFT的机构之一是音乐版权机构:
今年5月,阿里拍卖推出NFT数字艺术专场,随后支付宝在6月联名敦煌美术研究所、国产动漫《刺客伍六七》推出4款NFT付款码皮肤;7月,网易旗下游戏《永劫无间》IP也授权发行了NFT;腾讯则在8月上线NFT交易软件幻核APP,首期限量发售枚“有声《十三邀》数字艺术收藏品NFT”,腾讯音乐(TME)也宣布首批限量“TME数字藏品”将在QQ音乐陆续上线发售。
但是与多数海外NFT交易平台选择的公链不同,腾讯和阿里巴巴在进军NFT领域时,分别基于的是自家公司打造的至信链、蚂蚁链的联盟链。相比公链,联盟链参与方可控、且隐私保护能力较强。此外,腾讯、阿里巴巴、网易等推出的NFT均无法进行二次交易。
比如,用户在购买“有声《十三邀》数字艺术收藏品NFT”后,仅能对其观赏和收藏,平台不提供二次交易的机会,目前用户也无法在平台上线自己的NFT作品。同样的,用户对支付宝付款码皮肤也只能观赏和收藏,无法将其转赠和二次交易。
在国内NFT发展尚不成熟的背景下,大厂的谨慎显然为了不让试水演变成投机客的炒作热潮。但文娱产业和科技企业的相继入局所透露出的信号同样明显:NFT,已是不可忽视的存在。
人们对NFT的态度分为两极:支持者们认为NFT不仅会影响版权保护方式,用更长远的眼光看,NFT将使“元宇宙”概念成为现实;但反对者却觉得,NFT不过是一种投机的新方式。
两者都不无道理,NFT带来的影响本身就是多重的。
元宇宙指的是一个脱胎于现实世界,又与现实世界平行、相互影响,并且始终在线的虚拟世界。NFT则可以作为元宇宙的重要基础设施,能够映射虚拟物品,成为元宇宙中原生资产的主要载体。
今年3月,由于游戏公司Roblox在IPO招股书中写到“Metaverse(元宇宙)正在实现”,之后的这半年里,游戏行业迎来元宇宙热潮。据财联社报道,年上半年,NFT类区块链游戏融资高达亿美元,NFT区块链游戏AxieInfinity的日活跃用户数量高达万。
一些与区块链毫不相关的参与者也在入局NFT游戏,8月4日,法国时尚巨头路易威登(LouisVuitton)宣布推出自己的NFT手机游戏;7月,可口可乐发布了能在去中心化虚拟现实平台Decentraland上穿戴的NFT虚拟设备。
USDT发行商Tether的前联合创始人WilliamQuigley在7月的一场采访中表示:“NFTs作为一种独特的娱乐形式,将与**、音乐和视频游戏并存。所有不能吃的消费品都将成为NFT。
支持者把NFT作为信仰的一部分,但对NFT发展持谨慎、乃至负面态度的人也不在少数。
投机是NFT热潮中最显著的乱象。价格越炒越高的NFT,让越来越多的圈外人眼红,也不断吸引着新玩家急切入场。不少声音将NFT与前几年的“空气币滥发”进行类比,彼时,处于食物链顶端的交易所对空气币审核不严,造成空气币大量涌现,交易所因而被质疑肆意“收割”项目方与投资者。
NFT会步入空气币的后尘吗?目前还没有答案。尽管不少名人力挺NFT,但质疑NFT的声浪之大难以忽视。
Coinbase的创始人FredEhrsam早前表示:“%被制作出来的NFT,可能在未来的3到5年里失去价值,几乎一文不值。这与年代后期的早期互联网公司的情况是一样的。”而早前作品被拍出高价的艺术家Beeple,也在接受CNN《FirstMove》时表示NFT以万美元的价格出售是“疯狂”的。
莱特币创始人CharlieLee也认为仅有少数的NFT具有极高价值,例如毕加索这样的知名艺术家所创作的作品,但是,“由于创建NFT的成本几乎为零,假如艺术家为了获利而蜂拥进入这一领域,那么市场就会被这种狂热所淹没,供应将压倒需求,价格最终将崩溃。”
监管是NFT可能面临的另一压力。国内大厂推行NFT时的谨慎态度反映了其对合规的重视。阿里巴巴、腾讯一再强调其在NFT领域布局的范围和界限。
针对外界对NFT是否相当于发行代币的误解,蚂蚁链曾明确表示:NFT不是虚拟币。“NFT是解决数字艺术品确权的一种有效和可靠的技术手段,具有唯一性和不可分拆性,不具有等价交换物的特征,和比特币等虚拟币有着本质区别。”
在腾讯研究院举办的线上圆桌论坛上,腾讯云区块链产品总监秦青也表示,NFT在联盟链上发行可以做到真正地去掉货币的属性,“我们推断联盟链发行的NFT是可以合规的发出来的。”
NFT是复杂的,其虽是更好的版权保护方式,却也存在潜在的炒作属性,在国内发展的道路中面临监管也不可避免。如何能够让NFT的发展扬长避短,所有中国参与者都需要探索NFT合适的发展路径。
腾讯司庆发放NFT藏品,它到底有什么作用?月日,腾讯公司为其员工发放了周年纪念版NFT。根据界面新闻了解,腾讯官方将其称为“数字藏品”,由腾讯旗下NFT交易平台幻核团队设计发行,腾讯旗下联盟链“至信链”提供链上存证。
根据显示,该系列NFT以腾讯QQ的企鹅形象为基础,进行了IP衍化,每一个形象都各不相同,每只QQ企鹅共有6个自定义部分,每个部位随机展现不同元素并组合成独有形象,其中更有枚彩蛋款特殊造型,共发行枚。
据介绍,本次数字藏品发放对象为:截至年月3日入职的,管理主体为腾讯集团的正式员工、毕业生、实习生等。这批仅对内的企鹅NFT一经发放,就在各大社群中广泛传播,并成为许多腾讯员工人生中的第一枚NFT。
NFT是年的新热点之一,于区块链领域诞生,受益于全球最大区块链网络以太坊上的“ERC”标准,它将区块链技术的特性赋予数字商品、数字资产、数字艺术品中,让这些虚拟物品都拥有不可篡改的唯一凭证,从而为其创造来自数学上的稀缺性。当前,该技术也被认为是“元宇宙”的基础设施之一。
目前,NFT在国内多作为作为一种文化IP的衍生品,其本身具有一定“迷因”特色,很容易在社交上形成广泛传播,而且基于中国特色的文化IP,对新兴的“Z世代”等人群有着不一样的“潮流”意味,与国外的链上交易火热形成了不同流派。
以目前全球最火热的NFT系列‘’CryptoPunks(加密朋克)”为例,由LarvaLabs于年6月日推出,总数为1万枚,是由x、8bit样式的不规则像素组成的头像集合。每个头像都有自己随机生成的独特外观和特征。在1万个CryptoPunks头像中,其面貌、发色、性别、头饰、种族都成为可定义的部分,也成为了其稀缺性的来源。且其中有一些显得极为特殊,例如有9个外星人头像(现价值超数百万美元),个猿人头像,个僵尸系列头像,其余是个女性头像和个男性头像。
对比后不难发现,腾讯司庆纪念款NFT同样具有这样的核心特点,总量限定、可定义模块、有稀缺款。据腾讯内部人士向界面新闻介绍,其中一款彩蛋款“NFT”是财神爷形象的QQ企鹅。
而从技术角度分析,腾讯司庆系列NFT枚的庞大总量且不相同的形象设计使用了目前最先锋的“生成艺术”概念,即画面设计由计算机AI与设计团队联合完成,而不是传统的仅由设计师全程操刀。
年5月日,在纽约举行的佳士得世纪晚间拍卖中出现了9个由LarvaLabs提供的CryptoPunksNFT。这意味着NFT头像玩法已经得到顶级拍卖行的价值认可。而另一个全球热捧的“丧猴”系列NFT也成为了NBA球星斯蒂芬·库里的最爱,成为了其社交媒体的头像。
在文化领域,就NFT技术本身,包括村上隆、蔡国强等中外的艺术家都已将其融入其创作中。香港**导演王家卫在月日于苏富比举行了一场艺术拍卖会,其**NFT作品《花样年华——刹那》以.4万港元价格成交,创下王家卫个人作品与亚洲**NFT作品拍卖价格新高。
不难发现,以NFT为代表之一的区块链技术不仅在金融资产方面具有独特价值,在文化传播方面也有着巨大的传播潜力。
幻核上的藏品可交易么NFT存在于腾讯自己主导的联盟链到信链中。虽然购买的用户拥有NFT的使用权和所有权,但目前魔芯APP不支持二手交易、转让和赠送功能。换句话说,不允许交易,自然是为了规避当前的政策风险。
魔芯是腾讯公司出品的NFT藏品免费交易和购买软件。该软件是一个与数字收藏品进行交易的特殊平台,用户可以在这里看到各种数字商品的信息。在软件中购买的数字商品是拥挤的、有效的、不可改变的、不可分割的,用户购买后的所有权将被牢牢锁定并记录在商品上。用户不需要担心会不会有商品的所有权,因为它永远属于你,用户可以在里面自由大胆的出价。
字节跳动nft平台名字年月1日字节跳动旗下的TikTok宣布推出首个NFT系列——TikTokTopMoments
国内目前比较火的NFT交易平台有阿里巴巴旗下的蚂蚁链,腾讯旗下的至信链,还有NFT中国。蚂蚁链和至信链都属于联盟链,交易方式链上售卖,支付方式与链上分离。
如何用 Flutter 实现混合开发?闲鱼公开源代码实例
阿里妹导读:具有一定规模的 App 通常有一套成熟通用的基础库,尤其是阿里系 App,一般需要依赖很多体系内的基础库。那么使用 Flutter 重新从头开发 App 的成本和风险都较高。所以在 Native App 进行渐进式迁移是 Flutter 技术在现有 Native App 进行应用的稳健型方式。
今天我们来看看,闲鱼团队如何在这个实践过程中沉淀出一套独具特色的混合技术方案。
现状及思考
闲鱼目前采用的混合方案是共享同一个引擎的方案。这个方案基于这样一个事实:任何时候我们最多只能看到一个页面,当然有些特定的场景你可以看到多个 ViewController ,但是这些特殊场景我们这里不讨论。
我们可以这样简单去理解这个方案:我们把共享的 Flutter View 当成一个画布,然后用一个 Native 的容器作为逻辑的页面。每次在打开一个容器的时候我们通过通信机制通知 Flutter View 绘制成当前的逻辑页面,然后将 Flutter View 放到当前容器里面。
这个方案无法支持同时存在多个平级逻辑页面的情况,因为你在页面切换的时候必须从栈顶去操作,无法再保持状态的同时进行平级切换。举个例子:有两个页面A,B,当前B在栈顶。切换到A需要把B从栈顶 Pop 出去,此时B的状态丢失,如果想切回B,我们只能重新打开B之前页面的状态无法维持住。
如在 pop 的过程当中,可能会把 Flutter 官方的 Dialog 进行误杀。而且基于栈的操作我们依赖对 Flutter 框架的一个属性修改,这让这个方案具有了侵入性的特点。
新一代混合技术方案 FlutterBoost
重构计划
在闲鱼推进 Flutter 化过程当中,更加复杂的页面场景逐渐暴露了老方案的局限性和一些问题。所以我们启动了代号 FlutterBoost(向C++ Boost库致敬)的新混合技术方案。这次新的混合方案我们的主要目标有:
跟老方案类似,新的方案还是采用共享引擎的模式实现。主要思路是由 Native 容器 Container 通过消息驱动 Flutter 页面容器 Container,从而达到 Native Container与 Flutter Container 的同步目的。我们希望做到 Flutter 渲染的内容是由 Naitve 容器去驱动的。
简单的理解,我们想做到把 Flutter 容器做成浏览器的感觉。填写一个页面地址,然后由容器去管理页面的绘制。在 Native 侧我们只需要关心如果初始化容器,然后设置容器对应的页面标志即可。
主要概念
Native 层概念
Dart 层概念
关于页面的理解
在 Native 和 Flutter 表示页面的对象和概念是不一致的。在 Native,我们对于页面的概念一般是 ViewController,Activity。而对于 Flutter 我们对于页面的概念是 Widget。我们希望可统一页面的概念,或者说弱化抽象掉 Flutter 本身的 Widget 对应的页面概念。换句话说,当一个 Native 的页面容器存在的时候, FlutteBoost 保证一定会有一个 Widget 作为容器的内容。所以我们在理解和进行路由操作的时候都应该以 Native 的容器为准, Flutter Widget 依赖于 Native 页面容器的状态。
那么在 FlutterBoost 的概念里说到页面的时候,我们指的是 Native 容器和它所附属的 Widget。所有页面路由操作,打开或者关闭页面,实际上都是对 Native 页面容器的直接操作。无论路由请求来自何方,最终都会转发给 Native 去实现路由操作。这也是接入 FlutterBoost 的时候需要实现 Platform 协议的原因。
另一方面,我们无法控制业务代码通过 Flutter 本身的 Navigator 去 push 新的 Widget。对于业务不通过 FlutterBoost 而直接使用 Navigator 操作 Widget 的情况,包括 Dialog 这种非全屏 Widget,我们建议是业务自己负责管理其状态。这种类型 Widget 不属于 FlutterBoost 所定义的页面概念。
理解这里的页面概念,对于理解和使用 FlutterBoost 至关重要。
与老方案主要差别
前面我们提到老方案在 Dart 层维护单个 Navigator 栈结构用于 Widget 的切换。而新的方案则是在 Dart 侧引入了 Container 的概念,不再用栈的结构去维护现有的页面,而是通过扁平化 key-value 映射的形式去维护当前所有的页面,每个页面拥有一个唯一的 id。这种结构很自然的支持了页面的查找和切换,不再受制于栈顶操作的问题,之前的一些由于 pop 导致的问题迎刃而解。也不需要依赖修改 Flutter 源码的形式去进行页面栈操作,去掉了实现的侵入性。
实际上我们引入的 Container 就是 Navigator 的,也就是说一个 Native 的容器对应了一个 Navigator。那这是如何做到的呢?
多 Navigator 的实现
Flutter 在底层提供了让你自定义 Navigator 的接口,我们自己实现了一个管理多个 Navigator 的对象。当前最多只会有一个可见的 Flutter Navigator,这个 Navigator 所包含的页面也就是我们当前可见容器所对应的页面。
Native 容器与 Flutter 容器(Navigator)是一一对应的,生命周期也是同步的。当一个 Native 容器被创建的时候,Flutter 的一个容器也被创建,它们通过相同的 id 关联起来。当 Native 的容器被销毁的时候,Flutter 的容器也被销毁。Flutter 容器的状态是跟随 Native 容器,这也就是我们说的 Native 驱动。由 Manager 统一管理切换当前在屏幕上展示的容器。
我们用一个简单的例子描述一个新页面创建的过程:
这就是一个新页面创建的主要逻辑,销毁和进入后台等操作也类似有 Native 容器事件去进行驱动。
官方提出的混合方案
基本原理
Flutter 技术链主要由 C++ 实现的 Flutter Engine 和 Dart 实现的 Framework 组成(其配套的编译和构建工具我们这里不参与讨论)。Flutter Engine 负责线程管理,Dart VM 状态管理和 Dart 代码加载等工作。而 Dart 代码所实现的 Framework 则是业务接触到的主要 API,诸如 Widget 等概念就是在 Dart 层面 Framework 内容。
一个进程里面最多只会初始化一个 Dart VM。然而一个进程可以有多个 Flutter Engine,多个 Engine 实例共享同一个 Dart VM。
我们来看具体实现,在 iOS 上面每初始化一个 FlutterViewController 就会有一个引擎随之初始化,也就意味着会有新的线程(理论上线程可以复用)去跑 Dart 代码。Android 类似的 Activity 也会有类似的效果。如果你启动多个引擎实例,注意此时Dart VM 依然是共享的,只是不同 Engine 实例加载的代码跑在各自独立的 Isolate。
官方建议
引擎深度共享
在混合方案方面,我们跟 Google 讨论了可能的一些方案。Flutter 官方给出的建议是从长期来看,我们应该支持在同一个引擎支持多窗口绘制的能力,至少在逻辑上做到 FlutterViewController 是共享同一个引擎的资源的。换句话说,我们希望所有绘制窗口共享同一个主 Isolate。
但官方给出的长期建议目前来说没有很好的支持。
多引擎模式
我们在混合方案中解决的主要问题是如何去处理交替出现的 Flutter 和 Native 页面。Google 工程师给出了一个 Keep It Simple 的方案:对于连续的 Flutter 页面(Widget)只需要在当前 FlutterViewController 打开即可,对于间隔的 Flutter 页面我们初始化新的引擎。
例如,我们进行下面一组导航操作:
我们只需要在 Flutter Page1 和 Flutter Page3 创建不同的 Flutter 实例即可。
这个方案的好处就是简单易懂,逻辑清晰,但是也有潜在的问题。如果一个 Native 页面一个 Flutter 页面一直交替进行的话,Flutter Engine 的数量会线性增加,而 Flutter Engine 本身是一个比较重的对象。
多引擎模式的问题
因此,综合多方面考虑,我们没有采用多引擎混合方案。
总结
目前 FlutterBoost 已经在生产环境支撑着在闲鱼客户端中所有的基于 Flutter 开发业务,为更加负复杂的混合场景提供了支持,稳定为亿级用户提供服务。
我们在项目启动之初就希望 FlutterBoost 能够解决 Native App 混合模式接入 Flutter 这个通用问题。所以我们把它做成了一个可复用的 Flutter 插件,希望吸引更多感兴趣的朋友参与到 Flutter 社区的建设。在有限篇幅中,我们分享了闲鱼在 Flutter 混合技术方案中积累的经验和代码。欢迎兴趣的同学能够积极与我们一起交流学习。
扩展补充
在两个 Flutter 页面进行切换的时候,因为我们只有一个 Flutter View 所以需要对上一个页面进行截图保存,如果 Flutter 页面多截图会占用大量内存。这里我们采用文件内存二级缓存策略,在内存中最多只保存 2-3 个截图,其余的写入文件按需加载。这样我们可以在保证用户体验的同时在内存方面也保持一个较为稳定的水平。
页面渲染性能方面,Flutter 的 AOT 优势展露无遗。在页面快速切换的时候,Flutter 能够很灵敏的响应页面的切换,在逻辑上创造出一种 Flutter 多个页面的感觉。
项目开始的时候我们基于闲鱼目前使用的 Flutter 版本进行开发,而后进行了 Release 1.0 兼容升级测试目前没有发现问题。
只要是集成了 Flutter 的项目都可以用官方依赖的方式非常方便的以插件形式引入 FlutterBoost,只需要对工程进行少量代码接入即可完成接入。详细接入文档,请参阅 GitHub 主页官方项目文档。