0

我正在开发一个 react-native 应用程序,我注意到生产构建中有一个奇怪的错误。平均而言,在 7 个客户端安装中,其中一个从一开始就冻结了。

我评论了几乎所有的代码库以丢弃可能的 javascript 错误,我只留下了一个带有计时器的 useEffect:

  • 使用 a 将时间戳写入 logcatconsole.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 更新并未反映在本机视图上。

我还使用了systracefrom android build-tools 来捕获系统跟踪,我发现:

  • 当应用程序正常运行时, UI 线程中会调用Choreographer#doFrame、和。animationtraversaldraw
  • 当应用程序被冻结时,只有调用Choreographer#doFrameanimation。(这让我认为缺少绘图调用)

我知道没有足够的数据来查找错误,但也许有人知道为什么即使消息已发送到网桥也不更新 UI。

很感谢任何形式的帮助

4

0 回答 0