游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

有赞Flutter混编方案

  背景
  目前准备试水Flutter,但是多数native开发是不了解Flutter,因此需要设计一种比较舒服的集成方式。混编方案方案考量如果直接采用Flutter工程结构来作为日常开发,那这部分Native开发也需要配置Flutter环境,相当程度的了解Flutter一些技术,成本比较大。同时如果工程耦合,对于开发过程也是很难受的
  基于以上两点思考,针对AndroidiOS有如下方案:Android
  先看下官方的集成方式:setting。gradlesetBinding(newBinding(〔gradle:this〕))evaluate(newFile(。。managementcenter。androidincludeflutter。groovy))123456build。gradledependencies{implementationproject(:flutter)。。。。。。。。。。。}12345
  这种方式使得工程强耦合,虽然便于开发调试,但是违背了第一点,大多数native同学都需要配置Flutter环境,成本很大。iOS官方iOS混编方案简介
  传送门在native项目Podfile中通过evalbinding特性注入podhelper。rb脚本,在podinstallupdate时执行此脚本,脚本主要处理:Pod本地依赖Flutter引擎(Flutter。framework)与Flutter插件注册表(FlutterPluginRegistrant)Flutter插件通过flutterpackagesget指令安装后生成的。flutterplugins文件解析,然后Pod本地依赖所有的插件在podinstall执行完的钩子postinstall中,获取当前podtarget工程对象,导入Generated。xcconfig配置,其中都为环境变量的配置,主要为后续的xcodebackend。sh脚本执行做准备在构建阶段BuildPhases中注入构建是需要执行的xcodebackend。sh脚本,脚本主要完成Flutter产物的构建并将其添加到对应的native工程中去,后续会进一步介绍此脚本优点无缝开发,配置好后就可以只在Flutter工程内进行业务开发,无缝同步到native工程中不需要单独拆分组件,免去管理组件的版本及发布成本缺点非常耦合,需要修改原有native工程配置,需要添加特定脚本去编译Flutter需要修改原有pod的xcconfig配置所有团队开发成员都必须要配置Flutter开发环境才能编译成功小结
  基于以上思考,同时考虑到某个Flutter业务模块可能会引入到不同的App中,同时考虑到某个业务实现方式方面的解耦(某个业务可能用native,flutter,weex开发),有以下方案(中间产物库每个Flutter业务模块都是独立的):
  Android:
  iOS:
  Flutter产物结构Android
  iOS
  关于编译模式了解更多可参考查看Flutter的编译模式。Flutter产物收集Android
  在Android端集成Flutter较为简单,只需要获取到上文所讲的Flutter产物即aar文件。但是由于插件文件散落每次获取比较麻烦所以目前简单用脚本收集。
  脚本收集主要是依靠项目里。flutterplugins文件,该文件会记录flutter项目中引用的插件名以及本地路径等,因此可以通过该路径抓取插件的aar文件。fromshutilimportcopyfileimportosimportrequests抓取文件类型BuildReleaseTrueaarTyperelease。aarifBuildReleaseelsedebug。aarpluginFilePath。。。flutterplugins当前项目的flutter。aarcurrentFlutterPath。。。androidFlutterbuildoutputsaar输出地址outputFilePathos。path。abspath(flutteraar。py)。replace(flutteraar。py,aars)endPathandroidbuildoutputsaardefcollectaar(plugins):allcollectionsuccessTrueifos。path。exists(outputFilePath):print(copyaarto:outputFilePath)else:print(targetpath:outputFilePathnotexist)os。makedirs(outputFilePath)print(createtargetpath:outputFilePath)forkey,valueinplugins。items():aarpathvaluekeyaarTypetry:copyfile(aarpath,outputFilePathkeyaarType)print(copyflutteraarsuccessatpath:aarpath)exceptIOError:allcollectionsuccessFalseprint(copyflutteraarerroratpath:aarpath)passfileobjectopen(pluginFilePath,r)try:pluginmap{}forlineinfileobject:arrayline。split()pluginmap〔array〔0〕〕array〔1〕。replace(,)endPathpluginmap〔flutter〕currentFlutterPathcollectaar(pluginmap)finally:fileobject。close()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  目前该python脚本只抓取Release的aar文件,如果需要获取debug的可以手动修改BuildReleaseFalse1
  执行抓取脚本。flutteraar。sh!usrbinenvbashcd。。cd。androidechostartclean。gradlewcleanechostartassembleRelease。gradlewassembleReleasecd。。cdandroidbuildechocleanoldaarfilermrfaarsechostartcopyaarfile只抓取releasepythonflutteraar。pyechocopyaarfilefinish12345678910111213141516171819
  脚本执行完Flutter产物aar文件统一生成在根目录下androidbuild文件夹中。
  iOS
  通过查看Flutter编译脚本xcodebackend。sh和测试单独引入编译产物,发现其实只要拥有Flutter的编译产物,宿主项目就可以接入Flutter的功能。脚本简单分析engineFlutter。frameworkFlutter核心库拷贝Flutter。frameworkif〔〔e{projectpath}。ios〕〕;thenRunCommandrmrf{deriveddir}enginemkdir{deriveddir}engineRunCommandcpr{flutterpodspec}{deriveddir}engineRunCommandcpr{flutterframework}{deriveddir}engineRunCommandfind{deriveddir}engineFlutter。frameworktypefexecchmodaw{};elseRunCommandrmrf{deriveddir}Flutter。frameworkRunCommandcpr{flutterframework}{deriveddir}RunCommandfind{deriveddir}Flutter。frameworktypefexecchmodaw{};fi1234567891011debug模式下Dart业务代码编译(JIT)App。frameworkRunCommandeval(echostaticconstintMoo88;xcrunclangxc{archflags}dynamiclibXlinkerrpathXlinkerexecutablepathFrameworksXlinkerrpathXlinkerloaderpathFrameworksinstallnamerpathApp。frameworkAppo{deriveddir}App。frameworkApp)1234567非debug模式下Dart业务代码编译(AOT)App。frameworkRunCommand{FLUTTERROOT}binfluttersuppressanalytics{verboseflag}buildaotoutputdir{builddir}aottargetplatformiostarget{targetpath}{buildmode}iosarch{archs}{localengineflag}{trackwidgetcreationflag}12345678910资源文件等打包flutterassetsStreamOutputAssemblingFlutterresources。。。RunCommand{FLUTTERROOT}binfluttersuppressanalytics{verboseflag}buildbundletargetplatformiostarget{targetpath}{buildmode}depfile{builddir}snapshotblob。bin。dassetdir{deriveddir}App。frameworkflutterassets{precompilationflag}{localengineflag}{trackwidgetcreationflag}123456789101112方案分析设计
  插件统一编译成。a库,添加对应头文件App。framework及engineFlutter。framework添加目前初期demo将上述生成的产物统一放入到私有库当中,然后native宿主工程pod依赖此库,只需要在使用Flutter代码的地方import对应的头文件即可正常使用脚本编写echo清理flutter历史编译fluttercleanecho重新生成plugin索引flutterpackagesgetecho生成App。framework和flutterassetsflutterbuildiosdebugecho获取所有plugin并找到头文件whilereadrlinedoif〔〔!line〕〕;thenarray({line})pluginname{array〔0〕}cd。iosPodsecho生成lib{pluginname}。a。。。usrbinenvxcrunxcodebuildbuildconfigurationReleaseARCHSarm64armv7target{pluginname}BUILDDIR。。。。buildiossdkiphoneosquietusrbinenvxcrunxcodebuildbuildconfigurationDebugARCHSx8664target{pluginname}BUILDDIR。。。。buildiossdkiphonesimulatorquietecho合并lib{pluginname}。a。。。lipocreate。。。。buildiosDebugiphonesimulator{pluginname}lib{pluginname}。a。。。。buildiosReleaseiphoneos{pluginname}lib{pluginname}。ao。。。。productlib{pluginname}。aecho复制头文件classes{array〔1〕}iosClassesforheaderinfindclassesname。h;docpfheader。。。。productdoneelseecho读取文件出错fidone。flutterpluginsecho生成注册入口的二进制库文件forregenternameinFlutterPluginRegistrantdoecho生成libFlutterPluginRegistrant。a。。。usrbinenvxcrunxcodebuildbuildconfigurationReleaseARCHSarm64armv7targetFlutterPluginRegistrantBUILDDIR。。。。buildiossdkiphoneosusrbinenvxcrunxcodebuildbuildconfigurationDebugARCHSx8664targetFlutterPluginRegistrantBUILDDIR。。。。buildiossdkiphonesimulatorecho合并libFlutterPluginRegistrant。a。。。lipocreate。。。。buildiosDebugiphonesimulatorFlutterPluginRegistrantlibFlutterPluginRegistrant。a。。。。buildiosReleaseiphoneosFlutterPluginRegistrantlibFlutterPluginRegistrant。ao。。。。productlibFlutterPluginRegistrant。aecho复制头文件classes。。FlutterFlutterPluginRegistrantClassesforheaderinfindclassesname。h;docpfheader。。。。productdonedone123456789101112131415161718192021222324252627282930313233343536373839404142434445后续规划脚本优化,添加自动pod库检测及上传App。frameworkFlutter。framework体积太大,放到git仓库不太友好,考虑后续上传到CDN,然后在pod安装的时候预先执行脚本把两个产物拉下来Flutter产物上传Android
  上面产物搜集完成后,需要上传maven仓库,方便集成以及版本控制applyplugin:youzan。maven。uploadzanMavenUpload{version0。0。2childGroupflutterapub}uploadItems{fluttertoast{targetFilefile(。。。。androidbuildaarsfluttertoastrelease。aar)}imagepicker{targetFilefile(。。。。androidbuildaarsimagepickerrelease。aar)}。。。。。。。。。。。。}123456789101112131415161718
  因此引用链如下:Android
  iOS
  总结
  以上比较全面的描述了有赞的Flutter混编方案,目前有赞已经在内部使用的App上使用Flutter开发了一些页面作为试点。后续会考虑在线上App试点,目前正在进行Flutter基础库的搭建,之后会专门有文章分享。

