admin 發表於 2019-8-1 13:53:46

Flutter瘦身大作战

布景

闲鱼技能团队于2018年上半年率先引入了Flutter技能实现客户端开辟,到今朝为止乐成革新并上线了繁杂的商品详情和公布营业。跟着革新营业的增多,安装包体积急剧上增。安装包体积决议了用户期待下载的时候和可能会花费的流量,若何节制安装包体积,减小flutter产品的巨细成为当务之急。本文从闲鱼客户端项目实践角度给出了一些通用的包巨细检测和优化方案,但愿为对Flutter感乐趣的团队供给参考。

闲鱼客户端采纳的Flutter和Native夹杂开辟的模式,下面咱们以ios端为例阐发项目中flutter产品的巨细(ipa包瘦身需求更加火急)。

ios工程对Flutter有以下依靠:

Flutter.framework : Flutter库和引擎App.framework: dart营业源码相干文件 Flutter Plugin:编译出来的各类plugin的frameworkflutter_assets:Flutter依靠的静态资本,如字体,图片等

第一次引入flutter版本革新详情页后,ipa包巨细增长近20M,此中包含flutter引擎代码+被革新营业代码,继续公布页flutter革新后,ipa增长4M+。进一步阐发解压ipa文件后发明Flutter.framework不乱连结在20M+的巨细, 增长新的flutter营业——公布页以后,App.framework增幅近10M!

Flutter.framework是Flutter库和引擎的代码,咱们能做的优化空间有限,先把方针放在dart营业相干的文件App.framework上。

Flutter产品巨细阐发

履行以下号令编译出一个release模式下的App.framework,并利用

print-snapshot-sizes

参数打印出产品详细巨细

成果以下:

Instructions:代表AOT编译后天生的二进制代码巨细

ReadOnlyData:代表天生二进制代码的元数据(比方PcDescriptor, StackMap,CodeSourceMap等)和字符串巨细

VMIsolate/Isolate:代表剩下的工具的巨细总和(比方代码中界说的常量和虚拟机特定元数据)

详细到营业层,想要阐发各个营业模块所占用的巨细该怎样办呢?

履行以下号令编译出一个arm64架构的App.framework,并将它的包构成布局放到指定目次build/aot.json文件中flutter --suppress-analytics build aot --output-dir=build/aot --target-platform=ios --target=lib/main.dart --release --ios-arch=arm64 --extra-gen-snapshot-options=--dwarf_stack_traces,--print-snapshot-sizes,--print_instructions_sizes_to=build/aot.json利用dart号令将上一步天生的aot.json文件转化成布局可视化的网页

rn_binary_size_analysis.dart是dart供给的一个阐发东西,在flutter引擎源码中路径以下:

打开天生文件夹中的index.html便可阐发详细营业所占用的巨细,右上角的Large Symbols和Large Files按钮可以直接定位体积占比从大到小的法子/文件。

举个例子,上面的阐发显示

PItemInfoInternal.fromJson

法子占用了大量体积,跟踪发明这个法子重要的操作是将Map数据转化成工具

由此咱们可以揣度这类类型转换的操作会致使编译天生一些体积很大的代码。

优化办法

削减显示类型转换操作

依照上述阐发发明显示的类型转换 as String/Bool/Int 这种操作会致使App.framework体积显著增长,主如果它会增长类型查抄和抛出异样的处置逻辑:

经由过程提取静态公用法子的方法可以乐成削减400k+体积。

经由过程编译参数 --dwarf_stack_trace和--obfuscate减小天生代码的体积dwarf_stack_trace暗示在天生的动态库文件中,不利用仓库跟踪符号

obfuscate暗示混同,经由过程削减变量名/法子名的方法减小代码体积

//编译release包并打印sizeflutter build aot --release --extra-gen-snapshot-options=--print-snapshot-sizes//--dwarf_stack_traces, --削减6.2%巨细flutter build aot --release --extra-gen-snapshot-options=--dwarf_stack_traces,--print-snapshot-sizes//--obsfuscation, --削减2.5%巨细flutter build aot --release --extra-gen-snapshot-options=--dwarf_stack_trac絲酷秀,e耳鳴治療, s,--print-snapshot-sizes,--obfuscate//总巨细削减8.7%

经由过程点窜ios打包剧本xcode_backend.sh,删除dSYM符号表信息文件,App.framework乐成减小20%的巨细。dSYM 是保留 16 进制函数地点映照信息的中转文件,包括咱们调试的 symbols,用来阐发 crash report 文件,解析出准确的毛病函数信息。

利用xcrun号令将dSYM从framework中剥离出来,可以大大减小App.framework的体积。

削减flutter和native资本反复酿成的体积增大

操纵桥接的方法,flutter直接利用Platform端资本文件,防止由于资本文件反复致使的包巨细增长问题。

重要方法是经由过程BasicMessageChannel在Flutter和Platform端通报信息。Flutter端将资本名AssetName通报给Platform端,Platform端接管到AssetName后,按照name定位到资本文件,并将该文件以二进制数据格局,经由过程BasicMessageChannel通报回Flutter端。

总结

引入Flutter带来的安装包体积问题会给不少技能团队带来困扰。经由过程以上办法,Flutter产品App.framework的巨细削减30%+,闲鱼技能团队后续也会斟酌采纳下载并懒加载等方法削减资本占用的体积;继续代码天生中的各类比拟,排查防止较大产品的写法,同时也会和Google一块儿进一步寻觅优化空间。
頁: [1]
查看完整版本: Flutter瘦身大作战