qt5 for 小米 android13 app熄屏唤醒假死

问题遇到的现象和发生背景

请教下qt5 for android 的app在小米android 13 上熄屏唤醒(或按电源键熄屏,再次按亮屏)时大概率 出现界面一直假死冻结现象,但app正常运行,adb log 显示正常输出,再次熄屏唤醒 或 在内存清理界面返回后 就恢复正常了。 以上唤醒假死现象有无好的解决办法?

操作环境、软件版本等信息

小米android 13 ;qt:5.12.9 小米平板android10 11 基本上没有这种现象,其他的鸿蒙有。

尝试过的解决方法

qt5创建一个简单新项目即可复现。
类似鸿蒙系统也有,它的新版本优化解决了:https://developer.huawei.com/consumer/cn/forum/topic/0203100906957773023

我想要达到的结果

熄屏唤醒后界面不会假死冻结。

根据你的描述,你的Qt应用程序在Android 13上在屏幕熄屏后唤醒时出现界面冻结的问题可能由多种原因导致。以下是一些可能的解决方案和排查步骤:

  1. 检查Qt的界面更新和渲染机制:在Android系统中,有个名为WindowManager的系统服务,它负责处理所有应用窗口的管理,包括窗口的显示、隐藏、大小、位置、透明度等等。如果Qt应用程序的界面更新或者渲染机制有问题,可能会导致这种现象。尝试更新你的Qt版本,或者改变界面更新和渲染的方式,例如使用异步更新等。
  2. 检查电源键的唤醒事件处理:电源键的唤醒事件处理可能存在问题。你需要确认你的应用程序是否正确地处理了电源键的唤醒事件。在处理这个事件时,如果你的应用程序在某些情况下无法正确处理或者延迟处理,可能会导致界面冻结。你应该检查你的唤醒事件处理代码,确保它能正确、及时地响应用户的操作。
  3. 检查后台线程和资源管理:如果你的应用程序在后台运行了一些复杂的线程或者大量消耗资源的操作,可能会导致系统负载过高,从而导致界面冻结。你应该检查你的应用程序的后台线程和资源管理策略,确保它们不会导致系统负载过高。
  4. 检查系统和应用程序的日志:你可以使用Android的系统日志工具(如logcat)来查看系统和应用程序的运行日志,以便找出导致界面冻结的原因。在日志中查找相关的错误信息或者异常信息,这可能会帮助你找到问题的原因。
  5. 使用调试工具进行深入排查:如果以上方法都无法解决问题,你可以使用一些调试工具进行深入排查。例如,你可以使用Android Studio的调试工具进行逐行调试,查看每一行代码执行时系统的状态和变化。

以上只是一些可能的解决方案和排查步骤,实际的情况可能更复杂。你需要根据你的应用程序的具体情况来选择合适的方法进行排查和解决。

可能的解决方案和建议:

检查应用程序的电源管理设置:Android系统的电源管理设置可能会影响应用程序的行为。你可以检查你的应用程序的电源管理设置,确保它们被正确配置。
检查应用程序的权限设置:Android 13加强了对隐私权限的管理。如果你的应用程序需要访问某些敏感权限(例如相机、麦克风、联系人等),你需要在应用程序的权限管理页面中明确声明。
更新Qt版本:Qt也一直在更新和优化,你可以尝试更新Qt到最新版本,看是否可以解决你的问题。
尝试在不同的Android设备上运行你的应用程序:如果可能的话,尝试在不同的Android设备(例如Android 10、Android 11、Android 13设备)上运行你的应用程序,看问题是否依然存在。这可以帮助你更好地确定问题是否与特定的设备或系统版本相关。
检查ADB日志输出:当你的应用程序出现冻结问题时,可以通过ADB命令行工具来查看应用程序的日志输出,看是否有任何异常或错误信息。

援引文心一言:
你遇到的问题可能与Android 13的某些更改有关,特别是与MIUI 13(小米的定制Android版本)的特定行为有关。一种可能的解决方案是尝试更新Qt的版本,因为Qt 5.12.9已经相对较旧,而Android 13在许多方面都与之前的Android版本有所不同。

此外,你可以考虑以下几点来尝试解决问题:

