as

Settings
Sign out
Notifications
Alexa
亚马逊应用商店
AWS
文档
Support
Contact Us
My Cases
新手入门
设计和开发
应用发布
参考
支持

有关应用性能问题的常见问题解答

有关应用性能问题的常见问题解答

选择您希望进一步了解的主题:

如何修复常见的电视应用性能问题视频

该视频涵盖了以下性能问题:

  • 应用启动速度慢
  • 滚动速度慢
  • 按键延迟
  • 应用内存问题

应用启动

应用启动性能会直接影响用户体验。应用启动速度慢会让用户产生挫败感,并导致用户抛弃该应用。在开发期间进行代码优化,可缩短应用启动时间。

导致该问题的常见原因包括:

  1. JavaScript (JS) Bundle较大。
  2. 应用启动期间发生较高的网络请求延迟。

问: 为什么应用启动性能很重要?

答: 应用启动性能很重要,因为它会影响用户体验。启动过慢会给人留下不好的第一印象,并可能导致用户放弃。有关详细信息,请参阅衡量您的应用KPI

问: 衡量应用启动性能的关键指标是什么?

答: 衡量应用启动性能的关键指标包括:

  1. 第一帧时间 (TTFF)。
  2. 首次绘制时间 (TTFD)。

    有关详细信息,请参阅应用KPI指标和指南

问: 我的应用可以在哪些情况下启动?

答: 应用启动存在于以下场景中:

  1. 冷启动 - 应用从头开始启动
  2. 热启动 - 应用从后台恢复

    有关详细信息,请参阅启动场景

问: 有哪些工具可用于衡量启动性能?

答: 使用以下工具来衡量您的应用启动性能:

  1. Vega应用KPI可视化工具(首选方法)。

    有关详细信息,请参阅衡量应用KPI

  2. 使用Perfetto进行跟踪分析。

    有关详细信息,请参阅检查跟踪

问: TTFD测量的可靠性如何?

答: TTFD精度取决于是否使用useReportFullyDrawn挂钩正确放置fully_drawn标记。有关详细信息,请参阅完全绘制的标记

问: 应用启动缓慢的原因是什么?

答: 应用启动缓慢的主要原因包括:

  1. 网络延迟。
  2. 繁忙的JS线程。
  3. 繁重的用户界面组件。
  4. 重新渲染过多。
  5. 未优化的列表配置。
  6. JS Bundle较大。
  7. 图像处理效率低下。
  8. 缺少Native SplashScreen。

问: 如何提高应用启动性能?

答: 您可以使用以下解决方案提高应用启动性能:

  1. 实现Native SplashScreen API。

    有关详细信息,请参阅SplashScreen Manager(仅提供英文版)。

  2. 优化图像的使用和大小。

    有关详细信息,请参阅Image组件

  3. 尽量减少不必要的重新渲染。

    有关详细信息,请参阅避免重新渲染和重新定义

  4. 以最佳方式配置列表组件。

    有关详细信息,请参阅如何处理大型列表

  5. 减小JS Bundle的大小。

    有关详细信息,请参阅减小Bundle大小

  6. 使用高效的图像缓存。

答: 您可以使用网络代理调试与网络相关的启动问题,以调查调用、比较多个测试迭代以及分析服务器响应时间和数据量。有关详细信息,请参阅使用网络代理监控流量

问: 如何识别JS线程问题?

答: 您可以使用以下方法识别JS线程问题:

  1. 用于自定义标记的RN Systrace JS API。

    有关详细信息,请参阅检查跟踪

  2. 启动模式CPU分析器。

    有关详细信息,请参阅运行启动模式记录

  3. 线程状态可视化工具。

    有关详细信息,请参阅了解线程状态

  4. why-did-you-render (wdyr) 工具。

    有关详细信息,请参阅调查组件重新渲染问题

问: 当JavaScript线程被阻塞8秒以上时,我该如何诊断这种类型的崩溃?

答: 当JS线程处于阻塞状态8秒以上时,系统会终止应用。您可以通过检查聚合崩溃报告 (ACR) 来解决问题。按照在Vega Studio中调试应用崩溃中的说明进行操作。

以下条目证实了被阻塞的JSThread导致了崩溃。

LCM_ANR_THREAD_NAME: JSThread
LCM_ANR_REASON: Thread Monitor

您可以使用JavaScript模式对崩溃文件进行符号化,以识别崩溃前的JS执行状态。如果您的代码涉及Turbo模块调用,请在原生模式下进行符号化。按照在Vega Studio中调试应用崩溃中针对原生模式符号化的说明进行操作。

滚动速度慢

滚动速度慢或滚动时出现卡顿是常见的用户界面 (UI) 性能问题,会影响列表导航的流畅度。流畅的滚动应保持稳定的帧速率,避免在用户浏览内容时出现画面卡顿或延迟。

导致该问题的常见原因包括:

  1. 列表渲染效率低下。
  2. 在JS线程上进行高强度计算。
  3. 列表项目布局复杂。
  4. 图像或媒体内容较大。
  5. 滚动期间的重新渲染次数过多。

问: 如何调查滚动速度慢的问题?

答: 可以使用以下工具来检测滚动速度慢的问题:

  1. Vega应用KPI可视化工具,可测量和跟踪用户界面流畅度百分比KPI。

    有关详细信息,请参见衡量流畅度和前台内存

  2. JS CPU分析,可识别JS线程中花费更多时间的常用函数和代码。

    有关详细信息,请参阅监控CPU使用情况

  3. Flashlight可跟踪应用使用的所有线程的CPU利用率,这些线程包括: JS线程、用户界面线程和渲染线程。

    有关详细信息,请参阅使用Flashlight监控活动

  4. JS线程状态可视化,可跟踪应用的JS线程、用户界面线程和渲染线程的线程状态。

    有关详细信息,请参阅了解线程状态

  5. React DevTools分析器。

    有关详细信息,请参阅使用React DevTools检查组件渲染

  6. why-did-you-render (wdyr) 工具。

    有关详细信息,请参阅调查组件重新渲染问题

