HarmonyOS APP开发中的应用启动:UIAbility 冷热温启动与启动优化全攻略

举报
Jack20 发表于 2026/06/20 18:25:26 2026/06/20
【摘要】 HarmonyOS APP开发中的应用启动:UIAbility 冷热温启动与启动优化全攻略📌 核心要点:深入理解 UIAbility 冷启动/热启动/温启动三种模式的原理差异,掌握启动链路追踪与启动帧分析方法,实现毫秒级启动优化。 一、背景与动机你有没有这样的体验:点开一个应用,盯着白屏转圈圈,心里默默倒数"3、2、1……"还没出来,然后直接杀掉进程?用户对启动速度的容忍度极低——Goo...

HarmonyOS APP开发中的应用启动:UIAbility 冷热温启动与启动优化全攻略

📌 核心要点:深入理解 UIAbility 冷启动/热启动/温启动三种模式的原理差异,掌握启动链路追踪与启动帧分析方法,实现毫秒级启动优化。


一、背景与动机

你有没有这样的体验:点开一个应用,盯着白屏转圈圈,心里默默倒数"3、2、1……"还没出来,然后直接杀掉进程?用户对启动速度的容忍度极低——Google 的研究表明,启动时间每增加 100ms,转化率下降 1.5%

在 HarmonyOS 中,应用启动并不是简单的"点一下就出来了"。它涉及进程创建、Application 初始化、UIAbility 生命周期、首帧渲染等多个环节。理解这些环节,就像理解一台汽车的启动过程——从点火到引擎运转到挂挡起步,每一步都有优化空间。

更关键的是,HarmonyOS 有三种启动模式:冷启动、热启动、温启动。它们的性能差异巨大,优化策略也截然不同。如果你只优化了冷启动,却忽视了温启动的"残留状态"问题,用户体验依然会大打折扣。


二、核心原理

2.1 三种启动模式

flowchart TB
    subgraph 冷启动[Cold Launch 冷启动]
        A1[点击应用图标] --> A2[创建应用进程]
        A2 --> A3[初始化Application]
        A3 --> A4[创建UIAbility实例]
        A4 --> A5[执行onCreate回调]
        A5 --> A6[执行onWindowStageCreate]
        A6 --> A7[加载首帧内容]
        A7 --> A8[首帧渲染完成]
    end
    
    subgraph 温启动[Warm Launch 温启动]
        B1[点击应用图标] --> B2[进程已存在]
        B2 --> B3[创建新UIAbility实例]
        B3 --> B4[执行onCreate回调]
        B4 --> B5[执行onWindowStageCreate]
        B5 --> B6[加载首帧内容]
        B6 --> B7[首帧渲染完成]
    end
    
    subgraph 热启动[Hot Launch 热启动]
        C1[从最近任务返回] --> C2[进程已存在]
        C2 --> C3[UIAbility实例已存在]
        C3 --> C4[执行onForeground回调]
        C4 --> C5[恢复UI状态]
        C5 --> C6[首帧渲染完成]
    end
    
    classDef primary fill:#4CAF50,stroke:#388E3C,color:#fff
    classDef warning fill:#FF9800,stroke:#F57C00,color:#fff
    classDef error fill:#F44336,stroke:#D32F2F,color:#fff
    classDef info fill:#2196F3,stroke:#1976D2,color:#fff
    classDef purple fill:#9C27B0,stroke:#7B1FA2,color:#fff
    
    class A1,A2,A3,A4,A5,A6,A7,A8 error
    class B1,B2,B3,B4,B5,B6,B7 warning
    class C1,C2,C3,C4,C5,C6 primary

三种启动对比

特征 冷启动 温启动 热启动
进程状态 不存在 已存在 已存在
Ability实例 需创建 需创建 已存在
执行回调 onCreate → onWindowStageCreate → onForeground onCreate → onWindowStageCreate → onForeground 仅 onForeground
耗时 最长(1-3秒) 中等(0.5-1秒) 最短(<200ms)
类比 冷车启动 热车起步 挂挡即走

2.2 UIAbility 生命周期与启动的关系

