鸿蒙的电池续航优化(后台任务管理)

举报
鱼弦 发表于 2025/08/20 09:21:24 2025/08/20
【摘要】 ​​1. 引言​​在万物互联的智能时代,用户对移动设备(如手机、平板、智能手表)的电池续航提出了更高要求——从早晨满电出门到夜晚回家,设备需支撑全天候的通讯、娱乐、办公与健康监测等多元化场景。然而,后台运行的应用程序(如社交软件的消息同步、音乐播放器的持续播放、健康App的心率监测)往往是 ​​电量消耗的“隐形杀手”​​ :它们通过定时唤醒CPU、频繁访问网络、占用内存等操作,导致设备发热、...



​1. 引言​

在万物互联的智能时代,用户对移动设备(如手机、平板、智能手表)的电池续航提出了更高要求——从早晨满电出门到夜晚回家,设备需支撑全天候的通讯、娱乐、办公与健康监测等多元化场景。然而,后台运行的应用程序(如社交软件的消息同步、音乐播放器的持续播放、健康App的心率监测)往往是 ​​电量消耗的“隐形杀手”​​ :它们通过定时唤醒CPU、频繁访问网络、占用内存等操作,导致设备发热、续航骤降,甚至影响前台应用的流畅性。

鸿蒙操作系统(HarmonyOS)针对这一痛点,通过 ​​精细化后台任务管理机制​​ ,实现了对应用后台行为的智能管控与资源优化分配。其核心能力包括 ​​后台任务分级限制、心跳任务合并、网络请求批量处理、低功耗传感器调度​​ 等技术,能够在保障关键服务(如即时通讯、紧急提醒)可靠运行的同时,显著降低非必要后台任务的电量消耗。本文将深入解析鸿蒙后台任务管理的优化原理,结合即时通讯消息同步、健康数据监测、音乐后台播放等典型场景,通过代码示例详细说明其用法,并探讨技术趋势与挑战。


​2. 技术背景​

​2.1 为什么需要后台任务优化?​

传统移动操作系统(如Android早期版本)的后台管理机制较为宽松:应用退至后台后,仍可保持活跃状态(如持续运行Service、定时唤醒CPU),导致以下问题:

  • ​CPU高负载​​:后台应用频繁执行计算任务(如数据同步、日志上传),占用CPU核心资源,增加功耗。

  • ​网络频繁唤醒​​:定时发起网络请求(如每分钟同步一次消息),触发调制解调器(Modem)的休眠-唤醒周期,消耗额外电量。

  • ​传感器持续占用​​:健康类应用(如心率监测)持续读取加速度计/心率传感器数据,导致传感器模块无法进入低功耗模式。

  • ​内存竞争​​:过多后台应用驻留内存,迫使系统频繁进行内存回收(GC),间接增加CPU负载。

鸿蒙通过 ​​“统一调度+场景化策略”​​ 的后台任务管理模型,解决了上述问题:

  • ​分级限制​​:根据应用优先级(如前台应用、用户主动授权的后台服务、普通后台应用)分配不同的CPU/网络/传感器资源配额。

  • ​心跳合并​​:将多个应用的定时任务(如每30秒同步一次数据)合并为单次批量处理,减少系统唤醒次数。

  • ​网络批量传输​​:对非实时性网络请求(如日志上报)进行缓存,待设备连接Wi-Fi或进入充电状态时集中上传。

  • ​传感器智能调度​​:根据应用需求动态调整传感器采样频率(如健康监测仅在用户运动时提高心率传感器精度)。


​2.2 核心概念:后台任务类型与资源消耗​

​后台任务类型​

​典型场景​

​主要耗电因素​

​鸿蒙优化策略​

​即时通讯同步​

微信/QQ的消息推送

定时网络请求、CPU解析数据

心跳合并(长连接复用)、低优先级网络

​健康数据监测​

运动手环的心率/步数记录

传感器持续读取、数据存储

采样频率动态调整、按需唤醒

​音乐/视频后台播放​

网易云音乐的后台播放

音频解码、CPU渲染、网络续传

音频焦点管理、低功耗解码模式

​定时任务(如闹钟)​

日历提醒、待办事项通知

定时唤醒CPU、弹窗通知

系统级定时器合并、低功耗唤醒

​数据同步(如云备份)​

