Android OpenGL ES 2.0 NDK живые обои. Crash при нажатии "Установить обои" во время незавершенного просмотра.
Выбираем обои, начинается распаковка apk, инициализация 3D движка, если в это время нажать на кнопку "Установить обои", происходит crash.Если дождаться отрисовки сцены, все работает корректно.
Пробовал синхронизироваться из кода Java это не помогло. Синхронизация заключалась в использовании ключевого слова synchronized в методах onCreate/onDestroy. Но судя по Android Monitor при нажатии на кнопку "установить обои" повторный вызов OnCreate не приходит.
Какие есть решения?
На чем именно происходит падение?
aruz > На чем именно происходит падение? Падение происходит во время инициализации OpenGL ES, на какой именно функции поймать сложно, ибо это будет по разному в зависимости от моменты нажатия. Такое ощущение что что-то разрушается и меня об этом не уведомляют.
Вот что еще пишет Android Monitor
01-11 21:15:00.367: W/WallpaperService(13035): Failed to add window while updating wallpaper surface. 01-11 21:15:00.367: W/WallpaperService(13035): Failed to add window while updating wallpaper surface. . 01-11 21:15:00.367: W/WindowManager(2230): Failed looking up window 01-11 21:15:00.367: W/WindowManager(2230): java.lang.IllegalArgumentException: Requested window android.os.BinderProxy@42505330 does not exist 01-11 21:15:00.367: W/WindowManager(2230): at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:9134) 01-11 21:15:00.367: W/WindowManager(2230): at com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:3067) 01-11 21:15:00.367: W/WindowManager(2230): at com.android.server.wm.Session.add(Session.java:139) 01-11 21:15:00.367: W/WindowManager(2230): at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:70) 01-11 21:15:00.367: W/WindowManager(2230): at com.android.server.wm.Session.onTransact(Session.java:111) 01-11 21:15:00.367: W/WindowManager(2230): at android.os.Binder.execTransact(Binder.java:367) 01-11 21:15:00.367: W/WindowManager(2230): at dalvik.system.NativeStart.run(Native Method) 01-11 21:15:00.367: W/WindowManager(2230): Attempted to add window with token that is not a window: android.os.BinderProxy@42505330. Aborting. 01-11 21:15:00.367: W/WindowManager(2230): Failed looking up window 01-11 21:15:00.367: W/WindowManager(2230): java.lang.IllegalArgumentException: Requested window android.os.BinderProxy@42505330 does not exist 01-11 21:15:00.367: W/WindowManager(2230): at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:9134) 01-11 21:15:00.367: W/WindowManager(2230): at com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:3067) 01-11 21:15:00.367: W/WindowManager(2230): at com.android.server.wm.Session.add(Session.java:139) 01-11 21:15:00.367: W/WindowManager(2230): at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:70) 01-11 21:15:00.367: W/WindowManager(2230): at com.android.server.wm.Session.onTransact(Session.java:111) 01-11 21:15:00.367: W/WindowManager(2230): at android.os.Binder.execTransact(Binder.java:367) 01-11 21:15:00.367: W/WindowManager(2230): at dalvik.system.NativeStart.run(Native Method) 01-11 21:15:00.367: W/WindowManager(2230): Attempted to add window with token that is not a window: android.os.BinderProxy@42505330. Aborting.
В любом случае обои перегружаются и корректно работаю после краша. Но хотелось бы без него обойтись.
Варианты: - скачать исходники для версии на которой отлаживаешь и посмотреть в коде место где возникает исключение - взять более новую версию Android и попробывать на ней (возможно это баг и его уже устранили) - придумать костыль: отлавливать нежелательное нажатие или исключение и т.п. P.S. попробуй как можно раньше загружать нативную библиотеку System.loadLibrary, что-нибудь изменилось?
aruz > - скачать исходники для версии на которой отлаживаешь и посмотреть в коде место где возникает исключение Уже давно скачал и иногда просматриваю гавно Java код. Место тут android\service\wallpaper\WallpaperService.java:
Как бы это себе подключить. >- взять более новую версию Android и попробывать на ней (возможно это баг и его уже устранили) версия довольно новая как минимум 4.0 >придумать костыль: отлавливать нежелательное нажатие или исключение и т.п. Вот! это правильно решение, я уже продумываю его, где поставить обработчик нажатия кнопки "Установить обои" ?
Сервис WindowManager и WallpaperService я получу где-бы кнопку эту найти?
>P.S. попробуй как можно раньше загружать нативную библиотеку System.loadLibrary, что-нибудь изменилось? Нативную библиотеку Java грузит сам. Или ты имел ввиду инициализацию движка?
Правка: А что Java тега нету? wat ?
В коде, который ты указал, только пишется предупреждение (надо найти место генерации исключения).
Смотри описание классов WallpaperManager и WallpaperService.Engine, там можно отлавливать различные события. В WallpaperService.Engine есть isPreview() можно с ним придумать костыль.
aruz >Смотри описание классов WallpaperManager и WallpaperService.Engine, там можно отлавливать различные события. В WallpaperService.Engine есть isPreview() >можно с ним придумать костыль. посмотрел, даже Service::onCreate у себя перегрузил но туда не приходит вызов при быстром нажатии. Буду копать дальше. Манифест:
Правка не тот манифест вставил.
Andrey, может два Activity создается, одно на превью, другое на установленный вариант ? ЗЫ Ты NativeActivity юзаешь ?
Arxon > может два Activity создается, одно на превью, другое на установленный вариант ? Не уверен в этом. Activity на настройки есть это точно, но он стартует при выборе настроек обоев, он наследуется от PreferenceActivity. > ЗЫ Ты NativeActivity юзаешь ? В Режиме обоев нет. Это не получиться. NativeActivity для обычных приложений. Сервис обоев доступен из гавно-Java. А так двиг в режиме отдельного потока может работать и через NativeActivity.
aruz > На чем именно происходит падение? Кстати, все таки падает стабильно на функции ANativeWindow_setBuffersGeometry. Данный вызов нужен для использования с NativeActivity, я его убрал теперь вылетает на вызове glCreateWindowSurface. Что-то происходит с окном. копаю дальше.
А для реализации обертки над GL используется что-то самописное или код отсюда ? http://www.rbgrn.net/content/354-glsurfaceview-adapted-3d-live-wallpapers
shadwork >А для реализации обертки над GL используется что-то самописное или код отсюда ? Используется самописный 3D движок на C++. подправил в названии темы NDK.
Попробуй сделать отложенную инициализацию. Ну пропустить например пару первых удачных кадров заливая их черным, а потом инициализировать всё.
grea >Попробуй сделать отложенную инициализацию. Ну пропустить например пару первых удачных кадров заливая их черным, а потом инициализировать всё. Оно валиться не дойдя до главного цикла. Как раз в вызовах EGL связанных с окном. А окно наверное невалидное. И я не пойму как перехватить это событие. Нужно глубоко копаться в WindowManager, WindowManagerService