stateDiagram-v2
    [*] --> Created: 冷启动/温启动
    Created --> WindowStageCreated: onWindowStageCreate
    WindowStageCreated --> Foregrounded: onForeground
    Foregrounded --> Backgrounded: onBackground
    Backgrounded --> Foregrounded: 热启动 onForeground
    Backgrounded --> Destroyed: 系统回收/用户关闭
    Foregrounded --> Destroyed: 用户关闭
    WindowStageCreated --> Destroyed: 异常
    
    note right of Created: onCreate: 初始化数据
    note right of WindowStageCreated: 加载UI内容
    note right of Foregrounded: 可见可交互
    note right of Backgrounded: 保存状态

2.3 启动链路分析

启动链路可以拆解为以下几个关键阶段:

用户点击 → 进程创建 → Application.onCreate → UIAbility.onCreate 
→ UIAbility.onWindowStageCreate → 首帧布局 → 首帧绘制 → 首帧上屏

每个阶段的耗时决定了整体启动速度。优化的核心思路是:把非必要的操作从关键路径上移走,延迟到首帧渲染之后执行


三、代码实战

3.1 UIAbility 启动全生命周期监控

import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG = '[LaunchMonitor]';
const DOMAIN = 0x0001;

export default class LaunchMonitorAbility extends UIAbility {
  // 启动计时器
  private launchStartTime: number = 0;
  private phaseTimings: Map<string, number> = new Map();

  /**
   * 记录阶段开始时间
   */
  private markStart(phase: string) {
    this.phaseTimings.set(`${phase}_start`, Date.now());
    hilog.info(DOMAIN, TAG, `${phase} 开始`);
  }

  /**
   * 记录阶段结束时间并计算耗时
   */
  private markEnd(phase: string) {
    const startTime = this.phaseTimings.get(`${phase}_start`) || 0;
    const duration = Date.now() - startTime;
    this.phaseTimings.set(`${phase}_duration`, duration);
    hilog.info(DOMAIN, TAG, `${phase} 完成,耗时: ${duration}ms`);
  }

  /**
   * onCreate 回调 - 冷启动/温启动时触发
   * 这是启动链路的第一步,只做最核心的初始化
   */
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    this.launchStartTime = Date.now();
    this.markStart('onCreate');

    // 判断启动类型
    const launchReason = launchParam.launchReason;
    hilog.info(DOMAIN, TAG, `启动原因: ${launchReason}`);

    // ⚠️ 只做核心初始化,不要在这里做耗时操作!
    // 核心数据初始化(必须同步完成)
    this.initCoreData();

    this.markEnd('onCreate');
  }

  /**
   * onWindowStageCreate 回调 - 窗口阶段创建
   * 在这里加载UI内容
   */
  onWindowStageCreate(windowStage: window.WindowStage): void {
    this.markStart('onWindowStageCreate');

    // 设置窗口属性(优化首帧体验)
    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(DOMAIN, TAG, `加载内容失败: ${JSON.stringify(err)}`);
        return;
      }
      this.markEnd('onWindowStageCreate');
      this.markEnd('TotalLaunch');
      
      // 输出完整启动链路报告
      this.printLaunchReport();
    });
  }

  /**
   * onForeground 回调 - 热启动时触发
   * 从后台回到前台
   */
  onForeground(): void {
    this.markStart('onForeground');
    
    // 恢复UI状态、刷新数据
    this.restoreUIState();
    
    this.markEnd('onForeground');
  }

  /**
   * onBackground 回调 - 进入后台
   * 保存状态、释放资源
   */
  onBackground(): void {
    this.markStart('onBackground');
    
    // 保存当前UI状态
    this.saveUIState();
    
    // 释放非必要资源(图片缓存、动画等)
    this.releaseNonEssentialResources();
    
    this.markEnd('onBackground');
  }

  /**
   * 核心数据初始化 - 仅初始化首帧必需的数据
   */
  private initCoreData() {
    // 初始化全局状态管理
    // 初始化必要的配置
    // ⚠️ 网络请求、数据库查询等IO操作不要放在这里!
  }

  /**
   * 输出启动链路报告
   */
  private printLaunchReport() {
    hilog.info(DOMAIN, TAG, '===== 启动链路报告 =====');
    const phases = ['onCreate', 'onWindowStageCreate', 'TotalLaunch'];
    phases.forEach(phase => {
      const duration = this.phaseTimings.get(`${phase}_duration`) || 0;
      hilog.info(DOMAIN, TAG, `${phase}: ${duration}ms`);
    });
    hilog.info(DOMAIN, TAG, '========================');
  }

  /**
   * 保存UI状态(进入后台时调用)
   */
  private saveUIState() {
    // 保存滚动位置、输入框内容、选中状态等
    hilog.info(DOMAIN, TAG, 'UI状态已保存');
  }

  /**
   * 恢复UI状态(热启动时调用)
   */
  private restoreUIState() {
    // 恢复之前保存的UI状态
    hilog.info(DOMAIN, TAG, 'UI状态已恢复');
  }

  /**
   * 释放非必要资源
   */
  private releaseNonEssentialResources() {
    // 释放图片缓存、停止动画、暂停定时器等
    hilog.info(DOMAIN, TAG, '非必要资源已释放');
  }
}

3.2 启动优化:延迟加载与任务调度

import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';

/**
 * 任务优先级枚举
 */
enum TaskPriority {
  HIGH = 0,    // 首帧必需,同步执行
  MEDIUM = 1,  // 首帧后执行,影响交互体验
  LOW = 2      // 可延迟执行,不影响交互
}

/**
 * 延迟任务定义
 */
interface DelayedTask {
  name: string;
  priority: TaskPriority;
  execute: () => void;
}

/**
 * 启动任务调度器
 * 将启动阶段的任务按优先级分批执行
 */
export class LaunchTaskScheduler {
  private static instance: LaunchTaskScheduler;
  private taskQueue: DelayedTask[] = [];
  private isFirstFrameRendered: boolean = false;

  static getInstance(): LaunchTaskScheduler {
    if (!LaunchTaskScheduler.instance) {
      LaunchTaskScheduler.instance = new LaunchTaskScheduler();
    }
    return LaunchTaskScheduler.instance;
  }

  /**
   * 注册延迟任务
   */
  registerTask(name: string, priority: TaskPriority, execute: () => void) {
    this.taskQueue.push({ name, priority, execute });
  }

  /**
   * 执行高优先级任务(首帧前同步执行)
   */
  executeHighPriorityTasks() {
    const highTasks = this.taskQueue
      .filter(task => task.priority === TaskPriority.HIGH)
      .sort((a, b) => a.priority - b.priority);

    highTasks.forEach(task => {
      console.info(`[LaunchScheduler] 执行高优任务: ${task.name}`);
      task.execute();
    });
  }

  /**
   * 首帧渲染后执行中低优先级任务
   */
  executePostFrameTasks() {
    if (this.isFirstFrameRendered) return;
    this.isFirstFrameRendered = true;

    // 中优先级任务:首帧后立即执行
    const mediumTasks = this.taskQueue
      .filter(task => task.priority === TaskPriority.MEDIUM);

    mediumTasks.forEach(task => {
      console.info(`[LaunchScheduler] 执行中优任务: ${task.name}`);
      task.execute();
    });

    // 低优先级任务:延迟执行
    setTimeout(() => {
      const lowTasks = this.taskQueue
        .filter(task => task.priority === TaskPriority.LOW);

      lowTasks.forEach(task => {
        console.info(`[LaunchScheduler] 执行低优任务: ${task.name}`);
        task.execute();
      });
    }, 1000); // 延迟1秒执行
  }
}

// ============ 优化后的 Ability ============

export default class OptimizedLaunchAbility extends UIAbility {
  private scheduler: LaunchTaskScheduler = LaunchTaskScheduler.getInstance();

  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 注册各优先级任务
    this.registerLaunchTasks();

