Android"cpu可能挂钩"的bug

Dor*_*oro 13 android opengl-es

前言:此严重错误可导致Android设备锁定(无法按Home/Back按钮,需要硬重置).它与OpenGL表面和音频播放相关联.Logcat重复了一些效果

W/SharedBufferStack( 398): waitForCondition(LockCondition) timed out (identity=9, status=0). CPU may be pegged. trying again.
Run Code Online (Sandbox Code Playgroud)

每秒一次,因此这个错误的名称.造成这种情况的根本原因可能是缓冲数据时的死锁,无论是声音还是图形.

我在Asus EEE Transformer平板电脑上测试我的应用时偶尔会遇到这个错误.当声音线程MediaPlayer使用填充对象MediaPlayer.create(context, R.raw.someid);并且GLSurface线程使用位图加载纹理时发生崩溃

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
                R.drawable.textureMap,opts);
gl.glGenTextures(1, texAtlas, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, texAtlas[0]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
Run Code Online (Sandbox Code Playgroud)

我不认为原因是音频,因为音频实际上仍在播放(加载音频的线程然后在x时间后播放它).如果是这样,原因在于使用上述代码进行OpenGL ES缓冲.

相关材料

  • 这个SO帖子引用了这个bug.他们使用OpenGL ES 2.0和NDK.我使用OpenGL ES 1.1(虽然大多数设备模拟1.1到2.0,所以从技术上讲它们使用的是2.0)并且我不使用NDK.此外,他们使用Android 2.1,我的崩溃发生在Android 3.2.1上.
  • 该站点将错误链接到AudioTrack对象.但是,我不在我的应用程序中使用它.
  • Android Bug Tracker将此列为已知错误,但截至目前还没有解决方案(并且在Honeycomb +中没有修复).

共同元素

  • 缓冲时发生冻结.被缓冲的东西通常非常大,因此图像(图像越大则出现错误)或音频通常受到影响.
  • 冻结仅在某些设备上发生.
  • 冻结与特定的Android版本无关 - 已记录在2.1和3.2.1等等.
  • 冻结与使用NDK无关.
  • 冻结与单个编程习惯无关(缓冲顺序,文件类型等)

我的问题非常简单.这个问题有解决方法吗?如果你无法阻止它,有没有办法优雅地失败并防止整个设备被砖砌?

小智 0

增加设备的虚拟内存可以降低此问题的发生率。当然,除非您是设备的制造商,否则这不是一个选择。