空调移机之收氟,排空,加氟一,空调收氟是移机。拆机的必要步骤,很多人以为收氟就是简单的锁紧高低压阀即可,其实这样理解是错误的,直接锁紧高低压阀管道内部氟没有收回主机内就会造成泄露从而导致氟的缺失,这样一……手机慢速度快门平移跟拍设定高清画质8月15日拍摄16秒平移跟拍后拍摄高清画质平移跟拍照片分享如附图,感觉是否清晰一些。f:1。8,ISO1237,S:117s,13。8MBf:1。8,ISO1293……荣威i57月卖出4369台,标配1。5L自吸引擎能否满足家用作为一款厂商指导售价6。798。99万的入门级家用轿车,荣威i5算是辨识度不差的高颜值车型。虽然销量上卖不过同为国产车的吉利帝豪以及长安逸动,但从7月份公布的销量数据来看,还是……那些外包干了三年以上的,废了最近也有不少读者来问我:我拿到了两个offer,一个小企业XX职位,一个某大厂的外包岗位,怎么选择啊?我一般都是建议不要去外包,不是我对外包有多大仇恨,也不是有意甩锅外包……激情在深圳湾的日出里沉醉每日面对深圳湾日出,就象给心灵充电,蓄存光阴里阳光与快乐。随着环境与经济状况的焕然一新,会看淡了很多人很多事,却再也不想随便捅破,包括讨厌的人和事,再也没必要去交往,不值得去认……淘宝70的衣服拼多多39,发退货地址相同,小姐姐曝光电商秘密拼多多39元的衣服,淘宝卖70!最近,有位小姐姐爆料,她分别在淘宝和拼多多买了件同款衣服,到货后却发现衣服的质量、气味以及上身效果都一模一样,只是淘宝这件买成70元,拼多多39……9。28成都海信携三色激光新品亮相2021未来全宅巡回论坛(9月28日,2021未来全宅巡回论坛参展商海信携三色激光新品亮相2021未来全宅巡回论坛(成都站)。9月28日,2021未来全宅巡回论坛(成都站)将于成都总府皇冠假日酒店……BOSE无线耳塞代言人华晨宇怎么了?歌手不做,代言广告赚钱10月16日,华晨宇将空降Bose天猫小黑盒直播间!今天BOSE官宣了华晨宇为品牌代言人。一个是歌声直抵人心的live型唱将,另外一个致力于用硬核科技带你到原音现场。话说你喜欢……爱暖冬日,传递温情郑州市经济技术开发区宣传部(文明办)组织慰问环卫工人志愿服务活动中国公益在线郑州讯(公益记者张文孟)寒潮来袭,晨起的人开始瑟瑟发抖。但有一批人,早早开始为了整个城市的面貌……欧尚X5青春版热血上市,指导价9。09万元限量996辆无热血,不青春。8月2日,高颜值潮流SUV欧尚X5青春版以微电影的形式、以潮流新品的姿态活力上市,新车指导售价9。09万元,并限量发售996辆。另外,欧尚X5青春版还推出……3千元显卡的不会选?看了这篇你就知道了很多人在配电脑的时候都会遇到这样的问题,XXX元的显卡选什么?是AMD的XXX?还是NVIDIA的XXX?小歪我也不例外,我一般很简单的回答,同性能选N卡,同价位选A卡,毕竟N……知产晨报戴森申请可爬楼梯清洁机器人专利,字节申请pixsou9月06日知识产权快讯1hr专利戴森申请可爬楼梯清洁机器人专利,还有机械手9月5日消息,根据外媒TheVerge报道,家电厂商戴森今日在英国申请的一项发明专利……
新版倚天屠龙记开播陈剑演绎刚直血性男儿莫声谷星关系3月1日讯由导演蒋家骏执导,曾舜晞、陈钰琪、祝绪丹主演,陈剑出演的新版《倚天屠龙记》已正式开播。其中,演员陈剑饰演的是武当七侠之一莫声谷。陈剑挑战经典角色莫声谷演绎……为什么现在很多程序员都喜欢用Mac作为主力开发了?最主要原因是,现在年轻一代,不管有没有钱但是一定得享受,用Mac主要部分还是装逼。要说好用windows也很好用,别给我说什么unix系统,链接服务器方便,终端好用和linux……甜小姐与冷先生圆满杀青王子文金瀚双箭头职场追爱近日,由阿里巴巴影业集团出品、剧有想法承制,水源影业、畅元世纪联合承制的都市情感女性题材剧集《甜小姐与冷先生》正式官宣杀青。本剧由国家一级导演张峰执导,王子文、金瀚领衔主演,徐……阿里突然宣布捐款1000亿元,是资本的良心发现,还是有利可图企业分为国企以及民营企业,在发展前景与实力方面,国企更强一些。不仅有国家政策的扶持,而且经营的规模很大,经营的业务基本上都是关乎着国民经济的命脉。但是有些民营企业的发展非……详解Java8的Stream数据流,更加优雅的解决方案前言:目前Java8新特性在很多公司已经流行起来了,除非很老的公司还在用Java7,所以学习Java8是非常有必要的。Stream是Java8中处理集合的关键抽象概念,它……全面二字绝非营销词汇,iQOO8Pro上手实测有感在众多国产品牌机型中,iQOO可以说是一匹当之无愧的黑马,年轻富有冲劲,它的出现大大颠覆了传统手机行业。在今年下半年,它的数字旗舰系列如期而至,其中的大杯产品iQOO8Pro更……幸福到万家首发预告片赵丽颖罗晋演绎励志人生电视剧《幸福到万家》首次发布预告片,跌宕起伏的励志故事可见一斑。该剧由赵丽颖、刘威、唐曾领衔主演,罗晋特别出演,同时还有王志飞、冯雷、宋佳伦、曹征、张喜前、迟蓬、陈炜、钱洁、张……PHP依然是世界上最好的编程语言来源:程序员书库(ID:CodingBook)猿妹整编世界上最好的语言是什么?PHP。根据W3Techs的报告显示了自2010年1月以来服务器端编程语言使用的历史趋……程小蒙鹤唳华亭与罗晋结连理张念之端庄温婉获称赞星关系12月6日讯由优酷全网独播,杨文军执导,罗晋、李一桐、黄志忠、张志坚、苗圃、金瀚、程小蒙等主演的《鹤唳华亭》于昨日迎来新的剧情。程小蒙饰演的张念之终于成为太子妃,与太子萧……卖房子的人亮相耀客发布会孙俪罗晋腾讯红毯调侃互逗星关系6月12日讯由耀客传媒、企鹅影视出品的现实主义都市话题剧《卖房子的人》于6月11日分别亮相耀客发布会和2019腾讯视频年度发布会活动,该剧由六六、九枚玉编剧,安建执导,王……你们觉得哪个导航最好?为什么?我山西人,14年买的车,然后每年五一,十一,自驾游,偶尔周末也自驾游,我用过搜狗,百度,高德三家公司的地图,说说我对导航的看法吧!刚开始听别人说搜狗不错,用它跑了一次安徽,结果……湖南省首届标准知识竞赛线上开赛趣味十足还有华为手机拿来源:红网时刻新闻红网时刻9月18日讯(记者刘璇)标准是人类文明进步的成果,是经济社会活动的技术依据,是世界互联互通的桥梁纽带。今天,记者从湖南省市场监督管理局标准化处获……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网