闲鱼包大小随着用户的增多和业务的持续迭代不断增长。过去的半年时间,Android端包大小涨了43%,iOS端也涨了26%,若再不加管控,按照目前的增长速度iOS再过1年可直逼200M。
包大小对应用的下载转化率和留存率起到至关重要的作用。首先是苹果公司不支持流量下载超过200M的包,且据Google play统计,包大小每增加6M,下载转化率会下跌1%。此外也能提升用户的留存率,因为当手机内存不够用时,会优先删除占内存较大的app。 为了让每一次新需求集成时,开发能切实感受到对整体包大小的影响,让每一次包大小变动都有迹可循,需要对包大小进行科学分析。现在开发每次提交代码后,会触发打包平台自动打包,包构建成功后会自动进行包对比分析,并发回开发包增量分析报告邮件。在介绍这个包增量分析工具之前,先给大家科普下安装包的构成。
Android安装包是以后缀名为“apk”的压缩包。闲鱼安装包解压后的主要构成如下:
AndroidManifest.xml
配置文件:包含包名、组件、权限的配置信息等。
resources.arsc
android资源索引表:包含资源名称、类型、值、ID和配置信息。
classes.dex
:是很多.class文件处理后的产物,最终可以在 Android 运行时环境执行。
/assets
:放置随包打入的文件,如text、二进制数据等。
/res
资源文件:存放图片、字符串、布局文件、xml文件等,运行打包时没有使用的文件资源不会打入包中。
/lib
:程序运行时依赖的库。
iOS安装包是后缀为“ipa”的压缩包,解压后主要包含以下几部分: 签名文件:里面的CodeResources包含对bundle中的所有资源文件的签名信息。 资源文件:程序运行过程中需要的资源,比如图片、音频、视频、nib文件、配置文件等。 可执行文件:是通过编译器、连接器将我们编写的代码、静态库、动态库编译成的文件,是程序的主体。其中静态库在链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝,动态库则是链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用。 bundle文件:工程中使用的其他第三方或资源的bundle。
apk压缩包按照资源文件类型分类,主要有:so资源(程序运行依赖的库,如接入UC浏览器内核SDK时,引入的so达到惊人的12M)、图片资源(png、webp、jpg等)、Java代码(dex文件)、xml代码这几类,此外还可横向统计flutter相关资源情况。
由于可以拿到单个文件的信息,所以我们开发了工具解析apk包中的内容,从文件类型角度分析包资源占比情况,以及将资源文件按照大小排序展示,并以图表形式直观告诉开发资源情况。
通过分析link map文件获得静态库大小,网上有很多link map的解析工具。核心是解析link map文件中的Object files和Symbols中的数据。
#Object files:
[ 0] linker synthesized
[ 1] /Users/xy/build/workspace/Pods/MNN/MNN.framework/MNN(MNNReluInt8-24695ca527c0186b07.o)
[ 2] /Users/xy/build/workspace/Pods/MNN/MNN.framework/MNN(MNNGemmInt16to32_4x4_Unit416f183fdf349b160b82.o)
[ 3] /Users/xy/build/workspace/Pods/MNN/MNN.framework/MNN(CPUPermute.o)
每一行代表对应可执行文件的编号,如CPUPermute.o文件编号是3。
#Symbols:
#Address Size File Name
0x100006CA00x000000EC
[
3
] __MNN10CPUPermuteC2EPNS_7BackendEPKNS_2OpE
0x100006D8C0x0000004C[ 3] __MNN2Op15main_as_PermuteEv
0x100006DD80x00000008[ 3] __MNN10CPUPermute8onResizeERKNSt3_$body
0x100006DE00x00000580[ 3] __MNN10CPUPermute9onExecuteERKNSt3_$body
0x1000073600x00000034[ 3] __MNN38___CPUPermuteCreator__OpType_Permute__Ev
0x1000073940x00000070[ 3] __MNN10CPUPermuteD1Ev
在Symbols部分,Address是偏移地址,Size是所占内存大小,File所指的编号就是Object files中的文件编号,将Symbols中所有相同编号的Size累加起来,即可获得该编号对应可执行文件的大小了。
然后根据可执行文件的目录信息,可知该文件所属的静态库,从而计算出对应静态库代码大小。此外静态库大小在计算时需要排除对应的 dead Stripped Symbols
的大小来获得真正的二进制大小,因为这些是无用的符号,链接的时候不会加入。
动态库通常位于安装文件根目录下的Frameworks目录中,通常是一个后缀为.framework的文件夹。
由于动态库在arm64架构下比较大,且苹果在拆包阶段会将打包好的通用的主二进制和动态库拆分成单架构的主二进制和动态库,所以只要是涉及二进制只计算arm64单架构的情况即可。
动态库大小是直接用 lipo
拆成arm64单架构大小后计算framework文件夹占磁盘大小获得。
模块大小为库大小+该模块所有资源文件占磁盘的大小,若为动态库的模块,则资源大小仅计算拷贝到主bundle的资源。分析结果如下图所示:
瘦包主要靠开发努力,要让大家在平时开发中有瘦包的意识,最好有工具能让开发在日常开发中清楚知道每个文件/模块的大小,切实感受到需求集成后对整体包大小的影响和相关文件/模块变动情况,从而促进开发进行相应的优化。
通过将前面介绍的包分析能力集成到打包脚本,在每次包构建成功时,也会同步产出基础的包内容信息,再通过进一步的分析后获得包中每个文件/模块的大小情况。当代码改动触发重新打出新包后,文件/模块通过一一对比的方式,找出哪些有新增,哪些被删除,哪些内容发生变动,以及变动产生的大小,并产出对比报告邮件。通过这样的方式让开发对代码增量有一个直观感受。 那如何让包增量分析工具能在日常开发中持续稳定发挥作用呢,接下来介绍闲鱼的需求增量卡口设计。
在之前,闲鱼的包大小差异通常都在拉出集成分支,打出版本release包时才发现,经常会震惊于这个版本的包又比上一个版本要大几M,然后再紧急去寻找是什么需求集成导致的巨大增量。但这时发现包大小的问题已经非常滞后了,版本马上就要发布,这个时候即使抓到了剧增的源头,也很难在短时间内进行优化。 因此需要增加需求集成卡口,测试通过后在合入主分支之前,经过包增量确认再集成,而不是在集成后打出release包时。现在的做法如下,开发只需要提交代码,即可自动获得包增量分析报告。
其中包增量对比邮件内容,会包含与主分支最新构建、当前分支前一次构建,当前分支最初一次构建包的包大小和增量的对比结果。此外为了数据的准确性,需要开发在拉出开发分支后先构建一个基准包,并在提测和集成前合并一把主干,这样报告数据才会更准确。
最后是提测部分,开发同学发送提测邮件时需要标注本次提测包增量及图片压缩情况,若需求增量大于100K,根据超出范围情况,需要备注原因和老板确认。bug修复期间不免也会有代码改动,在测试完成后集成前,会再确认一次包增量情况再集成。
闲鱼需求增量卡口自6.20正式上线以来,所有客户端新需求都受到了严格的卡口,可以感受到以下明显变化:
需求增量卡口是长效控制包大小的一个关键路径,加强开发在日常编码中的瘦包意识,让每一次需求都有迹可循。此外flutter产物更精细的分析方案和有效的瘦身方法也在持续探索中,对于存量的资源、业务代码清理等手段也在有序进行,请对小胖鱼早日瘦身拭目以待吧~
本文由哈喽比特于4年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/1FAt6shQJcKDo2Wj86nAZA
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。