. Android OpenGL ES 2.0 NDK живые обои. Crash при нажатии "Установить обои" во время незавершенного просмотра.
Android OpenGL ES 2.0 NDK живые обои. Crash при нажатии "Установить обои" во время незавершенного просмотра.

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

📎📎📎📎📎📎📎📎📎📎