1. 程式人生 > >Android createWindowSurface failed EGL_BAD_ALLOC 引起Crash的解決方案

Android createWindowSurface failed EGL_BAD_ALLOC 引起Crash的解決方案

createWindowSurface failed EGL_BAD_ALLOC

先看下Log:

W/Adreno-EGL﹕ <eglTimestampCreate:5493>: EGL_BAD_ALLOC
E/libEGL﹕ eglMakeCurrent:784 error 3003 (EGL_BAD_ALLOC)
I/Choreographer﹕ Skipped 69 frames!  The application may be doing too much work on its main thread.
connect: already connected (cur=1, req=1)
E/libEGL﹕ EGLNativeWindowType 0x6052c710 already connected to another API
E/libEGL﹕ eglCreateWindowSurface:415 error 3003 (EGL_BAD_ALLOC)
D/AndroidRuntime﹕ Shutting down VM
W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4165fce0)
W/Adreno-GSL﹕ <gsl_ldd_control:412>: ioctl fd 61 code 0x400c0907 (IOCTL_KGSL_DEVICE_WAITTIMESTAMP_CTXTID) failed: errno 35 Resource deadlock would occur
W/Adreno-GSL﹕ <log_gpu_snapshot:327>: panel.gpuSnapshotPath is not set.not generating user snapshot
W/Adreno-EGLSUB﹕ <updater_thread:448>: waitFunc failed
W/xxx_android﹕ createWindowSurface failed EGL_BAD_ALLOC
    java.lang.RuntimeException: createWindowSurface failed EGL_BAD_ALLOC
            at android.view.HardwareRenderer$GlRenderer.createSurface(HardwareRenderer.java:1351)
            at android.view.HardwareRenderer$GlRenderer.createEglSurface(HardwareRenderer.java:1243)
            at android.view.HardwareRenderer$GlRenderer.initialize(HardwareRenderer.java:1060)
            at android.view.HardwareRenderer.initializeIfNeeded(HardwareRenderer.java:605)
            at android.view.ViewRootImpl.draw(ViewRootImpl.java:2396)
            at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2252)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1882)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5603)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:544)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5146)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
            at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
            at dalvik.system.NativeStart.main(Native Method)
3023-3023/com.xxx.xxxE/AndroidRuntime﹕ FATAL EXCEPTION: main
錯誤資訊為:createWindowSurface failed EGL_BAD_ALLOC

解釋下EGL:EGL 視窗設計是基於人們熟悉的用於 Microsoft Windows ( WGL )和 UNIX ( GLX )上的 OpenGL 的 Native 介面,與後者比較接近。OpenGL ES 圖形管線的狀態被儲存於 EGL 管理的一個 Context 中。 Frame Buffers 和其他繪製 Surfaces 通過 EGL API 建立、管理和銷燬。EGL 同時也控制和提供了對裝置顯示和可能的裝置渲染配置的訪問。

錯誤資訊的大概意思就是建立視窗檢視失敗,錯誤資訊是EGL_BAD_ALLOC。

EGL_BAD_ALLOC:無法建立檢視(缺少資源或者之前已經建立了一個)。

如果遇到了這個錯誤,我想,你的應用是不是已經開啟了硬體加速。開啟硬體加速功能是在Android3.0以後出現的,這也就是為什麼從Android3.0之後,流暢度比2.0好很多,要是說硬體加速的話,就有點多了,以後有時間的時候再說吧。

我這裡提到的這個錯誤,是基於正常的應用,如果你的應用是基於cocox2d或者其他的引擎開發的,那麼解決方法是控制一下SurfaceView的生命週期,這個網上有很多的方法。如果你的應用沒有手動指定GlSurfaceView,但是出現了這個問題,那麼就繼續看吧。這個問題引起的原因比較多,本文不能說肯定解決問題,但是也許會給你一些提示。

出現上面的Log,說明應用在進行繪圖時候出現了錯誤。經常遇到的情況是:Activity1進入Activity2(可能會帶WebView情況居多),然後再回到Activity1,刷Activity1的列表(等類似的操作)。就會出現這個Log。

分析:

首先Activity1一般都是使用了Opengl繪圖,當切換到Activity2的時候(一般帶有WebView的情況居多),這個時候WebView也使用了opengl進行繪製,在關閉Activity2的時候可能出現:Activity2關閉了,但是WebView沒有徹底關閉。於是回到Activity1的時候,由於WebView使用gl繪圖處在正在使用EGL階段,而現在Activity1又要使用gl繪圖,這個時候就會出現crash。

W/ManagedEGLContext﹕ doTerminate failed: EGL count is 2 but managed count is 1
這個情況解決是關閉在Activity2OnDestory的時候關掉這個WebView,removeallview(),destory(),必要的時候使用反射關閉webview,程式碼就不上了。

