You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt Quick安卓应用高API模拟器多次启动后显示空白屏问题

Qt Quick安卓应用API>24模拟器二次启动空白屏问题

问题描述

基于Qt Quick开发的安卓应用,在API>24(Android 7.0及以上)的模拟器上出现异常:构建、部署流程正常,但仅首次启动可用;点击返回、主页按钮退出应用,或直接关闭应用后再次打开,仅显示空白屏。该问题需重装应用或清除缓存才能恢复。

真机运行无此问题,Android Studio构建的项目、基于Qt Widgets的应用均能正常运行。

环境信息

  • Ubuntu 22.04
  • 项目:Qt Creator创建的默认模板项目,仅在main.qml中添加红色矩形,基于Qt 5.15 + CMake构建
  • 模拟器:Android Studio提供的API 28(Android 9.0)Pixel XL模拟器

已尝试方案

  • 更换不同模拟器及API版本(仅Android 7.0模拟器可正常运行)
  • 分别通过Qt Creator部署、手动安装APK,问题均未改善

可疑日志(二次启动后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.

原因分析

这是Qt 5.15版本在安卓API>24模拟器上的生命周期兼容性问题:

  1. Android 7.0(API24)后优化了后台进程管理机制,而Qt 5.15默认的Activity生命周期处理逻辑未适配该机制,导致应用退出后,Qt的Native进程未完全销毁,残留的资源占用了窗口通道。
  2. 二次启动时,新的Activity尝试创建窗口通道,与残留进程的资源发生冲突,引发InputDispatcher报错,系统最终强制杀死应用进程,导致空白屏。
  3. Qt Widgets底层渲染和生命周期逻辑与Qt Quick不同,未触发该冲突;真机上系统对后台进程的清理更彻底,残留进程会被及时回收,因此无此问题。

解决方案

1. 强制进程完全退出(快速修复)

修改安卓端代码,确保应用退出时销毁所有相关进程:

  • 自定义QtActivity子类,重写onDestroy方法调用System.exit(0):
public class CustomQtActivity extends QtActivity {
    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.exit(0);
    }
}
  • 在AndroidManifest.xml中,将默认的org.qtproject.qt5.android.bindings.QtActivity替换为自定义的CustomQtActivity。

或者直接在AndroidManifest.xml的<activity>标签内添加属性:

android:finishOnTaskLaunch="true"

2. 升级Qt版本(根治方案)

Qt 5.15的早期版本存在安卓模拟器兼容性bug,升级到Qt 5.15.10及以上补丁版本,或直接迁移到Qt 6.x系列版本,官方已修复此类生命周期相关的模拟器适配问题。

3. 调整模拟器设置

关闭模拟器的「保存状态」功能,每次启动模拟器选择冷启动,避免残留的系统状态影响应用进程的销毁与重建。


内容的提问来源于stack exchange,提问作者nst1911

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:08:22