黄嘉桐 丁冠源 回姝 郑红丽
(1.中国第一汽车股份有限公司智能网联开发院,长春 130013;2.汽车振动噪声与安全控制综合技术国家重点实验室,长春 130013)
主题词:车载信息娱乐 内存管理 应用 频度检测 进程内存 泄漏监测
在现代汽车工业中,汽车正在由简单的代步工具向智能终端转变。而汽车座舱作为能够直接与用户发生交互的构成部分,提升汽车座舱的智能化水平,成为现代车企不断向智能化方向发展的突破口。从汽车座舱的智能化发展来看,汽车的功能及应用场景愈发复杂,汽车座舱演化到网联化形态后,座舱功能和内容的丰富程度得到大幅提升,用户体验接近甚至开始超越智能手机,但由于车载信息娱乐的功能多样化引进,对座舱系统上运行的生态系统产生了更高的要求。Android系统因具有较好的娱乐生态基础,成为了各大主机厂车载娱乐系统的标准选择,但是用户使用中因Android设备因内存不足,容易发生卡顿现象,由此带来的用户体验差的问题也成为企业研发关注的重点。
为了解决这一问题,本文建立了一种基于车载信息娱乐系统的内存管理机制,目的是通过所述的内存管理策略和优化内存的措施,及时回收内存资源,提升设备性能。
首先,对于当前车载信息娱乐系统的开发而言,内存的选择主要依赖于车规级SOC芯片的处理能力,当前市场上的车型,内存选取多为4 G、8 G、12 G、16 G等,因此在有限的系统内存资源下,合理资源分配显得尤为重要。
车载信息娱乐系统的整体内存资源分配,主要关注以下5项要素:
(1)娱乐域搭载的应用列表;
(2)根据Android系统本身运行需要的资源,再加上系统的功能应用资源,评估剩余系统资源占用总量;
(3)各应用要素:前台内存RAM均值、前台内存RAM峰值;
(4)非前台内存RAM均值、非前台内存RAM峰值;
(5)最差场景设计,评估最差场景下的内存占用。
信息娱乐系统在进行资源分配时,除上述的关注要素外,一些特殊功能的设计同样影响整体系统资源消耗,需要关注的特殊功能设计如下:
(1)开机性能,包括Android系统非车机功能裁剪、开机服务启动顺序;
(2)LOG设计,包括Android原生LOG机制优化、LOG存储策略、LOG导出机制;
(3)应用互斥设计,主要还是根据最差场景设计,将无法共同运行的应用做互斥策略管理;
(4)应用后台管理设计,在原有Android后台管理的基础上,监控及查杀后台非必要应用;
(5)内存占用监控设计,在内存空间不足时,设计用户交互提醒,回收空间;
(6)Audio设计,包括仪表和中控侧音源管理,中控侧各子功能音源管理,根据硬件的设计以及软件需求,配置音频策略;
(7)Power设计,涉及MCU、SOC的音源管理策略,以及各个软件程序启动时序等设计。
2.3.1 信息娱乐系统资源分配原则
信息娱乐系统的资源分配需要符合下述通用原则:
(1)安全域和娱乐域对于资源占用的分配,一般为1:3;
(2)Android侧内存,在设计预留时,最少要占用315 M。小于315 M系统会自动调用kswapd0进程来搬运内存数据到虚拟内存,导致CPU占用率升高;
(3)CPU均值在设计时,需保证单系统的占用率小于75%,确保系统流畅运行。在75%~80%会有卡顿,80%以上卡顿增多,90%以上无法运行。
2.3.2 内存管理优化设计
对于现有的车载信息娱乐系统Android端内存管理机制,大多设计人员处理方法为,当内存达到一定阈值时开始终止后台空闲进程,释放内存。但是对于低内存设备,系统内存很容易达到预定阈值,不断的回收操作过于频繁,一方面频繁的操作会导致系统内存回收不及时,影响上层应用的加载,另一方面也会导致系统的CPU资源紧张,从而加剧车载信息娱乐系统的卡顿现象,给用户带来较差的使用体验。
2.3.3 内存管理策略
基于上述分析,本章所述的技术方案基于Android车载娱乐系统制定的内存管理策略如下:
(1)车载信息娱乐系统开机时,启动组件最小化处理,移除Android原生的不使用的组件、驱动等,减少整体系统的内存使用量;
(2)对于车载信息娱乐系统内部设计,采用配制缓存回收机制。明确系统内各组件的生命周期、各组件的运行周期最小化处理。运行周期按照如下进行分类处理。
第1类:前台运行和后台运行都不释放资源;
第2类:前台运行切换后台运行后,释放部分资源;
第3类:前台运行切换到后台运行后,释放资源;
在车载信息娱乐系统设计初始,进行各个服务的用户使用频次进行调研,将强使用需求的服务及应用定义为第1类应用;对于后台运行仍需保活的应用,如音乐、导航等定义为第2类应用;对于切换到后台即不需要运行的应用,如空调等APP,定义为第3类应用。
(3)车载信息娱乐系统需配置各组件的内存回收优先级(OOM-Killer,oom_adj/oom_score_adj),其中优先级配置在系统内存充足时,应尽量减少对用户体验和系统的影响。
(4)减少车载信息娱乐系统允许同时运行的进程数量(Android原生为32个进程),超过该数量时,系统可以直接释放进行,以保证系统的流畅运行。
(5)车载信息娱乐系统在设计时,需增加进程完全退出的接口,不重要的APP进入退出流程时,调用此接口立即释放,不需要交给系统缓存机制处理。
(6)车载信息娱乐系统增加“一次性清理内存”的机制,当剩余内存达到某个阈值时,执行一次内存清理。
(7)车载信息娱乐系统增加APP使用频度检测机制,使用频度高的APP,在退出时保留原生缓存机制,而频度不高的APP,退出时立即释放;对于不同类别应用实施不同管理策略,更加了解用户使用APP习惯,避免了为保持系统流畅性清除掉用户高频或必备应用的场景,更大维度的保持系统高效运行和提高了用户使用体验。
(8)车载信息娱乐系统的用户通常长时间专注于某个特定应用,对多任务的需求不高,因此在设计时可以考虑修改阈值,让后台进程更容易被释放。比如:把后台进程和空进程的回收阈值设高,这样两者更容易被回收,确保前台进程和可见进程有更多可用内存,而不需要临时回收消耗CPU资源。
(9)车载信息娱乐系统在设计时定时监测进程内存,中止有泄漏的进程,其中每隔30 min检测一次进程内存,满足如下2个条件之一,则判定该进程发生了内存泄漏,立即中止该进程,具体流程如图1所示。
图1 定时监测进程内存流程
条件1:某个进程的内存值超出系统设定的192 M上限(largeheap进程为512 M);
条件2:某个进程连续多次的内存检测值,涨幅都超过设定;
除内存管理策略设计外,如章节2所述,在系统设计初始,应注意合理内存分配内存。其中针对运行在系统上的每个应用,都应该给出各个分区的内存分配限值,包含启动限值、静止限值、详细功能操作时的限值,应用应严格按照限制要求进行开发,系统需对应用的资源使用情况进行定时监测,对于使用资源异常的应用或服务,应采取强制清理机制,确保系统流畅的运行环境,避免因应用资源溢出导致的系统卡顿问题。
本文提出了一种基于车载信息娱乐系统的内存管理设计方案,已经成功搭载车型量产,应用在红旗车型H9、E-HS9信息娱乐系统平台,后续车型支持设计沿用。该设计可解决低内存Android设备因为内存不足,容易发生卡顿现象,解决了用户体验差的问题,用较少的硬件成本达到较高的使用性能要求,更符合消费者对座舱智能化、多样化的需求,提升用户体验,充分发挥了汽车系统的娱乐性和科技性优势。