還有的情況是,Activity2中使用了某些執行緒,導致了Activity2沒有徹底關閉,來回開關Activity2的時候導致記憶體溢位。但是Activity2記憶體溢位了為什麼會在切換到Activity1的時候Crash呢?因為在切換到Activity1的時候,Activity1要進行gl繪圖,這個建立過程其實是非常吃記憶體的,大概僅僅一個建立繪圖的過成就需要吃掉8M的記憶體,但是這個時候由於Activity2由於記憶體溢位,導致根本就沒有8M記憶體給Activity1來吃,於是就出現了Activity1繪圖失敗,而且這個失敗導致Crash的Log是不會報在應用的Log的,而是會報在SystemProcess下面的。

這個情況的解決是先看下Activity2是否有記憶體溢位。進DDMS,GC一下,看看反覆開關Activity2記憶體有沒有漲,如過發現記憶體漲了,這個時候用MemoryAnalyzer來查一下,就會知道是哪行程式碼出現問題了。

還有一種可能是Activity1OnPause的時候出現的問題,具體看下Log。最好是看一下onTrimMemory裡的level,如果提示危險的話,在相應的生命週期裡面做一下記憶體處理,比如判斷一下bitmap的大小,清理一下bitmap等操作。儘量不要讓Activity到一個危險的即將被回收的環境。例如下面的Log,還是要具體問題具體分析的。

08-29 12:47:04.376    1023-1075/system_process W/InputDispatcher﹕ channel '4272d878 com.xxx (server)' ~ Consumer closed input channel or an error occurred.  events=0xd
08-29 12:47:04.376    1023-1075/system_process E/InputDispatcher﹕ channel '4272d878 com.xxx (server)' ~ Channel is unrecoverably broken and will be disposed!
08-29 12:47:04.418      266-266/? D/Zygote﹕ Process 16898 terminated by signal (7)
08-29 12:47:04.459    1023-4505/system_process I/WindowState﹕ WIN DEATH: Window{4272d878 u0 com.xxx.MainActivity}
08-29 12:47:04.459    1023-4505/system_process W/InputDispatcher﹕ Attempted to unregister already unregistered input channel '4272d878 com.xxx (server)'
08-29 12:47:04.464   1023-17235/system_process W/ActivityManager﹕ Exception thrown during pause
    android.os.DeadObjectException
            at android.os.BinderProxy.transact(Native Method)
            at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:660)
            at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:765)
            at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2497)
            at com.android.server.am.ActivityStack.finishTopRunningActivityLocked(ActivityStack.java:2374)
            at com.android.server.am.ActivityStackSupervisor.finishTopRunningActivityLocked(ActivityStackSupervisor.java:2068)
            at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:9736)
            at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:9629)
            at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:10280)
            at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:9825)
            at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86)
還有個,就是把硬體加速關掉。其實隱患還是在的,治標不治本,而且關閉硬體加速的話,應用確實會卡,幀數掉的比較多。

總結:如果你的應用是使用的全域性的那種硬體加速,不要想著在Activity類中去單獨控制他的GLSurfaceView,而是要找到這個類出現的問題。一般情況的話:記憶體問題(找到記憶體溢位的地方,處理掉,執行緒沒有關閉之類的);或者例如跳到某個彈窗或者介面在返回,應該是GL繪製衝突,處理一下生命週期;或者server,看下服務是不是重複開啟了。

這個bug其實是很難解的 = = ,我研究了好幾天,其實現在也是一知半解的。

暫時就想到這麼多,自己寫的東西很多東西不懂,歡迎指正~

文章自己原創不容易,轉載請註明出處。

相關推薦

Android createWindowSurface failed EGL_BAD_ALLOC 引起Crash解決方案

createWindowSurface failed EGL_BAD_ALLOC 先看下Log: W/Adreno-EGL﹕ <eglTimestampCreate:5493>: EGL_BAD_ALLOC E/libEGL﹕ eglMakeCurrent:7

Android Studio開發 -- BUILD FAILED -- R檔案丟失 解決方案

Android Studio開發 -- BUILD FAILED -- R檔案丟失 解決方案   原來直接複製進來的圖片格式是jpg ,需要轉成 png ,後重新編譯就可以了 R檔案丟失!!!我最開心的就是遇見這個了,因為我寫過關於R檔案丟失問題解決方案彙總,怎麼也難不住我吧,

caused by android.system.errnoexception open failed eacces (permission denied)解決方案,安卓6.0(API23)許可權問題

在API23+以上,不止要在AndroidManifest.xml裡面新增許可權 1 <uses-permission android:name="android.permission.REA

com.android.builder.internal.aapt.AaptException: Failed to crunch file解決方案

有時候在網上下載或者從別的地方導進來的專案會報這個錯誤 Error:com.android.builder.internal.aapt.AaptException: Failed to crunch。這個是因為在windows系統中AndroidStudio的檔案路徑不能

android gradle打包常見問題及解決方案

