都 2025 年了,为什么国产安卓手机厂商还在死磕系统流畅?
我来抛个暴论,国产安卓手机厂商死磕系统流畅,都是在给安卓填坑。
如果你关注操作系统领域,有一个叫“中国Linux内核开发者大会”的论坛值得关注,到今年是第二十年。这几年的议程大体可分为三类:怎么优化安卓体验、怎么改造服务器Linux、怎么适配国产软硬件,大概各占三分之一。去年的主论坛,第一个发言的就是vivo,讲AI端侧大模型时代Linux内核的现状与发展。
原因嘛,你们大概也能猜出来,安卓从开发到现在,挖的坑太多了。早些年国内手机厂商主要还是在跟着主线走,但随着自主开发能力上来以后,发现安卓有很多坑,需要填坑才能保证更好的用户体验。
——这也是为什么国产安卓手机厂商还在死磕系统流畅。
这场论坛今年还没开,从去年手机厂商们参加的分论坛来看,安卓的坑,主要在三方面:调度和锁机制、内存管理、存储I/O效率。
首先,调度和锁机制,是安卓与流畅之间最大的坑。
在Linux 6.6之前,Linux采用的是公平调度机制(CFS),不是硬实时调度器,调度效率有赖于第三方框架,在CPU机制管理上有问题,导致卡顿。
安卓当时把TOP app的UI和render提升到110,但由于CFS任务优先级只是控制线程分配资源额度,导致重载下就有流畅性问题。同时,当时传统的PELT负载跟踪算法对快速反应的负载反应慢,合成和评先的线程是RT线程,标准内核无法对重载RT线程提升频率、迁移到大核,没法在8.3毫秒——也就是120Hz刷新率场景下完成一帧绘制,这也就是视觉上的卡顿。
直到去年的Andorid 15版本,Linux 6.6才被并入主线,使用最早合格虚拟截止时间优先(EEVDF)调度器取代了公平调度机制。

但光是引入EEVDF,也不能解决问题。
Linux机制中由锁机制和资源竞争,还会导致性能问题。一是优先级翻转,即低优先级任务持有锁,导致需要该锁的高优先级任务被迫阻塞,而持锁的低优先级任务又无法获得足够CPU时间来及时释放锁,最终造成高优任务长时间卡顿。二是FIFO(先进先出)等待队列带来的性能瓶颈,任务优先级不对,关键的UI线程等高优任务被置于等待队列末尾,需要等大量普通任务被唤醒后才能获得服务,从而被频繁延迟,导致卡顿。三是激烈竞争下的性能衰减,当大量读写线程同时尝试进入同一个临界区时,会引发对锁的激烈争用,造成系统负载瞬间突增,导致性能下降。
说这么多,大体意思还是,原生安卓的坑太多,随着这几年国产手机厂商能力的提升,已经开始意识到内核的问题,和如何调整内核机制,提升手机流畅度了。
vivo先解决的是调度问题,从OriginOS 3.0开始,引入了不公平调度机制,这次升级到了超核计算,提升应用的流畅性。
前面提到,虽然安卓已经大幅提升了调度能力,但对于大小核的迁移、提升频率速度,以及对于前后台任务的调度,还是存在一大把需要提升的细节。
这是最直接能影响流畅度体验的。手机日常都是开一把常用APP,然后在不同APP里面切来切去的。
举个例子,我刷抖音,蹦出来了微信消息,华为会看一眼头像,决定回不回复。如果刷到比较感兴趣的产品,会看看抖音橱窗里的描述,顺带再切去淘宝、拼多多和闲鱼,看看哪个平台更便宜。
外加后台还有一大把应用想要推送。微信的推送最着急,钉钉、飞书可能也不能落下,还有美团、淘宝、饿了么,谁先谁后都是问题。
——这些都是不亚于游戏的“重度负载”应用,CPU调度会手忙脚乱。
超核计算新增了系统级全局队列,通过实时监控CPU负载,确保高优先级任务最快、最好响应,能够放在大核上,快速拉高频率,保证日常应用的流畅性。
同时,蓝厂也首发了“统一渲染架构”,让各种动画效果流畅,提升主观体验流畅性。
动画效果是大家容易忽略,但实际很影响主观流畅度的体验。
但问题上面也提到了,一方面是由于调度机制问题,导致帧绘制可能无法在8.3毫秒内完成,也就是说120Hz刷新率的屏幕,可能会掉帧,导致视觉观感上卡顿。
这方面的问题,蓝厂是通过超核计算解决的,将UI绘制提升至最高优先级,快速拉高主频,防止由于算不过来导致的掉帧。
另一方面是,动画上,如果不直观、不跟手、掉帧、缺少逻辑关联等原因,即使动画帧率在120帧,也可能导致主观体验上的不流畅。
vivo这次升级的统一渲染架构,也让动效体验更流畅,让画面显得不卡顿。
动画曲线上,蓝厂采用了模拟真实物理世界的Spring动效,让回弹、缓停、加速更符合我们对于真实世界的习惯和直觉。
逻辑关联上,不同交互之间的关联也更加符合真实世界的直觉。
同时,在不同界面切换中,也通过减少断层干,提升连续体验,比如划拉到负一屏的时候,通过帧模糊,类似拍照中背景虚化的作用,将负一屏和第一屏关联起来。
其次,内存管理机制上,安卓延续自Linux的内存分页和管理机制也是大坑。
智能手机的应用场景越来越复杂,从第19届中国Linux内核开发者大会上,参会人员主要提出了三方面的问题:
一是,用户内存需求提升下,传统Linux的4KB内存分页机制性能不够。
二是,内存随机性强,手机长期不关机,时间越长,应用的内存占用就会快速碎片化,导致卡顿,Linux传统机制找到连续空闲空间难,但对性能和内存占用敏感。
三是,传统内存换出后背设备的zRAM、zSWAP处理颗粒度小,有性能瓶颈