检查MIUI版本和开发者选项:确保你的MIUI版本是最新的,并且开发者选项中没有任何可能干扰应用程序的设置。
检查电池优化设置:在某些情况下,Android的电池优化设置可能会干扰后台应用程序的行为。确保你的应用程序没有被列入电池优化的例外列表。
检查应用程序的权限:确保应用程序具有所有必要的权限,特别是与屏幕唤醒和后台运行相关的权限。
尝试使用不同的启动模式:在AndroidManifest.xml中更改或尝试不同的启动模式,看看是否有助于解决问题。
分析日志:使用adb logcat命令并过滤与你的应用程序相关的日志。这可能会提供有关问题的更多详细信息。
检查Qt的Android插件:确保你正在使用的Qt Android插件是最新的,并且与你的Qt版本兼容。
考虑使用更新的Qt版本:如果可能的话,考虑升级到更新的Qt版本,因为Qt 5.12.9已经相对较旧。新版本可能已经解决了与Android 13兼容性的问题。
参考鸿蒙论坛:你提到的鸿蒙论坛帖子似乎提供了关于类似问题的解决方案。虽然Android和鸿蒙是不同的操作系统,但其中一些建议可能仍然适用。
如果以上建议都不能解决问题,你可能需要深入研究MIUI 13和Android 13的特定行为,并查找专门针对这些版本的解决方案。你还可以考虑向小米社区和Qt论坛求助,以获得更具体的支持和建议。

对于在小米Android 13设备上熄屏唤醒时出现界面假死冻结的问题,这可能是与设备的电源管理策略和后台应用处理有关。以下是一些可能的解决办法:

  1. 设置Wake Lock(唤醒锁):在AndroidManifest.xml文件中添加android:keepScreenOn="true"属性,以确保屏幕在应用程序活动期间保持唤醒状态。

  2. 处理生命周期事件:在Qt应用的活动和休眠周期中正确处理事件。当应用得到焦点时,确保界面可以正确地响应用户输入和操作。当应用失去焦点时,可以暂停或限制某些任务以减少资源消耗。

  3. 检查线程处理:确保你的应用程序在进行长时间运算或阻塞操作时,使用合适的线程管理方式,确保主线程不会被阻塞。可以考虑使用Qt的多线程功能,将计算任务和UI操作分离到不同的线程中。

  4. 检查电源管理设置:在设备的系统设置中,检查和调整电池管理和应用休眠策略。有时候系统默认会对应用进行限制,以节省电量和资源使用。你可以尝试将你的应用程序设为特例,并允许其在后台正常运行。

  5. 更新Qt版本:如果你在Qt 5.12.9版本上出现问题,可以尝试更新到最新版本的Qt,以获取更好的兼容性和修复已知的问题。

  6. 寻求厂商支持: 如果你的应用在小米Android 13设备上持续出现界面假死冻结的问题,你也可以尝试联系小米技术支持团队,反馈该问题,并了解是否有特定的适配需求或解决方案。

以上是一些可尝试的解决办法,但由于每个设备和环境的不同,可能需要进行一些针对性的调整和测试。建议你结合具体的日志信息和调试过程,逐个尝试这些方法,并根据实际情况进行相应的调整。

【以下回答由 GPT 生成】

对于在小米Android 13上使用Qt5开发的应用熄屏唤醒后界面假死冻结的问题,我目前没有确切的解决方案。通过您提供的信息,这可能是小米Android 13上的一个特定问题。我建议您考虑以下几种可能的解决方案:

  1. 更新Qt版本:首先,尝试将Qt版本升级到最新版本,以查看是否有任何已知的问题或修复与小米Android 13的兼容性问题。

  2. 检查小米Android 13的系统设置:请确保在小米Android 13上的系统设置中,针对应用的电源管理或后台限制等选项进行了适当的配置。有时候这些限制会导致应用在熄屏唤醒后出现异常情况。

  3. 与Qt开发社区交流:将问题提交到Qt开发社区的论坛或邮件列表中,寻求其他开发者的帮助和建议。他们可能已经遇到并解决过类似的问题,或者可以提供更详细的指导。

  4. 检查Android系统日志:通过使用adb logcat命令,可以查看小米Android 13系统的详细日志。尝试在应用熄屏唤醒后发生界面假死冻结时,检查日志是否显示相关的错误或警告信息。这可能有助于确定问题的根本原因。

无论您选择哪种解决方案,请务必在操作前备份您的代码和数据。这样可以最大限度地减少不确定因素并确保可以回滚到之前的状态。

如果以上解决方案都不能解决问题,我建议您联系小米技术支持或Qt的技术支持,以获取更专业的帮助和指导。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

结合GPT给出回答如下请题主参考
您好,这种问题可能是由于小米 Android 13 系统的某些特性或限制所导致的,而不是与 Qt5 for Android 直接相关的问题。

以下是一些可能的问题遇到的现象和发生背景:

  • 界面假死冻结现象:当您的应用在熄屏时被唤醒时,界面可能会出现假死或冻结,但应用本身仍在运行。
  • 大概率出现:这可能是因为某些特定情况下触发了问题,而您在测试时可能无法重现该问题。
  • 按电源键熄屏/再次按亮屏:这提示您可能是通过此方法来测试应用程序在熄屏和唤醒时的行为。