opener imu use dex 虛擬機 解決 sco expected tac 背景: 問題: Q1: UNEXPECTED TOP-LEVEL ERROR: java.lang.OutOfMemoryError: Java heap space at com.

Android Studio更改工程名異常解決方案 :can't rename root module

包括 extern ext 相關 文件名 post roo 手動 修改文件 在修改Android Studio 中 project的名字時 ,提示 “can’t rename root module”。 這是因為Android S

(通用)Android App代碼混淆終極解決方案【轉】

rar $$ enable 知識 object ava write android ref App雖然沒有那麽的高大上,但是代碼的混淆是代表了程序員對App的責任心, 也是對App安全的一點點保證。今天我會將自己做Android混淆的過程和體會分享給大家,也避免大家少走彎路

android studio bug : aidl is missing 解決方案

visio ogr example tin .html using 項目 tac users 很久不打開Android studio 今天打開一下,發現之前配置好的開發環境不能用了! 項目中“R.”變紅了,運行結果如下,可以說很怪,電腦沒動過,怎麽回事呢? 於是Stack

Android中漸變圖片失真的解決方案

png 體積 div 利用 出現 情況 子類 ont 如果 在android開發(尤其是android遊戲開發)中有一個很嚴重的問題就是帶有漸變效果的png圖片會出現嚴重的banding(色帶),鑒於這種情況,有幾種可行的解決方法: 1.如果Activity裏面的o

Android缺失hprof-conv.exe問題解決方案

最近心血來潮想寫個app,開啟已經有了灰的eclipse,想著新建一個Android project,經過了一系列的配置,結果還是在掃描半天以後報出如下錯誤:(當時連換臺電腦的心都有了,就是資金不到位) DDMS files not found: *\sdk\platform-tools\hpr

Android 沉浸式狀態列完美解決方案

現在搜尋Android 沉浸式狀態列,真的是一堆一堆,寫的特別多,但是真正用的舒服的真沒有,在這裡自己整理一下開發記錄   注意,在使用這個步驟過程之前,請把之前設定的程式碼註釋一下 把佈局帶有android:fitsSystemWindows註釋掉 style檔案中凡是在style.xml

關於Android熱修復的幾種解決方案

文中引用到的一些部落格: http://www.jianshu.com/p/0a31d145cad2 https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef

Android最大方法數和解決方案

在build.gradle中新增:multiDexEnabled true 加入依賴‘compile ‘com.android.support:multidex:1.0.1’’加入依賴‘compile ‘com.android.support:multidex:1.0.1’’

Android記憶體洩漏問題分析及解決方案

大家新年好,由於工作繁忙原因,有好一段時間沒有更新博文了(當然Github是一直都有更新的),趁著年底有點放假時間,我覺得抽空更新下部落格,總結一下工作中最常見記憶體洩漏問題,也是自己之前踩過的坑,為了讓大家少走彎路,系統全面總結一下記憶體洩漏問題分析原因及尋找解決方案。 概念 首

android全面屏顯示不全解決方案【更新中...】

一、宣告最大螢幕縱橫比(官方適配方案) Android官方提供了適配方案,即提高App所支援的最大螢幕縱橫比,實現很簡單,在AndroidManifest.xml中可做如下配置: <meta-data android:name="android.max_aspect"

Unity Android APP il2cpp熱更完美解決方案

1. 簡介 這是Unity Android APP il2cpp熱更完美解決方案的Demo(Git地址)的說明。 和現有的熱更解決方案不同的是,他不會引入多餘的語言(只是UnityScript,c#…),對Unity程式設計和編碼沒有任何限制。你可以在預置和場景裡的GameObjec

Android應用安全常見問題及解決方案

內容來源:2018 年 09 月 15 日,華為資深技術專家李欣哲在“從研發到測試,手把手教你打造綠色應用”進行《應用安全常見問題及解決方案》的演講分享。IT 大咖說作為獨家視訊合作方,經主辦方和講者審閱授權釋出。 閱讀字數:3315 | 9分鐘閱讀 觀看嘉賓演講視訊及PPT,請點選:t.cn/E2DtMQW

MacBook下-bash: cd: /Applications/Android: No such file or directory解決方案

前言        當我想在Android studio的Terminal中敲相關gradlew命令時,一直報[bash: gradlew: command not found]錯誤,很是心塞,故翻閱一些相關資料解決此問題,所幸是成功了,在此做一下筆記

android studio執行卡慢的解決方案

androidstudio安裝目錄下 bin/studio64.exe.vmoptions 檔案:配置檔案 將引數調大,比如。 -Xms2048m -Xmx2048m -XX:MaxPermSize=2048m -XX:ReservedCodeCacheSiz

Android Studio:resource android:attr/dialogCornerRadius not found 出錯解決方案

報錯資訊: error: resource android:attr/dialogCornerRadius not found error: resource android:attr/fontVariationSettings not found error: