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模拟器上的生命周期兼容性问题:
- Android 7.0(API24)后优化了后台进程管理机制,而Qt 5.15默认的Activity生命周期处理逻辑未适配该机制,导致应用退出后,Qt的Native进程未完全销毁,残留的资源占用了窗口通道。
- 二次启动时,新的Activity尝试创建窗口通道,与残留进程的资源发生冲突,引发InputDispatcher报错,系统最终强制杀死应用进程,导致空白屏。
- 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
相关产品推荐
相关产品推荐