    // 只执行高优先级任务(首帧必需)
    this.scheduler.executeHighPriorityTasks();
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    windowStage.loadContent('pages/Index', (err) => {
      if (!err.code) {
        // 首帧渲染完成后执行中低优先级任务
        this.scheduler.executePostFrameTasks();
      }
    });
  }

  /**
   * 注册启动阶段的所有任务
   */
  private registerLaunchTasks() {
    // 🔴 高优先级:首帧必需
    this.scheduler.registerTask('初始化全局状态', TaskPriority.HIGH, () => {
      // 初始化AppStorage等全局状态
    });

    this.scheduler.registerTask('加载首屏数据模型', TaskPriority.HIGH, () => {
      // 加载首屏需要的数据模型
    });

    // 🟡 中优先级:首帧后立即执行
    this.scheduler.registerTask('初始化网络SDK', TaskPriority.MEDIUM, () => {
      // 初始化HTTP客户端、WebSocket等
    });

    this.scheduler.registerTask('预加载配置', TaskPriority.MEDIUM, () => {
      // 加载远程配置、AB实验等
    });

    this.scheduler.registerTask('初始化推送服务', TaskPriority.MEDIUM, () => {
      // 注册推送Token
    });

    // 🟢 低优先级:可延迟执行
    this.scheduler.registerTask('上报启动事件', TaskPriority.LOW, () => {
      // 埋点上报
    });

    this.scheduler.registerTask('预加载图片缓存', TaskPriority.LOW, () => {
      // 预加载常用图片
    });

    this.scheduler.registerTask('检查更新', TaskPriority.LOW, () => {
      // 检查应用版本更新
    });
  }
}

3.3 启动帧分析与首帧优化页面

import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';

@Entry
@Component
struct LaunchOptimizationPage {
  // 启动阶段耗时数据
  @State launchPhases: LaunchPhase[] = [];
  @State totalDuration: number = 0;
  @State coldLaunchTime: string = '未测量';
  @State warmLaunchTime: string = '未测量';
  @State hotLaunchTime: string = '未测量';

  aboutToAppear() {
    this.simulateLaunchAnalysis();
  }

  /**
   * 模拟启动链路分析
   * 实际项目中应使用 HiTrace 真实采集
   */
  simulateLaunchAnalysis() {
    // 模拟各阶段耗时数据
    this.launchPhases = [
      { name: '进程创建', duration: 120, color: '#F44336' },
      { name: 'Application.onCreate', duration: 85, color: '#FF9800' },
      { name: 'UIAbility.onCreate', duration: 45, color: '#FFC107' },
      { name: 'onWindowStageCreate', duration: 60, color: '#4CAF50' },
      { name: '首帧布局', duration: 35, color: '#2196F3' },
      { name: '首帧绘制', duration: 25, color: '#9C27B0' },
      { name: '首帧上屏', duration: 15, color: '#00BCD4' }
    ];

    this.totalDuration = this.launchPhases.reduce((sum, phase) => sum + phase.duration, 0);

    // 模拟三种启动耗时
    this.coldLaunchTime = `${this.totalDuration}ms`;
    this.warmLaunchTime = `${this.totalDuration - 120}ms`;
    this.hotLaunchTime = '45ms';
  }

  build() {
    Scroll() {
      Column() {
        // 标题
        Text('启动帧分析')
          .fontSize(24)
          .fontWeight(FontWeight.Bold)
          .margin({ bottom: 24 })

        // 三种启动模式耗时对比
        Row({ space: 12 }) {
          this.LaunchTimeCard('冷启动', this.coldLaunchTime, '#F44336')
          this.LaunchTimeCard('温启动', this.warmLaunchTime, '#FF9800')
          this.LaunchTimeCard('热启动', this.hotLaunchTime, '#4CAF50')
        }
        .width('100%')
        .margin({ bottom: 24 })

        // 启动链路瀑布图
        Text('启动链路瀑布图')
          .fontSize(18)
          .fontWeight(FontWeight.Medium)
          .margin({ bottom: 12 })

        Column({ space: 8 }) {
          ForEach(this.launchPhases, (phase: LaunchPhase) => {
            this.PhaseBar(phase)
          })
        }
        .width('100%')
        .margin({ bottom: 24 })

        // 总耗时
        Row() {
          Text('总耗时')
            .fontSize(16)
            .fontColor('#666666')
          Text(`${this.totalDuration}ms`)
            .fontSize(20)
            .fontWeight(FontWeight.Bold)
            .fontColor('#333333')
        }
        .width('100%')
        .justifyContent(FlexAlign.SpaceBetween)
        .padding(16)
        .backgroundColor('#F5F5F5')
        .borderRadius(8)
        .margin({ bottom: 24 })

        // 优化建议
        Text('优化建议')
          .fontSize(18)
          .fontWeight(FontWeight.Medium)
          .margin({ bottom: 12 })

        this.OptimizationTip('进程创建阶段', '无法优化,由系统控制', true)
        this.OptimizationTip('Application.onCreate', '延迟非必要初始化到首帧后', false)
        this.OptimizationTip('UIAbility.onCreate', '仅保留核心数据初始化', false)
        this.OptimizationTip('首帧布局', '减少嵌套层级,使用懒加载', false)
        this.OptimizationTip('首帧绘制', '避免复杂动画和渐变效果', false)
      }
      .padding(16)
    }
    .width('100%')
    .height('100%')
  }

