错误:创建窗口表面失败 EGL_BAD_ALLOC。

29

我在 Google Play 上有一个用于倒计时数字和字母的应用程序。在这个应用程序中,我有以下活动:

  • Google 登录
  • 成就
  • AdMob 服务

我使用 Google Analytics 和 ACRA 进行错误报告。我不使用 GLsurfaceView,但我每天使用 ACRA 一两次,会给我这些错误:

java.lang.RuntimeException: createWindowSurface failed EGL_BAD_ALLOC
at android.view.HardwareRenderer$GlRenderer.createSurface(HardwareRenderer.java:763)
at android.view.HardwareRenderer$GlRenderer.createEglSurface(HardwareRenderer.java:663)
at android.view.HardwareRenderer$GlRenderer.initialize(HardwareRenderer.java:502)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1325)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2467)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)

有人知道发生了什么吗?我不使用SurfaceView;有人可以帮帮我吗?


1
修好了吗?我认为这是因为AdMob。 - xmen
你是否在使用图片作为活动的背景?设备有其可以处理的图像的最大分辨率(这取决于设备),如果你试图创建和使用比该分辨率更大的图像,你将会得到一个GL错误。 - PoOk
也许是为了AdMob,我该怎么办?我的背景上有图片,但它的大小是80kb... - cayrodev
同样的问题,关于这个异常有几点观察:1. Android 4.0和4.1,2. 平板电脑,3. GPU:Mali 400,4. 在三星设备上找不到。 - sagis
我今天在制作自定义动画转换时发现了这个问题。我在Note3上的股票4.4.2上看到了它。在4.4.2上的Moto G或5.0(LPX13D)上的Nexus 5上没有看到它。在Note3上是一致的。使用ObjectAnimator移动几个不同对象上的四个变量进行相当复杂的动画。到目前为止,我有两个解决方法... 1)减少动画的复杂性。 2)在动画视图后面添加黑色背景(从技术上讲,在过度绘制方面,过渡视图后面没有背景)。这些解决方法并不是非常科学/可能是巧合。 - tliebeck
2个回答

8
我遇到了同样的问题,发现问题与某些设备上的WebView和硬件加速有关。相比于完全关闭硬件加速,我选择禁用所有WebView(包括AdMob视图)的硬件加速!以下是操作步骤:
adView = new AdView(this); //or get it with findViewById()
if (Build.VERSION.SDK_INT >= 11) {
   adView.setLayerType(AdView.LAYER_TYPE_SOFTWARE, null); //instead of LAYER_TYPE_HARDWARE
}

3
有没有一种方法可以使用InterstitialAd做相同的事情? - deko

2
你尝试过为你的应用禁用硬件加速吗?(它使用OpenGL,因此需要这个修复程序)?
添加:
<application android:hardwareAccelerated="false" ...>

在清单文件中把应用程序标签设置为关闭状态,这可能会解决问题。
如果你想知道是否应该使用硬件加速,请参考此带有答案的问题:是否应该使用硬件加速

也许只需要将特定的“Activity”放入其中,例如AdActivity? - Jared Burrows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接