程序员在五分钟内从400MB的Apple安装包中削减了187MB已经是924MB。虽然最后大家发现它加了个虚幻引擎主要是为了视频通话的特效,但是网友还是感叹:现在的App真是越来越大了。而就在最近,一位国外的程序员也遇到了同样的困惑。由于他乘坐的飞机上没有小电视,他只能下载一个叫“联合航空”的APP看视频打发时间。小哥感叹航空公司越来越贼了:把成本加在客户头上,同时打开应用商店,结果很意外:不就是为了看电影什么的,一个Netflix是吗只有101.5MB,这个应用程序的大小是它的四倍吗?作为一名iOS/Android开发工程师,我决定不“坐以待毙”,看看它是否真的需要这么大的空间。事实证明,我可以节省187MB,然后就可以了。还在飞机上的小哥立马用ipatool下载了这个app的二进制文件。ipatool是GitHub上标记为1.4K的开源项目。它是一个命令行工具,可以从iOS应用商店搜索和下载应用程序的ipa文件包。该包可用于查看开发内容等功能。下载后需要将ipa扩展名改为zip。解压后可以看到如下目录:可以发现Frameworks占用414.8MB。小弟解释说:应用程序的主要内存来源是Frameworks,目前的最佳实践都是把代码push进去是很正常的。接下来进入这个目录:UAL开头的框架是核心架构,NodeMobile框架是NodeJS功能相关的,LocusLabSSDK和Mapbox是提供地图的,还有一些是负责鉴权和客户反馈的。。。视频播放则相反,其实并不会占用多少内存:然后进入占用空间最大的UALAppCore.framework。经过层层探索,小哥终于把最大的UALAppCore锁定在了这里。根据他的工作经验,77MB这个数字还是有点不正常。他打算用nm命令深入查看一下这个框架的符号表(symbol)文件(nm用来显示二进制目标文件的符号表,格式如下)。很快他想起Swift的符号需要剥离(strip,iOS框架中的术语),而Objective-C则不需要。然后查看Swift,发现Swift框架的符号一个都没有被剥离。而且这些都是没用的,白白消耗内存:那么下一步就简单了,写一个bash脚本运行框架就OK了:最后可以看到原来的框架从350MB降到了163M!小哥说这个操作只用了不到5分钟,没想到空间可以减少这么多,一共节省了187MB。也就是说现在的安装包只有原来的不到60%。他猜测安装程序仍有调整空间,但他对结果很满意。你是在浪费学习吗?“开发商不在乎。”就在小哥发完这篇博文后,有网友评论说还有很多安装包其实可以减少15%到30%甚至更高的空间。比如Gmail、Outlook这些很常见的应用。但是好像很多开发者都不是很关心这个问题。他们只是想保持应用的快速更新:为用户节省几百M的流量同样有利可图,何必呢?刚才有个嵌入式工程师说:当我跟同事说要注意这方面的优化时,他们总是白我一眼。有网友认为:除非应用商店开始处理这个问题,否则开发者不会做出改变。就说手机厂商看到这个场景很开心,内存不够可以去他们那里买个新手机。他还发现GooglePlay商店似乎不显示应用程序大小。而一些银行APP对这个问题特别重视,因为他们知道你不会轻易换银行。你怎么认为?
