Приложение Qt Quick для Android отображает пустой экран, если оно запускается более 1 раза

У меня проблемы с приложениями на базе Qt Quick - они некорректно работают на эмуляторах Android с API > 24 (новее Android 7.0).

Сборка и развертывание завершены успешно. Но приложение работает только в первый раз - если я выхожу из приложения (нажимаю «назад» или «домой» или закрываю приложение) и открываю его снова, появляется только пустой экран. Эта проблема сохраняется до тех пор, пока я не переустановлю приложение или не очистлю кеш приложения.


Гифка с изображением проблемы:

На реальных телефонах такой проблемы нет. Проекты, созданные в Android Studio, также не имеют подобных проблем.

Приложение на основе Qt Widgets работает корректно, без пустых экранов.

Единственное подозрительное, что я узнал от logcat, это то, что (он записался после второго запуска приложения):

06-04 10:06:24.976  1899  1989 W InputDispatcher: channel 'c7fea10 org.qtproject.example.testandroidqml/org.qtproject.qt5.android.bindings.QtActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
06-04 10:06:24.977  1899  1989 E InputDispatcher: channel 'c7fea10 org.qtproject.example.testandroidqml/org.qtproject.qt5.android.bindings.QtActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
06-04 10:06:24.977  1756  1756 I Zygote  : Process 4511 exited cleanly (0)
06-04 10:06:24.977  1899  2568 I WindowManager: WIN DEATH: Window{c7fea10 u0 org.qtproject.example.testandroidqml/org.qtproject.qt5.android.bindings.QtActivity}
06-04 10:06:24.977  1899  2568 W InputDispatcher: Attempted to unregister already unregistered input channel 'c7fea10 org.qtproject.example.testandroidqml/org.qtproject.qt5.android.bindings.QtActivity (server)'
06-04 10:06:24.977  1899  3872 I ActivityManager: Process org.qtproject.example.testandroidqml (pid 4511) has died: cch  CRE 
06-04 10:06:24.977  1899  1917 W libprocessgroup: kill(-4511, 9) failed: No such process
06-04 10:06:24.977  1899  1917 I libprocessgroup: Successfully killed process cgroup uid 10086 pid 4511 in 0ms
06-04 10:06:24.978  1755  2486 W SurfaceFlinger: Attempting to destroy on removed layer: AppWindowToken{86cbd61 token=Token{a4f68c8 ActivityRecord{b83956b u0 org.qtproject.example.testandroidqml/org.qtproject.qt5.android.bindings.QtActivity t12}}}#0
06-04 10:06:24.979  1899  1922 W ActivityManager: setHasOverlayUi called on unknown pid: 4511
06-04 10:06:24.979  1755  1755 W SurfaceFlinger: couldn't log to binary event log: overflow.

Почему это происходит и как я могу решить эту проблему?

Мои условия:

  • Убунту 22.04
  • Проект прост: по умолчанию он создан с помощью Qt Creator + добавлен красный прямоугольник в main.qml. Он построен под Qt 5.15 с помощью CMake.
  • Эмулятор "Pixel XL" под API 28 (Android 9.0) от Android Studio

Я пытался:

  • разные эмуляторы и разные API (кроме Android 7.0 не работает нигде)
  • развертывание с помощью Qt Creator и установка apk вручную - ни на что не влияет
2
0
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, я нашел решение.

Проблема решена, когда я установил значение «Программное обеспечение» вместо «Автоматически» для опции «Графика» в настройках производительности эмулятора (диспетчер устройств Android Studio).

Или вы можете установить его вручную в файле конфигурации эмулятора, изменив значение свойства hw.gpu.mode на software.

Сейчас он работает медленнее, но, по крайней мере, работает!

Другие вопросы по теме

Почему вызов оператора* для пустого std::optional вызывает неопределенное поведение, если я не сразу получаю доступ к возвращаемому значению?
Возможна ли агрегатная инициализация с помощью пользовательских полей в структуре с элементами, полученными из параметра шаблона, включая эти поля?
Почему «Размещение нового» для классов с виртуальными членами работает только тогда, когда буфер находится в локальном стеке?
Ошибка Flex «пропущен конец буфера» для очень специфических входных данных
Перепишите код объявления переменной C++ через AST
У меня проблема с помещением информации в файл типа json
Почему GCC пересылает аргументы этого векторного конструктора конструктору содержащегося типа, а Clang — нет?
Что определяет, будет ли двоичный файл, скомпилированный с помощью MinGW, иметь доступ к API Win32 или API POSIX?
Загрузка артефакта символов, созданного PublishSymbols@2, из графического интерфейса Azure DevOps невозможна
Почему Boost уделяет особое внимание потокобезопасности для отдельных объектов?