问题描述
OpenHarmony某应用点击多次或者页面切换时,会出现应用闪退现象。
问题现象
1.打印提示Crash,每次Crash的进程一致,均是Process name:com.chinasoftinc.launcher, 线程却不确定,mosquitto loop、jsThread-1随机出现;
2.Crash的时机不确定,页面点击次数累计一定程序出现,native不回调JS function时不会出现Crash,JS function代码量多时,则Crash概率大,代码量小时,Crash概率小。
mosquitto loop、jsThread-1 二者crash随机出现
mosquitto loop crash:
jsThread-1 crash:
Crash报错的其中两次堆栈信息如下,可以看到两次堆栈信息并不一致:
问题分析
虽然每次crash的线程不一样,但范围是确定的,jsThread-1 或者 mosquitto loop,可以确定是两个线程交互的问题。
jsThread-1为UI线程,即应用页面对应的线程;
mosquitto loop是用来监听mosquitto服务器是否有消息上来,有则触发JS Function回调函数;
JS为单线程,没有锁,严格意义上不支持多线程,线程间的调度需要使用ArkUI统一的调度函数uv_queue_work来处理多线程调度问题。
如果不使用统一调度函数,会发生下面两种异常情况:
- jsThread-1线程运行时,mosquitto loop消息上来直接触发回调,会导致jsThread-1异常退出;
- mosquitto loop处理回调时,jsThread-1可能直接抢占处理,导致mosquitto loop异常退出。
问题冲突
Napi 提供了创建新线程的方法:napi_get_uv_event_loop,但只能在JS主线程中使用,uv_queue_work只能处理napi_get_uv_event_loop创建的线程,不支持mosquitto loop方式;
若要监听消息,只能用mosquitto loop起新线程监听。
解决方案
问题本质原因是调用回调函数时出的问题:
监听消息的线程可以正常处理,与JS线程无冲突。
修改方案为:保留mosquitto loop获取消息,触发C处理消息上来事件,将原有消息事件处理中 直接调用napi_call_function 的方式改为 napi_get_uv_event_loop方式创建新的线程,uv_queue_work队列方式管理新线程调度,在新线程中调用napi_call_function。
消息事件处理函数:
新线程中处理JS Function回调:
至此,crash问题得到解决。
希望本文能够为应用开发者处理类似crash问题提供帮助。
我这边特意整理了《鸿蒙语法ArkTS、TypeScript、ArkUI、实战开发视频教程》以及《鸿蒙生态应用开发白皮书V2.0PDF》《鸿蒙开发学习手册》(共计890页)鸿蒙开发资料等…希望对大家有所帮助:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
鸿蒙语法ArkTS、TypeScript、ArkUI等…视频教程:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
OpenHarmony APP开发教程步骤:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
鸿蒙生态应用开发白皮书V2.0PDF:https://docs.qq.com/doc/DZVVkRGRUd3pHSnFG
应用开发中级就业技术:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
应用开发中高级就业技术:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
南北双向高工技能基础:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
全网首发-工业级 南向设备开发就业技术:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
《鸿蒙开发学习手册》:
如何快速入门:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
1.基本概念
2.构建第一个ArkTS应用
3.……
开发基础知识:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……
基于ArkTS 开发:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……