问: 如何缓解滚动速度慢的问题?

答: 可以实施以下优化策略:

  1. 避免不必要的重新渲染。

    有关详细信息,请参阅避免重新渲染和重新定义

  2. 使用经过优化的列表: (FlatListFlashlistCarousel)。

  3. 优化图像。

    有关详细信息,请参阅Image组件

  4. 减少过度绘制。

    有关详细信息,请参见检测过度绘制

  5. 遵循动画最佳实践

  6. 实现防抖功能以延迟执行。防抖功能只有在输入停止后,才会执行函数。

    • 搜索输入: 在键入结束后处理
    • 窗口大小调整: 在大小稳定后更新
  7. 通过节流功能让时间间隔保持一致。节流功能可限制函数调用,使其遵循固定的时间间隔。

    • 滚动处理程序: 定期更新位置
    • 实时更新: 按设定的时间间隔刷新数据
    • 实时过滤器: 定期处理输入

示例:


import debounce from "lodash/debounce";
import throttle from "lodash/throttle";

const SearchWithLodash = () => {
// 经过防抖处理的搜索
const debouncedSearch = useCallback(
debounce((query) => {
fetchSearchResults(query);
}, 300),
[],
);

// 经过节流处理的滚动处理程序
const throttledScroll = useCallback(
throttle(() => {
// 处理滚动
}, 100),
[],
);

return (
<View>
<TextInput onChangeText={debouncedSearch} />
</View>
);
};

按键操作延迟

按键延迟衡量的是按下电视遥控器按钮与应用做出响应之间的延迟。电视用户在使用遥控器进行导航时希望获得即时反馈,因此该指标对于用户体验非常重要。

导致该问题的常见原因包括:

  1. JavaScript线程繁忙。

    • 在JS线程上进行高强度计算(动画、同步操作)
    • 不必要的组件重新渲染
    • 事件处理效率低下
  2. JS线程饥饿。

    • 操作系统中其他应用和进程的CPU使用率较高
    • 后台任务干扰

问: 如何调查按键延迟问题?

答: 可以使用以下工具来检测按键延迟问题:

  1. JS线程状态可视化,可跟踪应用的JS线程、用户界面线程和渲染线程的线程状态。

    有关详细信息,请参阅了解线程状态

  2. JS CPU分析,可识别性能瓶颈。

    有关详细信息,请参阅监控CPU使用情况

  3. React DevTools分析器。

    有关详细信息,请参阅使用React DevTools检查组件渲染

  4. why-did-you-render (wdyr) 工具。

    有关详细信息,请参阅调查组件重新渲染问题

问: 如何缓解按键延迟问题?

答: 可以实施以下优化策略:

  1. 使用TVEventHandler
  2. 优化焦点管理。

    有关详细信息,请参阅优化您的焦点管理用户界面

  3. 避免不必要的重新渲染。

    有关详细信息,请参阅避免重新渲染和重新定义

  4. 实现防抖功能或节流功能。

    有关详细信息,请参阅滚动速度慢

应用内存不足

Vega平台可优化内存,以并行运行多个应用和系统服务,确保无缝的用户体验。该平台可强制实施严格的内存限制:

  • 前台应用: 420Mb
  • 后台应用: 150Mb

当应用超出这些限制时,系统会触发低内存终止 (LMK) 事件,导致应用崩溃并破坏用户体验。由于JS线程会在垃圾回收 (GC) 周期上花费更多时间,因此内存使用率较高也会导致应用运行速度变慢。为了保持稳定流畅的用户体验,请务必采取以下重要措施:

  • 监控应用的内存使用情况
  • 识别消耗最多内存的对象
  • 消除不必要的内存分配

问: 如何调查内存问题?

答: 可以使用以下工具来检测内存问题:

  1. Memory Monitor - 跟踪Vega应用的实时内存使用情况,显示应用接近或超出内存限制的时间点。

    有关详细信息,请参阅使用Memory Monitor检查您的应用

  2. Chrome DevTools (CDT) - 分析JavaScript内存消耗,通过堆快照和分配时间线帮助识别内存泄漏。

    有关详细信息,请参阅使用Chrome DevTools进行应用分析

  3. Memlab - 通过比较不同用户流的堆快照来识别内存泄漏。

    有关详细信息,请参阅分析JavaScript堆快照

  4. Vega应用KPI可视化工具 - 帮助监控内存KPI,例如前台内存和后台内存。

    有关详细信息,请参阅衡量应用KPI

问: 如何缓解内存问题?

答: 可以实施以下优化策略:

  1. 清理计时器和侦听器。

    有关详细信息,请参阅侦听器、事件订阅和计时器

  2. 防止闭包作用域泄露。

    一些闭包保留了对大型对象的引用,此类闭包会导致内存泄漏。垃圾回收器无法释放这些对象,从而导致内存累积。定期进行清理可确保垃圾回收器能够释放未使用的内存。

    示例:

    function leakyFunction() {
    const bigArray = new Array(1000000).fill(0);
    return function () {
    
    // bigArray被闭包隐式捕获
    console.log("Hello, World!");
    };
    }
    
    leakyFunction(); // 即使不再需要bigArray,它也会保留在内存
    

Last updated: 2025年9月30日