  @Builder
  LaunchTimeCard(title: string, time: string, color: string) {
    Column() {
      Text(title)
        .fontSize(12)
        .fontColor('#999999')
        .margin({ bottom: 8 })
      Text(time)
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .fontColor(color)
    }
    .layoutWeight(1)
    .padding(12)
    .backgroundColor('#F5F5F5')
    .borderRadius(8)
    .alignItems(HorizontalAlign.Center)
  }

  @Builder
  PhaseBar(phase: LaunchPhase) {
    Row() {
      Text(phase.name)
        .fontSize(12)
        .fontColor('#666666')
        .width(120)
      
      // 进度条
      Row() {
        Row()
          .width(`${(phase.duration / this.totalDuration) * 100}%`)
          .height('100%')
          .backgroundColor(phase.color)
          .borderRadius(4)
      }
      .width('100%')
      .height(20)
      .backgroundColor('#EEEEEE')
      .borderRadius(4)
      .layoutWeight(1)
      
      Text(`${phase.duration}ms`)
        .fontSize(12)
        .fontColor('#333333')
        .width(60)
        .textAlign(TextAlign.End)
    }
    .width('100%')
  }

  @Builder
  OptimizationTip(phase: string, tip: string, isSystem: boolean) {
    Row() {
      Column() {
        Text(phase)
          .fontSize(14)
          .fontWeight(FontWeight.Medium)
          .fontColor('#333333')
        Text(tip)
          .fontSize(12)
          .fontColor(isSystem ? '#999999' : '#4CAF50')
          .margin({ top: 4 })
      }
      .alignItems(HorizontalAlign.Start)
      .layoutWeight(1)

      if (isSystem) {
        Text('系统控制')
          .fontSize(10)
          .fontColor('#999999')
          .padding({ left: 8, right: 8, top: 4, bottom: 4 })
          .backgroundColor('#F5F5F5')
          .borderRadius(4)
      } else {
        Text('可优化')
          .fontSize(10)
          .fontColor('#4CAF50')
          .padding({ left: 8, right: 8, top: 4, bottom: 4 })
          .backgroundColor('#E8F5E9')
          .borderRadius(4)
      }
    }
    .width('100%')
    .padding(12)
    .backgroundColor('#FAFAFA')
    .borderRadius(8)
    .margin({ bottom: 8 })
  }
}

/**
 * 启动阶段数据模型
 */
interface LaunchPhase {
  name: string;
  duration: number;
  color: string;
}

四、踩坑与注意事项

4.1 onCreate 中做耗时操作的灾难

这是最常见的启动优化反面教材:

// ❌ 绝对不要这样做!
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  // 同步读取大文件
  const data = fs.readTextSync('/data/large_config.json');
  // 同步网络请求(虽然不支持,但有人用定时器模拟同步)
  // 同步数据库查询
  const result = relationalStore.querySync(predicates);
}

后果:onCreate 被阻塞,整个启动链路卡死,用户看到的是长时间白屏。

4.2 loadContent 的回调陷阱

windowStage.loadContent 的回调并不等于首帧渲染完成。它只是内容加载完成,实际首帧上屏可能还有延迟。如果需要精确测量首帧时间,应该使用 onAreaChangeonAppear 回调。

4.3 热启动的状态残留问题

热启动时,UIAbility 实例还在内存中,所有状态都保留着。但问题在于——后台期间数据可能已经过期