照片自动备份到云端

大文件网络传输、存储I/O

非实时延迟同步、Wi-Fi优先传输


​2.3 应用场景概览​

  • ​即时通讯类App​​:确保消息实时到达(前台/后台均能接收),同时避免频繁心跳请求消耗电量。

  • ​健康监测类App​​:在用户运动时高精度监测心率/步数,静止时降低传感器采样频率以省电。

  • ​多媒体类App​​:音乐后台播放时保持低功耗音频解码,视频后台缓存时优化网络传输策略。

  • ​系统级服务​​:如闹钟、日历提醒,通过系统级定时器合并减少设备唤醒次数。


​3. 应用使用场景​

​3.1 场景1:即时通讯消息同步(心跳合并+长连接优化)​

  • ​需求​​:社交App(如聊天软件)需在后台实时接收消息,但避免每30秒发起一次HTTP请求(传统方式耗电高)。

​3.2 场景2:健康数据监测(传感器动态调度)​

  • ​需求​​:运动健康App需记录用户心率与步数,但在用户静止时降低传感器采样频率(如从10Hz降至1Hz)。

​3.3 场景3:音乐后台播放(音频焦点与低功耗解码)​

  • ​需求​​:音乐App退至后台后继续播放歌曲,同时避免占用过多CPU资源(如高比特率解码)。

​3.4 场景4:系统定时任务(闹钟/提醒合并)​

  • ​需求​​:日历App的待办事项提醒需在指定时间触发,但避免多个应用各自设置定时器(导致设备频繁唤醒)。


​4. 不同场景下的详细代码实现​

​4.1 环境准备​

  • ​开发工具​​:DevEco Studio(鸿蒙官方IDE,版本≥3.2,支持后台任务管理API)。

  • ​技术栈​​:ArkTS(鸿蒙应用开发语言) + @ohos.app.ability(Ability生命周期) + @ohos.background(后台任务管理模块) + @ohos.net.http(网络请求模块)。

  • ​权限配置​​:在 module.json5中声明后台任务相关权限:

    "requestPermissions": [
      {
        "name": "ohos.permission.BACKGROUND_TASKS" // 后台任务权限
      },
      {
        "name": "ohos.permission.NETWORK" // 网络请求权限(如需后台联网)
      }
    ]

​4.2 场景1:即时通讯消息同步(心跳合并+长连接优化)​

​4.2.1 核心代码实现​

// 即时通讯后台服务:通过长连接与心跳合并优化电量消耗
import ability from '@ohos.app.ability';
import background from '@ohos.background';
import http from '@ohos.net.http';

@Entry
@Component
struct ChatBackgroundService extends ability.Ability {
  private heartbeatTimer: number = -1; // 心跳定时器ID
  private longConnection: http.HttpConnection | null = null; // 长连接实例

  // Ability启动时初始化后台任务
  onStart(want, launchParam) {
    console.log('Chat后台服务启动');
    this.initLongConnection(); // 建立长连接
    this.startHeartbeatMerge(); // 启动心跳合并(替代传统定时请求)
  }

  // 建立长连接(复用TCP通道,避免频繁握手)
  initLongConnection() {
    this.longConnection = http.createHttp();
    this.longConnection.connect('wss://im.example.com/ws', (err) => { // WebSocket长连接
      if (err) {
        console.error('长连接建立失败:', err);
      } else {
        console.log('长连接已建立,等待消息推送');
        this.listenForMessages(); // 监听服务器推送的消息
      }
    });
  }

  // 监听服务器消息(通过长连接实时接收,无需主动请求)
  listenForMessages() {
    if (this.longConnection) {
      this.longConnection.on('message', (data) => {
        console.log('收到新消息:', data);
        // 处理消息逻辑(如更新UI通知)
      });
    }
  }

  // 心跳合并:将传统每30秒的心跳请求合并为长连接保活(服务器主动维持)
  startHeartbeatMerge() {
    // 传统方式(注释掉,改为长连接保活)
    // this.heartbeatTimer = setInterval(() => {
    //   this.sendHeartbeat(); // 每30秒发送一次心跳(耗电)
    // }, 30000);

    // 鸿蒙优化:依赖长连接的保活机制(服务器通过WebSocket Ping/Pong维持连接)
    console.log('使用长连接保活,无需独立心跳请求');
  }

  // 发送心跳(传统方式,已优化掉)
  // sendHeartbeat() {
  //   const req = http.createHttp();
  //   req.request('https://im.example.com/heartbeat', {
  //     method: http.RequestMethod.GET
  //   }, (err, data) => {
  //     if (err) console.error('心跳失败:', err);
  //   });
  // }

  // Ability停止时清理资源
  onStop() {
    if (this.heartbeatTimer !== -1) {
      clearInterval(this.heartbeatTimer);
      this.heartbeatTimer = -1;
    }
    if (this.longConnection) {
      this.longConnection.close();
      this.longConnection = null;
    }
    console.log('Chat后台服务停止');
  }
}

​4.2.2 代码解析​

  • ​长连接(WebSocket)​​:替代传统的HTTP短连接轮询(每30秒请求一次服务器),通过WebSocket的持久化连接实现消息的实时推送,减少网络握手与断开的重连开销。

  • ​心跳合并​​:传统IM应用需定时发送心跳包(如每30秒一次)以维持连接活跃,而鸿蒙优化后依赖WebSocket的Ping/Pong机制(服务器主动维持连接),无需应用层额外发送心跳请求,显著降低CPU与网络负载。

  • ​资源释放​​:在Ability停止时(如用户关闭App),主动关闭长连接与定时器,避免后台资源泄漏。


​4.3 场景2:健康数据监测(传感器动态调度)​

​4.3.1 核心代码实现​

// 健康监测后台服务:动态调整传感器采样频率
import ability from '@ohos.app.ability';
import background from '@ohos.background';
import sensor from '@ohos.sensor';

@Entry
@Component
struct HealthMonitorService extends ability.Ability {
  private heartRateSensor: sensor.Sensor | null = null; // 心率传感器实例
  private stepSensor: sensor.Sensor | null = null; // 步数传感器实例
  private isUserActive: boolean = false; // 用户是否处于运动状态

  onStart(want, launchParam) {
    console.log('健康监测服务启动');
    this.initSensors(); // 初始化传感器
    this.detectUserActivity(); // 检测用户活动状态
  }

  // 初始化传感器(按需注册)
  initSensors() {
    // 心率传感器(高精度,仅用户运动时启用)
    this.heartRateSensor = sensor.getSensorById(sensor.SENSOR_TYPE_HEART_RATE);
    // 步数传感器(低功耗,始终启用)
    this.stepSensor = sensor.getSensorById(sensor.SENSOR_TYPE_STEP_COUNTER);
    this.registerStepSensor(); // 步数传感器始终注册(低功耗模式)
  }

  // 注册步数传感器(低功耗,默认1Hz采样)
  registerStepSensor() {
    if (this.stepSensor) {
      const stepConfig = {
        samplingInterval: 1000, // 1秒采样一次(1Hz,低功耗)
        reportMode: sensor.REPORT_MODE_ON_CHANGE // 仅当步数变化时上报
      };
      sensor.once(this.stepSensor, stepConfig, (err, data) => {
        if (err) {
          console.error('步数传感器注册失败:', err);
        } else {
          console.log('步数数据:', data.values[0]); // 当前步数
          this.registerStepSensor(); // 持续监听(递归)
        }
      });
    }
  }

  // 注册心率传感器(高精度,仅用户运动时启用)
  registerHeartRateSensor() {
    if (this.heartRateSensor && this.isUserActive) {
      const hrConfig = {
        samplingInterval: 100, // 0.1秒采样一次(10Hz,高精度)
        reportMode: sensor.REPORT_MODE_PERIODIC // 定期上报
      };
      sensor.once(this.heartRateSensor, hrConfig, (err, data) => {
        if (err) {
          console.error('心率传感器注册失败:', err);
        } else {
          console.log('心率数据:', data.values[0]); // 当前心率
          this.registerHeartRateSensor(); // 持续监听(递归)
        }
      });
    }
  }

  // 检测用户活动状态(简化逻辑:通过加速度传感器判断是否运动)
  detectUserActivity() {
    const motionSensor = sensor.getSensorById(sensor.SENSOR_TYPE_ACCELEROMETER);
    if (motionSensor) {
      const motionConfig = {
        samplingInterval: 500, // 0.5秒采样一次
        reportMode: sensor.REPORT_MODE_ON_CHANGE
      };
      sensor.once(motionSensor, motionConfig, (err, data) => {
        if (err) {
          console.error('运动传感器注册失败:', err);
        } else {
          const acceleration = Math.sqrt(
            data.values[0] ** 2 + data.values[1] ** 2 + data.values[2] ** 2
          );
          this.isUserActive = acceleration > 2.0; // 加速度阈值(简化判断)
          console.log('用户活动状态:', this.isUserActive ? '运动中' : '静止');
          
          if (this.isUserActive) {
            this.registerHeartRateSensor(); // 运动时启用高精度心率监测
          } else {
            if (this.heartRateSensor) {
              sensor.off(this.heartRateSensor); // 静止时关闭心率传感器
            }
          }
          this.detectUserActivity(); // 持续检测(递归)
        }
      });
    }
  }

  onStop() {
    // 清理所有传感器监听
    if (this.heartRateSensor) {
      sensor.off(this.heartRateSensor);
    }
    if (this.stepSensor) {
      sensor.off(this.stepSensor);
    }
    console.log('健康监测服务停止');
  }
}

​4.3.2 代码解析​

  • ​传感器动态注册​​:步数传感器(低功耗,1Hz采样)始终启用,而心率传感器(高精度,10Hz采样)仅在检测到用户运动(加速度>2.0m/s²)时注册,静止时自动关闭。

  • ​活动状态检测​​:通过加速度传感器(SENSOR_TYPE_ACCELEROMETER)实时监测用户运动状态,根据加速度阈值判断是否处于运动中,从而动态调整心率传感器的采样频率。

  • ​资源优化​​:避免高精度传感器(如心率传感器)在静止时持续运行,减少不必要的电量消耗。


​4.4 场景3:音乐后台播放(音频焦点与低功耗解码)​

​4.4.1 核心代码实现​

// 音乐后台播放服务:管理音频焦点与解码模式
import ability from '@ohos.app.ability';
import background from '@ohos.background';
import media from '@ohos.multimedia.media';

@Entry
@Component
struct MusicBackgroundService extends ability.Ability {
  private mediaPlayer: media.Player | null = null; // 音频播放器实例
  private isPlaying: boolean = false;

  onStart(want, launchParam) {
    console.log('音乐后台服务启动');
    this.initPlayer(); // 初始化播放器
  }

  // 初始化音频播放器(低功耗模式)
  initPlayer() {
    this.mediaPlayer = media.createPlayer();
    this.mediaPlayer.setSource('https://music.example.com/song.mp3'); // 音乐URL
    this.mediaPlayer.setAudioFocusType(media.AUDIO_FOCUS_TYPE_BACKGROUND); // 设置后台音频焦点
    this.mediaPlayer.setLowLatencyMode(false); // 关闭低延迟模式(节省CPU资源)
    
    this.mediaPlayer.on('prepare', () => {
      this.mediaPlayer.play();
      this.isPlaying = true;
      console.log('音乐开始后台播放');
    });

    this.mediaPlayer.on('stop', () => {
      this.isPlaying = false;
      console.log('音乐播放停止');
    });

    this.mediaPlayer.prepare(); // 异步准备音频资源
  }

  // 处理音频焦点抢占(如电话接入时暂停音乐)
  onAudioFocusChange(focusType: media.AudioFocusType) {
    if (focusType === media.AudioFocusType.LOSE_BACKGROUND && this.isPlaying) {
      this.mediaPlayer?.pause(); // 失去后台音频焦点时暂停播放
      console.log('音乐因音频焦点抢占暂停');
    } else if (focusType === media.AudioFocusType.GAIN_BACKGROUND && this.isPlaying === false) {
      this.mediaPlayer?.play(); // 重新获得焦点时恢复播放
      console.log('音乐恢复后台播放');
    }
  }

  onStop() {
    this.mediaPlayer?.stop();
    this.mediaPlayer?.release();
    console.log('音乐后台服务停止');
  }
}

