ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android TV 海思平台调试

2020-06-12 18:38:32  阅读:2317  来源: 互联网

标签:log TV sdcard cat HI ERROR Android proc 海思


文章目录

  在进行机顶盒ROM开发时,海思是最经常接触到芯片平台之一,所以对于海思平台Debug方式的掌握,是十分有必要的。

一、产品参数

  在运营商机顶盒ROM中,常见的海思的芯片产品有两款:Hi3798MV100和Hi3798MV300。

1.1 Hi3798MV100

  产品参数如下:

1.2 Hi3798MV300

  产品参数如下:

二、网络类&播放类

  网络连接问题和播放问题严格来说不是一类问题,但常常关联出现,所以在此归为一大类。同时,这两类问题在日常开发及现网故障中出现的频率比较高,排查起来也比较耗时,因此将日常的调试方式总结一下,会有事半功倍的作用:
  1>过滤时移的url
   http.request.uri contains “.ts” || http.request.uri contains “.m3u8”
  2>设置开机广告静帧
   persist.sys.bootanim.playmode=freeze
  3>查看PPPOE是否加密
   sys.ethernet.password.encrypt值为true代表密码加密,false代表密码不加密。示例如下:
   PPPOE密码不加密的log:

01-01 00:00:06.947 D/pppd ( 2166): sent [PAP AuthReq id=0x1 user=“sf” password=“12345678”]

   PPPOE密码加密的log:

01-01 00:00:10.277 D/pppd ( 2431): sent [PAP AuthReq id=0x1 user=“sf” password=]

  4>确认是否具有容灾环境
   说简单点,就是一个URL中有主备地址,用来保证视频的正常播放。URL带了"rrsip",即代表该URL具备容灾功能,主地址不通时,可以从备地址操作播放。
  5>容灾重试
   主备地址切换完还不能连上的,默认系统会继续重连。如果不需要失败后重连功能,需setprop media.hp.net.reconn 0,该属性值默认为1,即失败后重连。
  6>DNS解析顺序优先级(Hi3798MV300)
   sys.network.priority=4(IPv4优先)
   sys.network.priority=6(IPv6优先)
  7>双网管场景
   即支持两个默认网关的组网环境,在DHCPv6获取地址完后会分别对两个网关进行NS/NA交互,可通过属性persist.sys.dhcpv6.resend.ns控制,该属性为true时,代表启用该功能。
  8>错误帧处理
   海思对错误帧的处理,默认是"零容忍"的,即播放的视频中,只要有错误帧,视频就不能播放。如果要兼容错误帧,需要将service.media.hiplayer.vdecerr设置为具体数值。例如setprop service.media.hiplayer.vdecerr 1。
  9>Option16(Hi3798MV300)
   如果进行Ipv6连接的时候需要Option16字段中携带认证信息,需要设置一个属性:setprop persist.ipv6.option16.rfc3315 true。
  10>组播花屏事件中的RATIO数值
   在花屏过程中收到多少个IPTV_PLAYER_EVT_VID_DATA_ERROR消息,除以这段时间应该收到的帧数,得到的就是ratio值。
  11>部分rtsp流不能播放
   setprop persist.sys.hiplayer.rtspusetcp true。
  12>部分牌照方播放点播界面时花屏,回退卡死
   有些APK图形超过720UI(1280x720), 需要预置 persist.graph.cropframe=true 。
  13>MediaPlayer -38错误
   上层应用调用stop后又调用reset导致的,不是播放器内部错误。
  14>IPV6流不能播放(Hi3798MV100)
   media.hp.ipv6设为true。该属性值默认为false,播放IPV4流。
  15>HLS切片下载
   播放hls格式流时,下载一个切片前,会先判断该切片在不在最新的m3u8里面。如果在,就下这个切片,如果不在,就下最新的m3u8里的第一个切片。
  16>service.media.hiplayer.graphic相关问题(Hi3798MV100)
   该问题在Patch12版本上可能会有多种现象,比如:“点播频繁快速SEEK过程中概率性出现电视黑屏,视频没有正常显示出来”、“小窗口播放组播流出现掉帧现象”。该属性的意义如下:
    true:网络播放,走overlay OTT
      本地播放,走android标准输出
    false: 网络走VO
   由此可知,小窗口播放组播流出现掉帧现象的原因是:走了overlay,导致在同步的帧率计算处理一些问题,导致视频帧不停早丢弃,引起的卡顿。
  17>增加直播缓存数据
   设置两个属性:media.hp.hls.update.thread=enable & media.hp.hls.live.start=0。
  18>获取时长为负数
   setprop persist.hisi.media.hp.tsrdsz 256000,可以从片尾多获取一些数据。
  19>双栈时概率性切台慢
   该问题的原因是:IPV6地址发起连接请求不通时,需要直接跳转IPV4地址发起连接请求,需setprop media.hp.continue.ipv6 false。
  20>静帧切台后,回看时上下键切台会黑屏,有声音无视频
   setprop persist.sys.win.switch.black true。
  21>直播有部分节目不能全屏播放
   此时用的是卓影的中间件,解决方法为:persist.sys.video.cvrs 0。参考资料:Android双屏异显功能总结
  22>小窗口黑屏
   该问题的具体操作是:在详情页界面,未等小窗口加载完毕,切到其他界面然后返回,然后全屏播放,小窗口开始黑屏,然后切到不同界面,小窗口位置一直都是黑屏状态。产生该现象的原因是:静帧切台模式,再创建播放器时也新创建SurfaceView,原来的SurfaceView没有销毁,导致多个全屏window,无法enable,海思仅支持一个全屏的video output。解决方法:setprop media.hp.vod.blackmod true。
  23>切台
   一段视频播放log如下:

