1. 程式人生 > >os-android: 除錯多媒體效能(Crack Media Perf)

os-android: 除錯多媒體效能(Crack Media Perf)

os-android: 除錯多媒體效能(Crack Media Perf)

Android在中國市場野蠻生長,廠商水平參差不齊。手機廠商大品牌較多,Android的硬體和軟體穩定性自然很高。Android在很多細分領域也有廣泛應用,如: 機頂盒、廣告機、收銀機、遊戲盒子、VR/AR、手持終端、掃地機器人、智慧音箱等,裝置廠商技術和人才儲備不足,晶片供應商也是國內中等實力的IC公司,在這類裝置上除錯多媒體效能,還是非常難的。

1 命令列啟動的app

這裡有臺友商樣機,同款晶片同款作業系統能夠達到視訊[email protected];我們的同款晶片同款作業系統只能達到視訊

[email protected]。Crack一下,找找差距。友商樣機不小心被我玩壞了,換了新核心後起不來了,僥倖只是Launcher起不來。

Launcher起不來,可以安裝一個第三方的Launcher。Launcher的作用無非就是一堆程式的快捷方式。使用am命令也能開啟需要開啟的程式。

下面查詢一下設定APP的完整包名,並使用am start命令開啟設定APP介面

fire_box:/ # dumpsys package | grep settings/.Settings
fire_box:/ # am start -n com.android.settings/.Settings
fire_box:/ # am start -n com.android.tv.settings/.MainSettings fire_box:/ # am start -n com.rockchips.mediacenter/.activity.MainActivity # 開啟設定APP設定一下HDMI的解析度為[email protected]。設定APP有平板的設定版本和TV的設定版本。 fire_box:/ # cat /d/dri/0/summary # 檢視VOP,確認設定是否生效

2 分析友商的多媒體播放效能(Crash Media Perfermance)

市場情報,友商同款晶片同款作業系統能夠達到視訊

[email protected];我們的同款晶片同款作業系統只能達到視訊[email protected]。Crash一下友商系統,找點底氣,找晶片原廠算賬(O(∩_∩)O哈哈~,其實是尋求技術支援)。

fire_box:/ # am start -n com.rockchips.mediacenter/.activity.MainActivity

視訊[email protected]播放,整個系統鏈路包括: 檔案系統讀寫效能(視訊解複用) --> 視訊硬解(DDR, VPU) --> 顯示系統(GPU/Overlay) --> 顯示驅動(VOP/LCDC)等 --> 物理顯示裝置。

特別提示:晶片原廠的系統核心是Linux-4.4, 如果是Linux-3.1部分解決略有不同。注意適用性。

檢查點:系統負載

檢視空閒的CPU。媒體應用CPU使用率不能太高,否則會出現排程問題。CPU使用率高會出現掉幀問題或概率性卡頓問題。使用下面命令觀察一段時間內的CPU平均的空閒率或使用率。

fire_box:/ # top -m 10 -t 1| grep 400% | awk '{print $5}'
fire_box:/ # logcat -c;logcat -v time  --pid `ps -A | grep mediaserver | awk '{print $2}'`

假如經過一段時間的統計,頻率CPU使用率為200%,這時候視訊肯定會卡頓,需要進一步分析是什麼消耗了CPU。造成卡頓的原因很多,建議抓一下系統的Trace分析一下。Trace一定要包含問題現象才有意義。通過Trace本人有發現過兩種卡頓問題:

  • DDR中斷驅動問題,導致中斷處理異常耗時,而造成卡頓
  • 系統GMS包一直崩潰和重啟,造成系統卡頓。這種情況在設定裡面把(App>Google Play Services)禁用掉在測試就知道了。

檢查點:檔案系統讀寫效能(視訊解複用)

# 看看有沒有異常的io讀寫
fire_box:/ # iotop -m 5

檢查點:視訊硬解(DDR, VPU)

# 視訊解碼對DDR和VPU使用異常頻繁,DDR和VPU的頻率是檢查點。DDR在800M,VPU在500M為佳。
fire_box:/ # ls /sys/class/devfreq
dmc ff300000.gpu ff360000.rkvdec
fire_box:/ # cat /sys/class/dmc/*/cur_freq    # ddr freqency
fire_box:/ # cat /sys/class/ff360000.rkvdec/*/cur_freq  # vpu freqency
# 視訊單幀解碼時間直接關注,播放幾個[email protected]片源,然後檢視
fire_box:/ # echo 0x100 > /sys/module/rk_vcodec/parameters/debug
fire_box:/ # cat /proc/kmsg

檢查點:顯示系統(GPU/Overlay)

# 檢視當前應用是GLES顯示還是Overlay顯示。從SurfaceFlinger或VOP中可以檢視。顯示的幀率是否充足都可以看看。
fire_box:/ # dumpsys SurfaceFlinger
fire_box:/ # dumpsys SurfaceFlinger | grep fps
fire_box:/ # cat /d/dri/0/summary # VOP summary, 奇怪的節點名.

檢查點:顯示驅動(VOP/LCDC)

播放4K視訊也和顯示系統和CPU有關係,他們的頻率也看看。如果是GPU渲染需要關注GPU頻率。
fire_box:/ # ls /sys/class/devfreq
dmc ff300000.gpu ff360000.rkvdec
fire_box:/ # cat /sys/class/ff300000.gpu/*/cur_freq    # GPU freqency
fire_box:/ # cat /d/clk/clk_summary | grep vop
          aclk_vop_pre                    1            1   400000000          0 0
             aclk_vop                     2            2   400000000          0 0
fire_box:/ # cat /sys/bus/cpu/devices/cpu*/cpufreq/cpuinfo_cur_freq
1008000
1008000
1008000
1008000

檢查點:多媒體物理裝置節點

# 獲取音效卡資訊
cat /proc/asound/card*/pcm0p/sub0/hw_params
cat /sys/class/drm/card0-HDMI-A-1/audioformat

# HDMI 節點資訊
Linux-3.1
$ cat /sys/class/display/HDMI/mode
$ cat /sys/class/graphics/fb*/disp_info
$ cat /sys/devices/virtual/display/HDMI/mode
$ ls /sys/devices/virtual/display/HDMI/
3dmode  color  debug  mode modes   power  scale  type
Linux-4.4
$ cat /sys/class/drm/card0-HDMI-A-1/modes (linux-4.4-drm)
$ cat /d/dri/0/summary

從設定裡面看下,顯示系統的引數,記錄一下。

3 自行解決還是丟擲問題

綜合以上分析。比較好解決的是DDR頻率、GPU頻率和VPU頻率不足。渲染的圖層比較多也容易解決。改改核心配置一般能解決。如果這些引數均一致,但是自家的表現不如友商,只能系統日誌配合上述日誌,丟擲來給晶片原廠解決了。

fire_box:/ # ps -A | grep mediaserver | awk '{print $2}'
fire_box:/ # logcat -c; logcat -v time --pid=${pid-mediaserver}

4 特別關注DDR問題

DDR顆粒的問題也需要關注。DDR顆粒的問題分幾種情況:(1) 有些低端的板子用4顆4位的拼成16位匯流排,DDR總頻寬受限,播放4K肯定吃力,大羅神仙也迴天無力。(2) DDR種類多,配置模板多,配置錯一點都可能帶來效能和穩定性問題。(3) DDR顆粒虛焊和其他重要元器件虛焊,可能帶來效能和穩定性問題。