HarmonyOS 鸿蒙Next APP_INPUT_BLOCK 崩溃用户响应无反应如何进行代码检查
HarmonyOS 鸿蒙Next APP_INPUT_BLOCK 崩溃用户响应无反应如何进行代码检查 APP_INPUT_BLOCK 崩溃用户响应无反应如何进行代码检查,判断当前是否发生无响应和无响应的原因。崩溃日志可查看附件
您可参考该文档先自检下,看能否解决您的问题呢?
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分析结果
【问题原因】
-
应用异常原因:主线程被持续占用超过5s或6s,系统检测机制触发APP_INPUT_BLOCK或THREAD_BLOCK_6S。详细参考:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/appfreeze-guidelines-V5#应用无响应检测能力点 -
主线程持续占用原因: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导致的崩溃及用户无响应问题,代码检查可以从以下几个方面进行:
-
输入事件处理逻辑:检查应用中处理输入事件(如触摸、按键等)的代码逻辑,确保没有死循环或长时间阻塞操作。特别是事件分发和处理部分,需保证高效执行。
-
线程管理:确认是否在主线程(UI线程)中执行了耗时操作。鸿蒙系统对主线程的操作有严格的时间限制,超时可能导致ANR(Application Not Responding)。
-
资源占用:检查应用是否占用了过多CPU或内存资源,特别是在处理输入事件时。资源不足可能导致系统无法及时响应输入。
-
日志分析:查看崩溃日志和系统日志,分析崩溃前后的系统状态和应用行为,寻找可能导致崩溃的线索。
-
第三方库和组件:如果使用了第三方库或组件处理输入事件,确保它们兼容当前鸿蒙系统版本,并检查其是否有已知问题。
-
系统兼容性:测试应用在不同鸿蒙系统版本上的表现,确保兼容性。
进行上述检查后,若问题依旧存在,可能是更深层次的系统或硬件问题。此时,建议联系鸿蒙系统官方客服获取进一步支持。官网客服地址:https://www.itying.com/category-93-b0.html