所以,vivo引入了智能内存调度功能。
从第19届中国Linux内核开发者大会vivo性能优化专家的发言中,可以看到具体的操作步骤。他们将不同进程分类,前台进程少压缩,后台进程中度到重度压缩,对压缩大页部分不用压缩,节约CPU资源。
通过这种方式,动态调度内存资源,保证前台正在使用的应用最流畅,同时减少CPU压缩内存过程中的资源占用,提升整体系统流畅性。


同时,vivo还会夜间手机空闲期间,内存碎片整理。
日常应用开启、退出后,会导致内存形成大量不连续的、微小的空闲块,导致虽然总的空闲内存很多,但却无法分配出一个足够大的连续空间给需要它的程序。最典型的问题可能是,系统明明显示还有1GB的空闲内存,但当某个应用尝试申请 20MB 的连续内存时却失败了,这样应用打开就变慢了,系统需要重新整理内存分配给需要的应用。
vivo夜间的内存碎片整理,就是将正在使用的内存页搬家,把它们挪到一起,从而腾出大块的连续空闲空间。但这本身是一个耗费CPU的操作,可能会导致系统瞬时响应变慢,放到夜间空闲时间整理,既不影响手机操作,也能让白天的手机重归流畅。
最后,长时间使用对设备的磨损,也是降低流畅度的来源。
手机在长期使用中,存储空间会逐渐满载,NAND Flash也存在磨损,导致读写速度下降,进一步影响使用体验。
此外,老手机可能还存在运行内存不足,需要频繁读写NAND Flash的交换页面,而NAND Flash磨损和满载,导致的速度下降还会进一步拖慢交换页面的读写速度,导致体验卡顿。
一方面,蓝厂对I/O预读取进行了优化。通过软硬结合层级的扩展预读取路径,让软件从内部存储加载到运行内存,或者软件的SWAP分区到内存的加载速度变快,提升老手机的流畅度,也保证现在的手机能在长时间应用中,减少卡顿。

另一方面,蓝厂也针对手机存储空间越来越少,提出了硬件上的解决方案。通过整理碎片化文件,提出新的ovp方案,让手机在存储空间快要慢的时候,也能保证读取的流畅度,提升读取效率。

总结
国产安卓手机厂商还在死磕系统流畅,倒真的不是性能过剩,是性能提升跟不上安卓挖的坑。也是国内安卓手机厂商自主研发能力,在不少领域超过了主线开发进程的体现。就拿底层调度机制来说,vivo的不公平调度机制的应用,远早于相关功能并入Andorid和Linux主线。
换句话说,当你看到坑,且有能力、有收益填这个坑的时候,你也就顺手填了。
在VDC上,vivo通过超核计算,优化调度机制;通过统一渲染架构,提升日常动画的流畅性;再通过I/O和存储上的底层优化,提升用户日常使用和长期使用的流畅性,这也是保障最广泛用户体验的关键。