以下是一些可能的解决方案:

  • 如果您的应用程序在熄屏时不需要保持活动状态,则可以尝试使用“Partial Wake Locks”(部分唤醒锁定)来确保系统不会在您的应用程序进入后台时将其终止。请注意,这可能会影响设备的电池寿命。
  • 您还可以尝试在应用程序的代码中使用“Wake Locks”(唤醒锁定)来确保设备在应用程序正在运行时不会进入睡眠模式。请注意,这可能会影响设备的电池寿命。
  • 您还可以尝试更新 Qt5 和 Android SDK 工具包以确保其为最新版本。这可能会解决一些已知的问题。
  • 您还可以尝试使用其他设备来测试您的应用程序,以了解问题是否出现在特定设备上。

希望这些信息能够帮助您解决问题。如果您需要更多帮助,请提供更多详细信息,包括您使用的 Qt 版本和相关代码片段,以便更好地了解和解决此问题。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
针对在小米Android 13上使用Qt5开发的应用程序,在熄屏唤醒后出现界面假死冻结的问题,可以尝试以下解决方法:

  1. 更新Qt版本:确保使用的是最新版本的Qt,因为新版本可能修复了一些已知的问题。

  2. 启用硬件加速:在应用程序的配置文件(例如main.cpp)中添加以下代码,以启用硬件加速:

    QGuiApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
    
  3. 禁用动画效果:某些动画效果可能会导致应用程序在熄屏唤醒时出现假死冻结的问题。可以尝试禁用动画效果,或者将动画效果设置为立即执行模式。

  4. 优化内存管理:确保在应用程序中使用正确的内存管理技术,以避免内存泄漏或过度分配的问题。可以使用Qt提供的内存分析工具来检查内存使用情况,并及时释放不再需要的内存。

  5. 检查第三方库:如果应用程序使用了第三方库,确保这些库与Qt版本兼容,并且没有已知的兼容性问题。

  6. 适配小米Android 13特定的问题:由于你提到在其他鸿蒙系统上没有遇到这个问题,可能需要进一步调查小米Android 13上的特定问题,并查找相关的解决方案。

请注意,以上解决方法是一般性的建议,具体解决方法可能因应用程序的具体情况而异。如果问题仍然存在,建议查阅Qt官方文档、论坛或开发者社区,以获取更具体的帮助和支持。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

引用 皆我百晓生 小程序回复内容作答:
对于小米 Android 13 上的熄屏唤醒假死问题,你可以尝试以下解决办法:

  1. 检查你的应用是否正确处理了熄屏和唤醒事件。确保你的应用在熄屏后正确暂停相关任务,并在唤醒后正确恢复。

  2. 确保你的应用的后台服务在熄屏后继续正常运行。有些设备可能会限制后台服务的运行时间,你可以尝试使用前台服务来避免这个问题。

  3. 检查你的应用是否正确申请了后台运行的权限。在 AndroidManifest.xml 文件中添加以下权限声明:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    
  4. 尝试使用 WakeLock 来保持设备唤醒状态。在你的代码中添加以下代码:

    #include <QAndroidJniObject>
    ...
    QAndroidJniObject wakeLock = QAndroidJniObject::fromString("android.os.PowerManager:PARTIAL_WAKE_LOCK");
    QAndroidJniObject powerManager = QtAndroid::androidActivity().callObjectMethod("getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;", wakeLock.object<jstring>());
    jint screenDimWakeLock = QAndroidJniObject::getStaticField<jint>("android/os/PowerManager:SCREEN_DIM_WAKE_LOCK");
    QAndroidJniObject wakeLockObj = powerManager.callObjectMethod("newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;", screenDimWakeLock, wakeLock.object<jstring>());
    wakeLockObj.callMethod<void>("acquire");
    ...
    

    在不需要保持设备唤醒状态时,记得调用 wakeLockObj.callMethod<void>("release"); 来释放 WakeLock。

请注意,以上解决办法可能需要根据你的具体情况进行适当调整和修改。同时,建议你尽可能升级 Qt 和 Android 版本,以解决可能存在的相关问题。

估计去执行的时候,检查到什么设备有问题。

Android 应用程序的界面在进入后台或恢复到前台时可能会经历生命周期事件。确保您的 Qt 应用程序正确处理这些事件,以避免界面假死或冻结。您可以通过 Qt 的 QApplication 或 QGuiApplication 对象来捕获这些事件,然后采取适当的措施。

void MyApplication::applicationStateChanged(Qt::ApplicationState state) {
    if (state == Qt::ApplicationSuspended) {
        // 应用进入后台
    } else if (state == Qt::ApplicationActive) {
        // 应用恢复到前台
    }
}