05-19 15:32:44.458 2463 2463 D PinyinIME: …onKeyDown…keyCode :…21 -->按键
05-19 15:32:44.458 2463 2463 D PinyinIME: …onKeyDown…out…21
05-19 15:32:45.413 2806 3286 V MediaPlayer: setDataSource(http://hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221228281/42329182.smil/index.m3u8?fmt=ts2hls&STBID=00420100300400702002ACBB6156E1D0&USERID=72330000771213) —>设置播放url
05-19 15:32:45.469 2806 3286 W MediaPlayer: setDataSource videoRect:left=0 top=0 right=1920 bottom=1080
05-19 15:32:45.676 1512 7026 I HiPlayer: [15:32:45.676] [svr_pctrl.c:5720] report HI_SVR_PLAYER_EVENT_FIRST_FRAME_TIME!
05-19 15:32:45.676 1512 7026 V HisiMediaPlayer: [SWITCH-PG ] HI_SVR_PLAYER_EVENT_FIRST_FRAME_TIME, time:84
05-19 15:32:45.744 2806 3286 D MediaPlayer: recieve MEDIA_INFO_EXTEND_FIRST_FRAME_TIME -->第一帧显示

   从按键按下–>设置URL–>显示第一帧,整个时间间隔就是切台时间。

三、系统类

  该章节主要介绍一些海思平台上特殊的调试手段。

3.1 输出相关

  模拟HDMI线插入事件命令:
   1>echo event 16 > /proc/msp/hdmi0
   2>hidisp setoutputenable 0 1
  模拟HDMI线拔出事件命令:
   1>echo event 17 > /proc/msp/hdmi0
   2>hidisp setoutputenable 0 0
  使用AV输出方式:
   hidisp setoutputenable 1 1
   HiDisplayManager.setOutputEnable(1,1)

3.2 CEC

  CEC待机开关属性:
   persist.sys.hdmi.cec,设置为true代表启动CEC待机功能,false关闭。
  待机后,电视开机可以唤醒盒子属性:
   persist.sys.cec.hardware,设置为true代表可以唤醒,false不能。

3.3 杜比

  cat /proc/msp/sys命令可以用来查看终端是否支持杜比,示例如下:

SDK_VERSION: [HiSTBAndroidV600R003C01SPC031_patch5] Build Time: [May 21 2020, 15:38:32]
UNF_VERSION: 3.3.1
CHIP_VERSION: Hi3798MV300
PACKAGE_TYPE: BGA 14*14
DOLBY: NO
DTS: NO
ADVCA: NO
ROVI(Macrovision): NO
HDR10: YES
DolbyVision: NO

  以上内容则表示终端不支持杜比。
  cat /proc/hisi/hiplayer00/fileinfo命令可以查看当前播放的视频的信息,其中可以看出文件格式,示例如下:

*****Hisilicon HiPlayer00 Media File Info Begin
Stream type: ES
Source type: LOCAL
File size: 32282624 bytes
Start time: 0:0:0
Duration: 0:3:19
bps: 1295450 bits/s
Is Divx File:NO
Program 0:
video 0 info:
stream idx: 0
stream pid: 480
format: MPEG2
w * h: 352 * 288
fps: 25.0
bps: 0 bits/s
duration: 0:3:19
audio 0 info:
stream idx: 1
stream pid: 128
format: AC3
samplerate: 48000 Hz
bitpersample: 0
channels: 2
bps: 448000 bits/s
lang:
subID: -1
duration: 0:3:18
***Hisilicon HiPlayer00 Media File Info End

  以上内容可以看出,该视频是AC3格式的,即是杜比格式视频。
  除了上面的命令, cat /proc/msp/adec00命令也可以用来查看视频是否是杜比格式的,示例如下:

--------------------------- ADEC[00] State --------------------------

WorkState :start
CodecID :0x81f00055
DecoderName :ac3passthrough
Description :hisilicon ac3passthrough decode
*DecodeThreadID :7458
Volume :100
SampleRate :48000
BitWidth :16
Channels :2
*PcmSamplesPerFrame :0
*BitsBytePerFrame :0x1800
StreamFormat :non-packet

*TryDecodetimes :22314
FrameNum(Total/Error) :269/0
FrameUnsupportNum :0
StreamCorruptNum :0
StreamBuf(Total/Use/Percent)(Bytes) :2097152/2096640/99%
StreamBuf(readPos/writePos) :0x75b00/0x75900
OutFrameBuf(Total/Use/Percent) :8/7/87%
GetBuffer(Try/OK) :25276/1439
PutBuffer(Try/OK) :1439/1439
SendStream(Try/OK) :0/0
ReceiveFrame(Try/OK) :264/262
PtsLostNum :0
*DecodeThreadExecTimeOutCnt :0
*DecodeThreadScheTimeOutCnt :0
*DecodeThreadSleepTimeMS :10
AdecDelayMS :0

  以上内容也可以看出,该视频是AC3格式的,即是杜比格式视频。

3.4 IGMP

  cat /proc/net/igmp命令可以查看终端中IGMP相关信息。
  cat /proc/sys/net/ipv4/conf/eth0/force_igmp_version命令可以查看默认使用的组播协议版本。

3.5 系统信息大汇总

  /proc/msp是一个重要的目录,很多系统级别的信息,该目录下的文件如下:

*adsp
adec00
avplay00
cipher
demux_chan
demux_chanbuf
demux_filter
demux_main
demux_pcr
demux_port
demux_rec
demux_rec_index
disp0
disp1
hdmi0
hdmi0_ao
hdmi0_sink
hdmi0_vo
hi_gfx2d
hifb0
i2c
ir
isogeny
jpeg
keyled
log
low_delay_statistics
mce
module
omxvdec
pdm
pm
pm_core
pm_cpu
pm_gpu
pm_temp
png
pq
sci0
sci1
sound0
stat
sync00
sys
tde
tuner
tuner_diseqc
tuner_reg
vdec00
vdec_ctrl
vpss00
win0100

  cat /proc/msp/log命令可以看不同方面内容相关的log级别,示例如下:

---------------- Log Path ------------------------
log path:
---------------- Store Path ----------------------
store path: /mnt
---------------- Module Log Level ----------------
Log module Level
HI_SYS 1(ERROR)
HI_MODULE 1(ERROR)
HI_LOG 1(ERROR)
HI_PROC 1(ERROR)
HI_MEM 1(ERROR)
HI_STAT 1(ERROR)
HI_PDM 1(ERROR)
HI_DEMUX 1(ERROR)
HI_ADEC 1(ERROR)
HI_AO 1(ERROR)
HI_AI 1(ERROR)
HI_AENC 1(ERROR)
HI_AIAO 1(ERROR)
HI_ADSP 1(ERROR)
HI_VFMW 1(ERROR)
HI_DISP 1(ERROR)
HI_HDMI 1(ERROR)
HI_VO 1(ERROR)
HI_VPSS 1(ERROR)
HI_VDEC 1(ERROR)
HI_VI 1(ERROR)
HI_VENC 1(ERROR)
HI_PQ 1(ERROR)
HI_TDE 1(ERROR)
jpeg 1(ERROR)
HI_JPGE 1(ERROR)
HI_FB 1(ERROR)
HI_PNG 1(ERROR)
HI_GFX2D 1(ERROR)
HI_PVR 1(ERROR)
HI_AVPLAY 1(ERROR)
HI_SYNC 1(ERROR)
VSYNC 1(ERROR)
ASYNC 1(ERROR)
HI_MCE 1(ERROR)
HI_IR 1(ERROR)
HI_I2C 1(ERROR)
HI_SCI 1(ERROR)
HI_GPIO 1(ERROR)
HI_GPIO_I2C 1(ERROR)
HI_TUNER 1(ERROR)
HI_KEYLED 1(ERROR)
HI_CIPHER 1(ERROR)
HI_OTP 1(ERROR)
ca 1(ERROR)
HI_PM 1(ERROR)
HI_KARAOKE 1(ERROR)
MALI 1(ERROR)
hidlna_1593 1(ERROR)
hiplayer_2452 1(ERROR)
hiplayer00_7453 1(ERROR)
echo hi_avplay=2 > /proc/msp/log
echo logsize=XXX > /proc/msp/log
the current logsize is (12)MB, range(1MB~120MB)
echo log=/mnt > /proc/msp/log
echo storepath=/mnt > /proc/msp/log

  由上面内容,可以看出不同的log级别,及响应的修改方式。如修改HDMI相关log级别命令为echo hi_hdmi=4 > /proc/msp/log
  cat /proc/msp/disp*可以查看分辨率相关具体信息。
  cat /proc/msp/hdmi*可以查看HDMI相关具体信息。
  cat /proc/msp/pm_cpu可以查看CPU温度。

四、抓log脚本

4.1 通用型脚本

  该类型脚本一般用来辅助排查播放类问题,该脚本中包含了日常问题排查中包含的所有常规log,排查具体问题时选取对应的命令使用即可。示例如下:

setprop persist.hisi.media.hp.loglevel 6
rm /sdcard/.pcap
rm /sdcard/
.log
tcpdump -i any -p -s 0 -w /sdcard/tcpdump.pcap &
screenrecord /sdcard/screen.ts &
cat /proc/kmsg > /sdcard/kmsg.log &
logcat -c
logcat -v threadtime -f /sdcard/logcat.log &
{
cat /proc/cmdline /proc/msp/sys >> /sdcard/proc.log
getprop >> /sdcard/proc.log
pm list packages -f >> /sdcard/proc.log
setprop service.media.codec.debug true
setprop service.media.codec.logcat true
cat /sys/module/lowmemorykiller/parameters/adj >> /sdcard/proc.log
cat /sys/module/lowmemorykiller/parameters/minfree >> /sdcard/proc.log
while [ true ]
do
date >> /sdcard/proc.log ; echo >> /sdcard/proc.log
ls /proc/hisi/ /proc/hisi/msp/0 >> /sdcard/proc.log
if [ -d “/proc/hisi/hiplayer00/” ] ; then
echo "## cat /proc/hisi/hiplayer0*/" >> /sdcard/proc.log
cat /proc/hisi/hiplayer0
/* >> /sdcard/proc.log
fi
echo “## cat /proc/media-mem” >> /sdcard/proc.log
cat /proc/media-mem >> /sdcard/proc.log
echo “## dumpsys meminfo” >> /sdcard/proc.log
dumpsys meminfo >> /sdcard/proc.log
echo “## procrank -p” >> /sdcard/proc.log
procrank -p >> /sdcard/proc.log
echo “## cat /proc/meminfo” >> /sdcard/proc.log
cat /proc/meminfo >> /sdcard/proc.log
echo “## busybox free” >> /sdcard/proc.log
busybox free >> /sdcard/proc.log
echo “## cat /proc/vmallocinfo” >> /sdcard/proc.log
cat /proc/vmallocinfo >> /sdcard/proc.log
echo “## cat /proc/slabinfo” >> /sdcard/proc.log
cat /proc/slabinfo >> /sdcard/proc.log
echo “## cat /proc/buddyinfo” >> /sdcard/proc.log
cat /proc/buddyinfo >> /sdcard/proc.log
echo "## cat /sys/kernel/debug/ion/heaps/" >> /sdcard/proc.log
cat /sys/kernel/debug/ion/heaps/

echo “## cat /sys/kernel/debug/mali/gpu_memory” >> /sdcard/proc.log
cat /sys/kernel/debug/mali/gpu_memory >> /sdcard/proc.log
echo “## cat /proc/pagetypeinfo” >> /sdcard/proc.log
cat /proc/pagetypeinfo >> /sdcard/proc.log
echo “## dumpsys SurfaceFlinger” >> /sdcard/proc.log
dumpsys SurfaceFlinger >> /sdcard/proc.log
echo “## dumpsys window windows >> /sdcard/proc.log” >> /sdcard/proc.log
dumpsys window windows >> /sdcard/proc.log
echo “## dumpsys activity activities >> /sdcard/proc.log” >> /sdcard/proc.log
dumpsys activity activities >> /sdcard/proc.log
echo “busybox ifconfig” >> /sdcard/log/proc.log
busybox ifconfig >> /sdcard/log/proc.log
echo “## top -m 5 -t -n 1” >> /sdcard/proc.log
top -m 5 -t -n 1 >> /sdcard/proc.log
echo “## cat /proc/msp/demux*” >> /sdcard/proc.log
cat /proc/msp/demux* >> /sdcard/proc.log
echo “## cat /proc/msp/omxvdec” >> /sdcard/proc.log
cat /proc/msp/omxvdec >> /sdcard/proc.log
echo “## cat /proc/msp/0 /proc/msp/disp1” >> /sdcard/proc.log
cat /proc/msp/0 /proc/msp/disp1 >> /sdcard/proc.log
echo “## cat /proc/msp/pm*” >> /sdcard/proc.log
cat /proc/msp/pm* >> /sdcard/proc.log
echo “## cat /proc/net/snmp /proc/net/dev” >> /sdcard/proc.log
cat /proc/net/snmp /proc/net/dev >> /sdcard/proc.log
himd.l 0xf9c30500 0x300 >> /sdcard/proc.log
sleep 2
done
} &

  该脚本中内容简单介绍如下:
   1>setprop persist.hisi.media.hp.loglevel 6
    设置播放事件log等级。
   2>rm /sdcard/.pcap;rm /sdcard/.log
    删掉之前抓的log和网络包。
   3>tcpdump -i any -p -s 0 -w /sdcard/tcpdump.pcap &
    在后台抓网络包。
   4>screenrecord /sdcard/screen.ts &
    在后台录制视频。
   5>cat /proc/kmsg > /sdcard/kmsg.log &
    在后台保存内核log。
   6>logcat -c
    清除日志缓存。
   7>logcat -v threadtime -f /sdcard/logcat.log &
    在后天抓取logcat日志。
   8>{ }&
    在后台执行组合命令。
   9>cat /proc/cmdline /proc/msp/sys >> /sdcard/proc.log
    保存内核启动log、一些简要的系统信息。
   10>getprop >> /sdcard/proc.log
    保存所有的属性。
   11>pm list packages -f >> /sdcard/proc.log
    保存所有的应用及对应的包名。
   12>setprop service.media.codec.debug true;setprop service.media.codec.logcat true
    打开播放器编解码log显示开关。
   13>cat /sys/module/lowmemorykiller/parameters/adj >> /sdcard/proc.log;cat /sys/module/lowmemorykiller/parameters/minfree >> /sdcard/proc.log
    保存lowmemorykiller相关的一些信息。/sys/module/lowmemorykiller/parameters/minfree:里面是以”,”分割的一组数,每个数字代表一个内存级别
/sys/module/lowmemorykiller/parameters/adj:对应上面的一组数,每个数组代表一个进程优先级级别 。举个例子:
/sys/module/lowmemorykiller/parameters/minfree:18432,23040,27648,32256,55296,80640
/sys/module/lowmemorykiller/parameters/adj:0,100,200,300,900,906
代表的意思:两组数一一对应,当手机内存低于80640时,就去杀掉优先级906以及以上级别的进程,当内存低于55296时,就去杀掉优先级900以及以上的进程。
   14>while [ true ] do done
    循环执行一些脚本。
   15>date >> /sdcard/proc.log
    保存日期。
   16>ls /proc/hisi/ /proc/hisi/msp/0 >> /sdcard/proc.log
    保存播放相关的一些信息。
   17>cat /proc/hisi/hiplayer0*/* >> /sdcard/proc.log
    保存播放相关的一些信息。
   18>cat /proc/media-mem >> /sdcard/proc.log
    保存多媒体内存使用情况。
   19>dumpsys meminfo >> /sdcard/proc.log
    保存终端内存使用信息。
   20>procrank -p >> /sdcard/proc.log
    保存终端内存使用信息。
   21>cat /proc/meminfo >> /sdcard/proc.log
    保存较详细的内存使用信息。
   22>busybox free >> /sdcard/proc.log
    保存终端内存使用信息。
   23>cat /proc/vmallocinfo >> /sdcard/proc.log
    保存内存分配记录。
   24>cat /proc/slabinfo >> /sdcard/proc.log
    slab分配器相关信息
   25>cat /proc/buddyinfo >> /sdcard/proc.log
    保存linuxbuddy系统管理物理内存的debug信息。
   26>cat /sys/kernel/debug/ion/heaps/. >> /sdcard/proc.log
    保存协助排查内存泄漏相关信息。
   27>cat /sys/kernel/debug/mali/gpu_memory >> /sdcard/proc.log
    保存GPU内存使用情况。
   28>cat /proc/pagetypeinfo >> /sdcard/proc.log
    保存较详细的内存使用信息。
   29>dumpsys SurfaceFlinger >> /sdcard/proc.log
    保存系统图层相关信息。
   30>dumpsys window windows >> /sdcard/proc.log
    保存系统窗口相关信息。
   31>dumpsys activity activities >> /sdcard/proc.log
    保存系统Activity相关信息。
   32>busybox ifconfig >> /sdcard/log/proc.log
    保存网络相关信息。
   33>top -m 5 -t -n 1 >> /sdcard/proc.log
    保存内存占用较大进程信息
   34>cat /proc/msp/demux* >> /sdcard/proc.log
    保存码流信息。
   35>cat /proc/msp/omxvdec >> /sdcard/proc.log
    保存码流信息。
   36>cat /proc/msp/0 /proc/msp/disp1 >> /sdcard/proc.log
    保存显示相关信息。
   37>cat /proc/net/snmp /proc/net/dev >> /sdcard/proc.log
    保存网络包流量信息。
   38>himd.l 0xf9c30500 0x300 >> /sdcard/proc.log
    保存操作寄存器信息。
   39>sleep 2
    2秒不作任何操作。

4.2 特殊脚本

  在抓取播放器相关log时,可能会再做一些特殊的操作,但不太太多,比如:echo hi_avplay=3 > /proc/msp/log、echo hi_vo=2 > /proc/msp/log等。

标签:log,TV,sdcard,cat,HI,ERROR,Android,proc,海思
来源: https://blog.csdn.net/m0_37741420/article/details/106586272

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有