黃嘉桐 丁冠源 回姝 鄭紅麗
(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設備因為內存不足,容易發生卡頓現象,解決了用戶體驗差的問題,用較少的硬件成本達到較高的使用性能要求,更符合消費者對座艙智能化、多樣化的需求,提升用戶體驗,充分發揮了汽車系統的娛樂性和科技性優勢。