我正在开发一个 react-native 应用程序,我注意到生产构建中有一个奇怪的错误。平均而言,在 7 个客户端安装中,其中一个从一开始就冻结了。
我评论了几乎所有的代码库以丢弃可能的 javascript 错误,我只留下了一个带有计时器的 useEffect:
- 使用 a 将时间戳写入 logcat
console.log
- 设置状态以使用时间戳更新 UI
<Text>{timestamp}</Text>
。
当应用程序挂起时(在 5 或 6 次尝试后),setState 不会更新 UI,无论如何我可以在控制台上看到时间戳。
到目前为止,我已经尝试过:
- 检查日志,没有明显的错误或崩溃
- javascript线程似乎还活着,我可以编写一些代码并将一些输出写入logcat。
- UI 线程似乎还活着,如果我放置一个滚动视图,即使应用程序被冻结,我也可以滚动(我知道滚动在 UI 线程上运行)
- 我检查了超载 MessageQueue 的桥接消息
'react-native/Libraries/BatchedBridge/MessageQueue.js'
,我认为这里有一个线索:
当 UI 被冻结时,我能够看到 javascript 如何发送 RCTRawText 更新:
2021-09-18 00:54:46.334 7082-7269/? I/ReactNativeJS:
{ type: 1,
module: '58',
method: 22,
args: [ 9, 'RCTRawText',{ text: 'Sat Sep 18 2021 00:54:46 GMT-0300' } ]
}
但 RCTRawText 更新并未反映在本机视图上。
我还使用了systrace
from android build-tools 来捕获系统跟踪,我发现:
- 当应用程序正常运行时, UI 线程中会调用
Choreographer#doFrame
、和。animation
traversal
draw
- 当应用程序被冻结时,只有调用
Choreographer#doFrame
和animation
。(这让我认为缺少绘图调用)
我知道没有足够的数据来查找错误,但也许有人知道为什么即使消息已发送到网桥也不更新 UI。
很感谢任何形式的帮助