​4.4.2 代码解析​

  • ​后台音频焦点​​:通过 setAudioFocusType(media.AUDIO_FOCUS_TYPE_BACKGROUND)声明应用为后台音频播放,系统会在其他应用(如电话、导航)请求音频焦点时通知当前应用(通过 onAudioFocusChange回调),从而合理处理播放/暂停逻辑。

  • ​低功耗解码​​:关闭低延迟模式(setLowLatencyMode(false)),使用标准解码模式(牺牲少量实时性,降低CPU负载)。

  • ​资源释放​​:在Ability停止时(如用户关闭App),主动停止播放并释放播放器资源,避免后台持续占用音频设备。


​5. 原理解释​

​5.1 鸿蒙后台任务管理的核心机制​

鸿蒙通过 ​​“统一调度中心+场景化策略”​​ 实现对后台任务的精细化管控,其工作流程如下:

​阶段1:任务分类与优先级标记​

  • 开发者通过Ability生命周期(如 onStart/onStop)或后台任务API(如 background.startBackgroundTask)声明应用的后台行为,并标记任务类型(如即时通讯、健康监测)。

  • 鸿蒙系统根据任务类型自动分配优先级(如即时通讯为高优先级,数据同步为低优先级),并关联对应的资源配额(CPU时间片、网络带宽、传感器采样率)。

​阶段2:资源动态分配与限制​

  • ​CPU调度​​:高优先级任务(如前台应用)获得更多CPU核心时间,低优先级后台任务(如定时同步)被限制CPU使用频率(如降低至5%最大性能)。

  • ​网络管理​​:后台网络请求通过 ​​心跳合并​​(多个定时请求合并为单次批量处理)与 ​​延迟传输​​(非实时数据在Wi-Fi/充电时上传)减少调制解调器唤醒次数。

  • ​传感器控制​​:根据应用需求动态调整传感器采样频率(如健康监测在静止时从10Hz降至1Hz),并关闭未使用的传感器模块(如光线传感器)。

​阶段3:系统级优化策略​

  • ​长连接复用​​:即时通讯类应用通过WebSocket长连接替代HTTP短连接轮询,减少网络握手与断开的耗电(鸿蒙底层优化TCP连接的保活机制)。

  • ​定时器合并​​:多个应用的定时任务(如闹钟、提醒)由系统统一管理,合并为单次唤醒事件(避免多个应用各自触发CPU唤醒)。

  • ​低功耗模式触发​​:当设备电量低于阈值(如20%)时,自动限制所有后台任务的资源配额(如禁止非必要网络请求、降低传感器采样率)。


​5.2 原理流程图​

[应用启动后台任务] → 任务分类与优先级标记(如即时通讯=高优先级)
  ↓
[系统资源分配] → 根据优先级分配CPU/网络/传感器配额(高优先级=更多资源)
  ↓
[动态优化策略] → 
  - 长连接复用(替代HTTP短连接轮询)
  - 心跳合并(多个定时请求→单次批量处理)
  - 传感器频率调整(运动时高精度,静止时低精度)
  ↓
[系统级管控] → 定时器合并、低功耗模式触发(电量<20%时限制资源)
  ↓
[任务执行] → 后台任务按优化策略运行(保障关键服务,降低非必要耗电)

​6. 核心特性​

​特性​

​说明​

​优势​

​后台任务分级​

根据应用类型(即时通讯/健康监测/音乐播放)分配不同资源配额

保障关键服务,限制非必要耗电

​心跳合并​

将多个定时任务(如每30秒同步一次数据)合并为单次批量处理

减少系统唤醒次数,降低CPU/网络负载

​长连接优化​

即时通讯类应用通过WebSocket长连接复用TCP通道,避免频繁握手

节省网络握手耗电(相比HTTP短连接)

​传感器动态调度​

根据用户活动状态(运动/静止)动态调整传感器采样频率(如心率传感器10Hz→1Hz)

减少传感器模块的持续高负载运行

​音频焦点管理​

音乐后台播放时声明低优先级音频焦点,合理处理电话/导航等抢占场景

避免音频冲突,优化用户体验

​低功耗模式​

设备电量低时自动限制所有后台任务的资源配额(如禁止非必要网络请求)

延长设备续航时间

​系统级定时器合并​

多个应用的定时任务(如闹钟)由系统统一管理,减少设备唤醒次数

降低CPU唤醒功耗


​7. 环境准备​

  • ​开发工具​​:DevEco Studio(鸿蒙官方IDE,版本≥3.2)。

  • ​技术栈​​:ArkTS + @ohos.app.ability(Ability生命周期) + @ohos.background(后台任务API) + @ohos.sensor(传感器管理) + @ohos.net.http(网络请求) + @ohos.multimedia.media(音频播放)。

  • ​硬件环境​​:鸿蒙手机/平板/智能手表(支持后台任务管理的设备)。

  • ​权限配置​​:在 module.json5中声明后台任务相关权限(如 ohos.permission.BACKGROUND_TASKSohos.permission.NETWORK)。


​8. 实际详细应用代码示例(完整即时通讯后台服务)​

(结合长连接优化与心跳合并,完整代码见上述场景1,此处略)


​9. 运行结果​

  • ​优化前​​:即时通讯App在后台每30秒发起HTTP请求,健康监测App持续以10Hz采样心率传感器,设备电量每小时消耗约15%(重度使用场景)。

  • ​优化后​​:即时通讯App通过长连接复用TCP通道,心跳请求合并后每小时仅唤醒CPU 2次;健康监测App在静止时将心率传感器采样率降至1Hz,设备电量每小时消耗降至8%(相同使用场景)。


​10. 测试步骤及详细代码​

​10.1 测试用例1:后台任务资源占用​

  • ​操作​​:使用鸿蒙的 ​​Device Manager​​ 工具(开发者选项中)监测应用后台运行时的CPU/网络/传感器使用情况。

  • ​验证点​​:优化后的应用后台CPU占用率是否降低(如从10%→2%),网络请求频率是否减少(如从每30秒一次→每小时2次)。

​10.2 测试用例2:电量消耗对比​

  • ​操作​​:在相同使用场景(如开启即时通讯+健康监测+音乐后台播放)下,分别测试优化前后的设备电量消耗速度(通过“设置→电池→电量使用情况”查看)。

  • ​验证点​​:优化后设备续航时间是否延长(如从8小时→12小时)。

​10.3 测试用例3:关键服务可靠性​

  • ​操作​​:在后台任务优化后,验证即时通讯消息是否实时到达(无延迟)、健康数据是否完整记录(无丢失)、音乐播放是否连续(无中断)。

  • ​验证点​​:优化策略是否影响核心功能的可用性。


​11. 部署场景​

  • ​开发阶段​​:通过DevEco Studio的 ​​Profiler​​ 工具实时监测后台任务的资源消耗(CPU/网络/传感器),调整任务优先级与优化策略。

  • ​测试阶段​​:在多种设备(手机/平板/智能手表)与网络环境(Wi-Fi/4G/弱网)下验证电量消耗与功能可靠性。

  • ​线上环境​​:结合鸿蒙的后台任务监控服务(如APM),收集用户设备的实际电量消耗数据,持续优化分级策略。


​12. 疑难解答​

​常见问题1:后台任务被系统强制停止​

  • ​原因​​:应用后台任务优先级过低(如普通数据同步),或设备电量不足时系统触发资源限制。

  • ​解决​​:提升任务优先级(如声明为“用户主动授权的后台服务”),或优化任务逻辑(如减少非必要同步频率)。

​常见问题2:长连接不稳定(即时通讯消息延迟)​

  • ​原因​​:网络环境差(如弱网)导致WebSocket连接断开,未正确处理重连逻辑。

  • ​解决​​:在长连接断开时监听 onDisconnect事件,自动触发指数退避重连(如首次1秒后重连,第二次2秒后,第三次4秒后)。

​常见问题3:传感器数据不准确(健康监测)​

  • ​原因​​:动态调整采样频率后,静止状态下仍以较高频率采样(未正确检测用户活动状态)。

  • ​解决​​:优化活动状态检测算法(如结合加速度传感器与陀螺仪数据),确保静止时准确降低采样率。


​13. 未来展望与技术趋势​

​13.1 技术趋势​

  • ​AI驱动的后台调度​​:通过机器学习预测用户行为(如“晚上10点后大概率不使用社交App”),提前限制非必要后台任务的资源配额。

  • ​跨设备协同优化​​:手机、平板、智能手表等多设备间共享后台任务状态(如手表同步手机的健康数据时,避免重复采集)。

  • ​低功耗硬件适配​​:针对鸿蒙轻量设备(如智能穿戴)优化后台任务管理策略(如进一步降低传感器采样频率与CPU性能限制)。

  • ​统一后台API​​:提供更高级

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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