facebook 工程师在非洲进行“下乡”测试,他们本以为自家的android 客户端能在最差的环境下表现出色,结果却大

Facebook的工程师们在2013年飞赴非洲进行“下乡”测试,他们本以为自家的Android客户端能在最差的环境下表现出色,结果却大失所望。网络时常掉线,应用频繁断开连接,本地设备的内存也快要耗尽。结果令人震惊,用户在40分钟内就用光了当月的流量,甚至连第二屏的内容都没能刷出来。这个数字让团队意识到“剩下的50亿人”不能再被忽视了。回国后,优化项目立即启动,目标是让Facebook App在低端设备上能够流畅运行、节省流量。他们先把精力放在优化冷启动上,因为热启动的优化空间有限,而冷启动涉及更多模块和复杂的依赖关系。 为了找出耗时最多的环节,团队把冷启动拆解成三个阶段:请求时间、网络时间和响应处理时间。数据显示,真正浪费时间的是摘要请求本身,而不是前后两端的网络延迟。所以团队把优化重心从加速网络转向精简初始化。他们还解决了单核老手机性能瓶颈问题。并行初始化多个模块会让CPU瞬间爆满,导致启动曲线直线上升。解决方案是延迟加载:只有当用户滑动到某个模块时才触发初始化,把压力从开机瞬间分散到使用全程。 由于非洲的网络信号不稳定,信息流图片加载常常卡死。团队采用了“早连接、多耗时”的策略:开机后立即建立长连接,提前获取第一屏信息流数据;当用户滑到第二屏时,第二批数据已经在路上了。这个方法大大提升了流畅感。他们还对照片进行了瘦身处理。研究发现照片是流量消耗的主要原因。WebP格式相比JPG压缩率提升了35%,比PNG节省了80%的流量。工程师将所有照片转换为WebP格式后节省了相当于半年流量的空间。 按需加载策略也被应用到了图片加载中。过去统一拉取最大分辨率的图片现在被按需加载替代:先加载适合窗口尺寸的图片,用户放大时再补充高清版本。配合多级缓存和重用策略后图片加载失败率大幅下降。 网络加固方面Facebook使用了OkHttp替代HttpURLConnection来处理网络请求。OkHttp自带SPDY支持和快速重试机制,在弱网环境下可以实现秒级重连。 团队还利用UDP前置技术解决了TCP三次握手耗时问题:先发一包“摘要请求暗号”到服务器预热缓存,随后TCP正式握手时直接返回缓存数据。几百毫秒的延迟被砍掉了。 Feed流优化方面他们采用了流式下载策略:前台先拉取一层应急内容,后台再补充一层缓冲内容。服务器压力减轻后响应速度提升了300ms。 后台服务排队也被引入到层处理中:引入先进先出队列和单线程执行器把并行任务变成顺序任务后CPU占用率下降了三成。 文件瘦身方面Facebook采用了动态APK方案:为低端设备去掉冗余资源而保留高端设备的特性包。这个方法把安装包大小削减了65%。 为了确保旧机型能够顺利运行新版本他们还在代码中埋入大量功能开关:关闭某些特效或降低采样率来避免升级后崩溃的问题。 这套性能与流量优化工具链也应用到了Messenger和Instagram Android版中:统一架构、统一指标、统一测试流程让全球用户都能享受更快、更省、更流畅的社交体验。