解决Qt 5程序运行时界面假死的方法
在Qt 5的GUI程序中,主线程也叫GUI线程,因为它是唯一被允许执行GUI相关操作的线程。对于一些计算量比较大的非常耗时的操作,如果放在主线程中,就是出现界面无法响应的问题。这种问题的解决一种方式是,把这些耗时操作放到次线程中,还有一种比较简单的方法:在处理耗时操作中加入一个延时,并调用QCoreApplication::processEvents()。这个函数告诉Qt去处理那些还没有被处理的各类核心事件,然后再把控制权返还给调用者。QElapsedTimer的成员函数elapsed()函数会返回自上次启动QElapsedTimer以来的毫秒数。如下代码就是加入一个25毫秒的延时去处理核心事件。

#include <QElapsedTimer>
 
QElapsedTimer et;
et.start();
while(et.elapsed() < 25)
{
    QCoreApplication::processEvents();
}

该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。


这可能是某些小米设备在熄屏唤醒时存在的特殊问题。您可以尝试以下解决方案:

1.检查您的代码是否在熄屏唤醒时完成了一些费时的操作,例如读写文件、网络请求等。您可以尝试优化这些操作,让它们更加高效。

2.如果您的应用程序使用了特殊的权限,请确保您已经正确地处理了权限请求和回调,以避免出现问题。

3.尝试在AndroidManifest.xml文件中添加以下代码:

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

这将允许您的应用程序获得唤醒锁并且禁用键盘守卫。这样可能会解决您遇到的问题。

4.如果以上解决方案都无法解决问题,您可以尝试在应用程序中添加一些日志记录,以便更好地定位问题所在。您还可以考虑使用其他工具来调试和监视应用程序,例如Android Studio的Profiler工具。

希望这些解决方案能够帮助您解决问题。

:Android 13相较于其他版本有一些新的特性和改变,有可能影响到应用的运行。你可以考虑更新你的Qt库和Android SDK至最新版本,以适应Android 13的新特性。
:虽然你的adb log显示正常,但仍然可能是由于内存不足导致的假死现象。在内存清理界面返回后恢复正常,可能就是内存被释放后,应用重新获得足够的内存来运行。

Qt for Android(九) ——APP 崩溃卡死拉起保活实战_qt开发安卓app锁屏之后唤醒程序卡死_q2nAmor的博客-CSDN博客 这篇文章要基于前面的基础,我们才能继续下面的内容,建议阅读。Qt for Android(一) —— QT 中如何调用android方法Qt for Android(二) —— QT 中调用自定义Android方法详细教程(获取Android设备的SN号)背景首先,本文的案例环境基于一些特殊的 android 设备,比如瑞星微的RK系列,在该设备上不会熄屏,没有锁屏键,运行的应用也仅限于几个 APP,大部分不会存在应用被系统杀死的可能。应用拉起说白了就是进程保活,关于Android 的进程保活文章_qt开发安卓app锁屏之后唤醒程序卡死 https://blog.csdn.net/u012534831/article/details/112053811

参考gpt
针对您在小米Android 13上使用Qt5 for Android的应用在熄屏唤醒时出现假死冻结的现象,可能是由于系统的电源管理策略导致的。您可以尝试以下解决办法:

  1. 检查电源管理设置:在小米设备的设置中,找到电池和性能设置,检查是否启用了一些电池优化或后台限制策略。如果启用了这些策略,尝试将您的应用添加到白名单或关闭这些策略,以确保应用在熄屏唤醒时能够正常运行。

  2. 使用WakeLock:在您的Qt应用中,可以尝试使用WakeLock来保持设备唤醒状态。WakeLock是Android提供的一种机制,可以防止设备在特定条件下进入休眠状态。您可以在应用启动时请求WakeLock,并在不需要时释放它。这样可以确保设备在熄屏唤醒时保持唤醒状态,从而避免假死冻结的问题。

  3. 更新Qt版本:尝试升级到Qt的最新版本,以获取最新的修复和优化。有时候,特定的系统问题会在更新的Qt版本中得到修复。

  4. 参考厂商文档和社区:查阅小米设备的开发者文档、论坛或社区,了解是否有关于在Android 13上处理唤醒问题的特定指导或解决方案。厂商可能会提供一些定制的解决方案或建议。

请注意,由于我无法直接访问小米Android 13设备或Qt的源代码,上述建议仅供参考。对于特定的设备和环境,最好咨询相关的技术支持或专家,他们可能会提供更具体的解决方案或帮助您进一步诊断问题。

这篇博客写的很到位,希望能帮你解决问题https://blog.csdn.net/mj412828668/article/details/85321021