HarmonyOS 鸿蒙Next APP_INPUT_BLOCK 崩溃用户响应无反应如何进行代码检查

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next APP_INPUT_BLOCK 崩溃用户响应无反应如何进行代码检查 APP_INPUT_BLOCK 崩溃用户响应无反应如何进行代码检查,判断当前是否发生无响应和无响应的原因。崩溃日志可查看附件

2 回复

您可参考该文档先自检下,看能否解决您的问题呢?

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/appfreeze-guidelines-V5#应用无响应检测能力点

trace日志获取方法
hdc file recv /data/log/hitrace D:\

您可以通过下面方法抓取trace日志:

这个是smartperf的下载地址
https://gitee.com/openharmony/developtools_smartperf_host/releases

这个是使用方法
https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/device-test/smartperf-host.md

demo分析结果

【问题原因】

  1. 应用异常原因:主线程被持续占用超过5s或6s,系统检测机制触发APP_INPUT_BLOCK或THREAD_BLOCK_6S。详细参考:
    https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/appfreeze-guidelines-V5#应用无响应检测能力点

  2. 主线程持续占用原因:demo代码点击按钮时调用initVulkan()drawRect(),且运行在主线程中,除正常第一次initVulkan(),第2次开始每次耗时3s,持续点击按钮时3s持续累积,导致主线程卡死。实际复现时建议用usleep(310001000)代替initVulkan()drawRect(),demo中的initVulkan()drawRect()本身重复调用可能会有调用栈。

【解决方案】

执行耗时操作时使用异步工作模式,避免阻塞主线程,demo已修改为异步,实测未出现奔溃。修改方式:删除原代码中PluginRender::NapiDrawRectangle函数,替换为以下代码。详细参考:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/use-napi-asynchronous-task-0000001820880437

struct CallbackData {
    napi_async_work asyncWork = nullptr;
}

void ExecuteCB(napi_env env, void *data) {
    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "PluginRender", "NapiDrawRectangle");
    // 3s模拟耗时
    usleep(3*1000*1000);
    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "PluginRender", "render->m_eglCore->Draw() executed");
}

void CompleteCB(napi_env env, napi_status status, void *data)
{
    CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
    napi_delete_async_work(env, callbackData->asyncWork);
    delete callbackData;
}

napi_value PluginRender::NapiDrawRectangle(napi_env env, napi_callback_info info) {
    auto asyncContext = new CallbackData();
    napi_value resourceName = nullptr;
    napi_create_string_utf8(env, "asyncWorkCallback", NAPI_AUTO_LENGTH, &resourceName);
    // 创建异步任务
    napi_create_async_work(env, nullptr, resourceName, ExecuteCB, CompleteCB,
                           asyncContext, &asyncContext->asyncWork);
    // 将异步任务加入队列
    napi_queue_async_work(env, asyncContext->asyncWork);
    return nullptr;
}

更多关于HarmonyOS 鸿蒙Next APP_INPUT_BLOCK 崩溃用户响应无反应如何进行代码检查的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS鸿蒙系统中APP_INPUT_BLOCK导致的崩溃及用户无响应问题,代码检查可以从以下几个方面进行:

  1. 输入事件处理逻辑:检查应用中处理输入事件(如触摸、按键等)的代码逻辑,确保没有死循环或长时间阻塞操作。特别是事件分发和处理部分,需保证高效执行。

  2. 线程管理:确认是否在主线程(UI线程)中执行了耗时操作。鸿蒙系统对主线程的操作有严格的时间限制,超时可能导致ANR(Application Not Responding)。

  3. 资源占用:检查应用是否占用了过多CPU或内存资源,特别是在处理输入事件时。资源不足可能导致系统无法及时响应输入。

  4. 日志分析:查看崩溃日志和系统日志,分析崩溃前后的系统状态和应用行为,寻找可能导致崩溃的线索。

  5. 第三方库和组件:如果使用了第三方库或组件处理输入事件,确保它们兼容当前鸿蒙系统版本,并检查其是否有已知问题。

  6. 系统兼容性:测试应用在不同鸿蒙系统版本上的表现,确保兼容性。

进行上述检查后,若问题依旧存在,可能是更深层次的系统或硬件问题。此时,建议联系鸿蒙系统官方客服获取进一步支持。官网客服地址:https://www.itying.com/category-93-b0.html

回到顶部