// ✅ 热启动时检查数据新鲜度
onForeground(): void {
  const timeSinceBackground = Date.now() - this.backgroundTime;
  // 如果后台超过5分钟,刷新数据
  if (timeSinceBackground > 5 * 60 * 1000) {
    this.refreshData();
  }
}

4.4 多 Ability 的启动竞争

一个应用可能有多个 UIAbility(比如主界面和分享界面)。当应用被其他应用调起时,系统可能创建新的 Ability 实例而不是复用已有的。这会导致温启动而非热启动,性能大打折扣。

解决方案:合理配置 launchType

  • singleton:单实例,始终复用(适合主界面)
  • multiton:多实例,每次新建(适合分享页面)
  • specified:指定实例,由开发者决定是否复用

4.5 启动页(Splash Screen)的正确用法

HarmonyOS 5.0+ 支持在 module.json5 中配置启动页:

{
  "abilities": [{
    "startWindowIcon": "$media:splash_icon",
    "startWindowBackground": "$color:splash_bg"
  }]
}

注意:启动页是系统渲染的,不经过你的代码。它只是给用户一个视觉反馈,告诉你"应用正在启动"。不要把启动页当作加载页来使用——真正的数据加载应该在首帧渲染后异步进行。


五、HarmonyOS 6 适配

5.1 启动性能新指标

HarmonyOS 6 引入了更精细的启动性能指标:

指标 含义 目标值
TTFB (Time To First Byte) 首字节时间 < 500ms
FCP (First Contentful Paint) 首次内容绘制 < 1s
TTI (Time To Interactive) 可交互时间 < 1.5s

5.2 HiTrace 启动链路追踪

HarmonyOS 6 强化了 HiTrace 在启动链路追踪中的能力:

import { hiTraceMeter } from '@kit.PerformanceAnalysisKit';

// 在关键节点打点
onCreate(): void {
  hiTraceMeter.startTrace('ability_onCreate', 1);
  // ... 初始化逻辑
  hiTraceMeter.finishTrace('ability_onCreate', 1);
}

5.3 启动框架(Startup)新特性

HarmonyOS 6 新增了 Startup 框架,支持声明式的启动任务配置:

import { StartupTask } from '@kit.AbilityKit';

@StartupTask
export class InitNetworkTask {
  // 系统自动调度,支持依赖关系配置
  async run() {
    // 初始化网络SDK
  }
}

六、总结

mindmap
  root((应用启动))
    三种启动模式
      冷启动
        进程不存在
        完整生命周期
        耗时最长
      温启动
        进程已存在
        新建Ability实例
        耗时中等
      热启动
        实例已存在
        仅onForeground
        耗时最短
    启动链路
      进程创建
      Application.onCreate
      UIAbility.onCreate
      onWindowStageCreate
      首帧渲染
    优化策略
      延迟加载
        高//低优先级
        首帧后执行
      任务调度
        LaunchTaskScheduler
        分批执行
      状态管理
        热启动数据刷新
        后台资源释放
    踩坑
      onCreate不做耗时操作
      loadContent回调≠首帧
      热启动数据过期
      launchType选择
    HarmonyOS 6
      TTFB/FCP/TTI指标
      HiTrace链路追踪
      Startup框架

核心知识点回顾

  1. 三种启动模式:冷启动(全链路)、温启动(省进程创建)、热启动(仅 onForeground),优化策略各不相同
  2. 启动链路:进程创建 → Application.onCreate → UIAbility.onCreate → onWindowStageCreate → 首帧渲染,每个环节都有优化空间
  3. 延迟加载:将任务按高/中/低优先级分批执行,高优同步、中优首帧后、低优延迟
  4. 热启动陷阱:数据可能过期,需要根据后台时长决定是否刷新
  5. launchType 选择:singleton 复用实例(热启动)、multiton 新建实例(温启动)
  6. HarmonyOS 6 新增:Startup 框架支持声明式启动任务配置,HiTrace 链路追踪更精细

启动优化是一个持续的过程,不是一次性的工作。每次新增功能都要审视它对启动链路的影响,把非必要的操作从关键路径上移走,才能保持应用的"秒开"体验。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。