以前发在 CSDN 上, blog.csdn.net/u014443348/…
掘金氛围感觉更好一点,打算慢慢转过来。
最近在使用 Unity 打包的 VR Android 应用时碰到了一点问题:
这个应用可以以平面模式(2d),或者全景模式来播放视频。
之前我们测试的时候基本播放的都是本地视频,都是能正常播放。最近测试了下播放网络视频(局域网内),发现会出现一个情况:同一个视频有时能正常放,有时会一直停留在加载动画界面(如下图),按理说同一个局域网访问是很快的,不太像是因为网络的问题。
之前我们测试网络的时候没有发现这个问题,经过我不懈努力(胡乱踩坑)才注意到一个事情:我们原来打包的应用,使用的 Unity 是 2017.3 左右版本,播放网络视频时没有问题。但是那个版本打包出现会出现 jni 的一些错误,疑似是和播放器或者 Unity 本身有关。
java 代码解读复制代码
29438-29461/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xdd000000 in tid 29461 (UnityMain)
741-741/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
741-741/? A/DEBUG: Build fingerprint: 'Pico/A7210/PICOA7210:6.0.1/MXB48T/eng.scmbuild.20240125.143125:user/test-keys'
741-741/? A/DEBUG: Revision: '0'
741-741/? A/DEBUG: ABI: 'arm'
741-741/? A/DEBUG: pid: 29438, tid: 29461, name: UnityMain >>> cn.com.ihappy.music <<<
741-741/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xdd000000
741-741/? A/DEBUG: r0 be4e7300 r1 dcfffff0 r2 00000cc0 r3 00000000
741-741/? A/DEBUG: r4 dcfffcd0 r5 be4e8000 r6 00000001 r7 00001000
741-741/? A/DEBUG: r8 00000001 r9 00001000 sl 00001000 fp dcfffcd0
741-741/? A/DEBUG: ip eadb0ebc sp ef3475d0 lr eaac4a4b pc f70d26a8 cpsr 200e0010
741-741/? A/DEBUG: backtrace:
741-741/? A/DEBUG: #00 pc 000176a8 /system/lib/libc.so (__memcpy_base+92)
741-741/? A/DEBUG: #01 pc 00163a47 /system/vendor/lib/egl/libGLESv2_adreno.so (_ZN9BltDevice17ExecFastCopyBlockEPvPKvjjjjPK7BltRectS5_i+102)
741-741/? A/DEBUG: #02 pc 00163daf /system/vendor/lib/egl/libGLESv2_adreno.so (_ZN9BltDevice14ExecFastSwCopyEP13BltExecSwCopy+846)
741-741/? A/DEBUG: #03 pc 00169a95 /system/vendor/lib/egl/libGLESv2_adreno.so (_ZN9BltDevice18ExecSwCopyInternalEP13BltExecSwCopy+7028)
741-741/? A/DEBUG: #04 pc 00169bad /system/vendor/lib/egl/libGLESv2_adreno.so (_ZN9BltDevice10ExecSwCopyEP13BltExecSwCopy+172)
741-741/? A/DEBUG: #05 pc 0013df9d /system/vendor/lib/egl/libGLESv2_adreno.so (_ZN9EsxBltLib16CopyHostPtrBltSwEPK17EsxBltCopyHostPtr+1212)
741-741/? A/DEBUG: #06 pc 001116c3 /system/vendor/lib/egl/libGLESv2_adreno.so (_ZN11EsxResource23UpdateSubResourceDirectEP10EsxContextjPK6EsxBoxPK20EsxSurfaceAccessDesci+642)
741-741/? A/DEBUG: #07 pc 000d3f73 /system/vendor/lib/egl/libGLESv2_adreno.so (_ZN10EsxContext17UpdateSubResourceEP11EsxResourcejPK6EsxBoxPK20EsxSurfaceAccessDesc+786)
741-741/? A/DEBUG: #08 pc 0012440f /system/vendor/lib/egl/libGLESv2_adreno.so (_ZN15EsxBufferObject6UpdateEP10EsxContextyjPKv+110)
741-741/? A/DEBUG: #09 pc 000bb267 /system/vendor/lib/egl/libGLESv2_adreno.so (_ZN10EsxContext12GlBufferDataEjlPKvj+102)
741-741/? A/DEBUG: #10 pc 000a3341 /system/vendor/lib/egl/libGLESv2_adreno.so (glBufferData+32)
741-741/? A/DEBUG: #11 pc 00564100 /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #12 pc 0053c704 /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #13 pc 0053c614 /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #14 pc 0054bb5c /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #15 pc 0054d0b4 /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #16 pc 002aaaac /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #17 pc 002a9c44 /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #18 pc 0047533c /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #19 pc 002382f8 /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #20 pc 00221814 /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #21 pc 005bdb08 /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #22 pc 005bfc48 /data/app/cn.com.ihappy.music-1/lib/arm/libunity.so
741-741/? A/DEBUG: #23 pc 0018f589 /data/app/cn.com.ihappy.music-1/oat/arm/base.odex (offset 0x14c000)
当时谷歌出的结果也是说这是 Unity 的问题,采用高版本打包即可解决。当时我们就使用了 2018.3 的版本,顺利解决了播放视频时报错的问题(必须要吐槽下 Unity 发版太频繁了,但是各版本兼容性又差)。但是并没有想起测试播放网络视频 ……
一验证,发现低版本(2017.3)打包出来应用的播放网络视频时确实没有出现停留在加载中的情况。这下就尴尬了 …… 低版本的打包可能要崩溃,高版本的打包可能要卡住。
经过两天的折腾,尝试了一些思路:
- 打日志查询调用流程,卡在哪了。(调用逻辑没问题,至于 Start 为什么没有调用摸不到头绪,应该是 Unity 的框架层逻辑了,播放器的逻辑看了下异常的时候也没调用,也找不到原因)。
- 既然搞不定代码,那就换个高版本的控件试试。播放使用的是 EasyMovieTexutre ,当前版本是 3.5.9 ,在网上下了 3.6.6 和 3.7.1 的版本,更新之后发现并没有不一样的地方。
- 再次换个高版本的 Unity 试试,2019.2 ,结果公司显卡太差,工程都加载不出来,老板的意思也不太想换 ……
折腾了很久没有结果,头疼,然后就摸鱼了 …… 突然想起之前另一个类似的应用,也碰到过这种卡住的问题,但是因为是播放本地视频,第一直觉就是应用没有退干净。
查看 Unity 部分的代码,看到了如下方法。
C#代码解读复制代码Application.Quit();
虽然不知道它退的效果怎么样,但是直觉是肯定没有 Android 杀进程快。(事实上我试了 Activity.finish()
感觉也还是不够干净)
java代码解读复制代码android.os.Process.killProcess(android.os.Process.myPid());
然后将退出代码换成了 Unity 调用 Android 端的杀进程。
后面再播放网络视频时就没有出现停留在加载中的问题了。
留个笔记,给碰到相同的问题朋友参考下。
评论记录:
回复评论: