分布式软总线:HarmonyOS开发设备发现与连接原理

举报
Jack20 发表于 2026/06/19 20:31:47 2026/06/19
【摘要】 分布式软总线:HarmonyOS开发设备发现与连接原理当你第一次听说"软总线"这个词时,可能会觉得有点抽象——总线不是硬件概念吗?怎么还"软"了?别急,这篇文章就带你深入理解HarmonyOS分布式软总线的核心原理,看看它是如何让不同设备像插在同一块主板上一样无缝通信的。 一、背景与动机:为什么需要软总线? 1.1 传统设备互联的痛点在IoT时代,设备互联已经成为刚需。但传统的连接方式存在...

分布式软总线:HarmonyOS开发设备发现与连接原理

当你第一次听说"软总线"这个词时,可能会觉得有点抽象——总线不是硬件概念吗?怎么还"软"了?别急,这篇文章就带你深入理解HarmonyOS分布式软总线的核心原理,看看它是如何让不同设备像插在同一块主板上一样无缝通信的。

一、背景与动机:为什么需要软总线?

1.1 传统设备互联的痛点

在IoT时代,设备互联已经成为刚需。但传统的连接方式存在诸多问题:

协议碎片化:蓝牙、Wi-Fi、Zigbee、NFC……每种协议都有自己的"小圈子",设备之间想对话,得先看"语言通不通"。你家的智能灯可能只支持Zigbee,而手机只有蓝牙和Wi-Fi,这就尴尬了。

连接复杂度高:传统蓝牙配对,你得打开设置、搜索设备、选择配对、输入PIN码、确认配对……一套流程下来,用户的耐心都快耗尽了。更别提Wi-Fi Direct那种"先握手再交换密钥再建立通道"的繁琐过程。

跨设备通信困难:即使设备连接上了,想实现真正的跨设备调用也非易事。你需要在应用层自己实现消息序列化、传输协议、错误重试、连接保活……这工作量,谁写谁知道。

1.2 HarmonyOS的解法:分布式软总线

HarmonyOS的分布式软总线,本质上是一个统一的设备通信抽象层。它就像一个"万能翻译官",屏蔽了底层各种通信协议的差异,为上层提供统一的设备发现、连接、数据传输能力。
图片.png

软总线的核心价值

  • 自动发现:设备上电后自动广播,其他设备自动感知,无需手动搜索
  • 自动连接:基于设备信任关系,自动选择最优通信通道建立连接
  • 统一接口:上层应用无需关心底层协议,一套API搞定所有通信场景
  • 智能切换:根据场景自动在蓝牙、Wi-Fi等通道间切换,保证最佳体验

二、核心原理:软总线是如何工作的?

2.1 设备发现机制

设备发现是软总线的第一步。HarmonyOS采用多协议协同发现策略,同时利用蓝牙BLE广播和Wi-Fi组播来最大化发现效率。

2.1.1 发现流程

sequenceDiagram
    participant DeviceA as 设备A(发起方)
    participant BLE as 蓝牙通道
    participant WiFi as Wi-Fi通道
    participant DeviceB as 设备B(被发现方)
    
    Note over DeviceA: 1. 启动发现服务
    DeviceA->>BLE: 开启BLE广播
    DeviceA->>WiFi: 加入组播组
    
    Note over DeviceB: 2. 监听广播
    DeviceB->>BLE: 扫描BLE广播
    DeviceB->>WiFi: 监听组播消息
    
    BLE-->>DeviceB: 收到设备A的广播包
    DeviceB->>DeviceB: 解析设备信息
    
    WiFi-->>DeviceB: 收到设备A的组播包
    DeviceB->>DeviceB: 合并设备信息
    
    DeviceB->>DeviceA: 发送设备响应
    DeviceA->>DeviceA: 更新设备列表
    
    classDef primary fill:#4A90E2,stroke:#2E5C8A,stroke-width:2px,color:#fff
    classDef warning fill:#F5A623,stroke:#C17A00,stroke-width:2px,color:#fff
    classDef info fill:#7ED321,stroke:#5BA315,stroke-width:2px,color:#fff
    
    class DeviceA,DeviceB primary
    class BLE,WiFi info

广播包内容:设备ID、设备类型、设备名称、支持的通信协议、认证能力等关键信息被编码进广播包。为了节省BLE广播的31字节限制,HarmonyOS采用了压缩编码+分包传输的策略。

2.1.2 发现模式

软总线支持三种发现模式:

模式 触发方式 发现范围 典型场景
被动发现 设备上线自动广播 周围所有设备 设备入网、即插即用
主动发现 应用调用发现接口 指定设备类型 设备选择器、功能触发
周期发现 定时刷新设备列表 缓存+增量更新 设备管理界面

2.2 连接建立机制

发现设备后,下一步是建立连接。软总线的连接建立采用多通道协商策略,自动选择最优通信路径。

2.2.1 连接选择策略

图片.png

通道优先级(从高到低):

  1. Wi-Fi P2P:带宽大、延迟低,适合大文件传输、屏幕投屏
  2. Wi-Fi STA + AP:利用现有Wi-Fi网络,适合家庭场景
  3. 蓝牙BR/EDR:功耗适中、连接稳定,适合音频传输、控制指令
  4. 蓝牙BLE:功耗最低,适合小数据包、心跳保活

2.2.2 连接状态机

// 连接状态定义
enum ConnectionState {
  STATE_DISCONNECTED = 0,    // 未连接
  STATE_CONNECTING = 1,      // 连接中
  STATE_CONNECTED = 2,       // 已连接
  STATE_DISCONNECTING = 3    // 断开中
}

// 连接信息结构
interface ConnectionInfo {
  deviceId: string;          // 设备ID
  state: ConnectionState;    // 连接状态
  channelType: ChannelType;  // 当前通道类型
  bandwidth: number;         // 可用带宽(KB/s)
  latency: number;           // 往返延迟(ms)
  connectTime: number;       // 连接建立时间戳
}

2.3 数据传输机制

连接建立后,数据传输就变得"透明"了。软总线为上层提供消息队列+可靠传输机制。

2.3.1 消息分层模型

┌─────────────────────────────────────┐
│         应用层消息(业务数据)         │
├─────────────────────────────────────┤
│       会话层(消息分片、重组)         │
├─────────────────────────────────────┤
│     传输层(可靠传输、流量控制)       │
├─────────────────────────────────────┤
│      网络层(路由、多路复用)          │
├─────────────────────────────────────┤
│     链路层(协议适配、帧封装)         │
└─────────────────────────────────────┘

关键特性

  • 消息分片:大消息自动分片,适配不同通道的MTU
  • 可靠传输:支持ACK确认、超时重传、乱序重组
  • 流量控制:根据接收方处理能力动态调整发送速率
  • 多路复用:单个连接支持多个会话,互不干扰

三、代码实战:软总线API使用

3.1 设备发现实战

import { DeviceDiscoveryManager, DeviceInfo } from '@ohos.distributedHardware.deviceManager';

/**
 * 设备发现管理器
 * 封装软总线设备发现能力
 */
export class DeviceDiscoveryHelper {
  private discoveryManager: DeviceDiscoveryManager | null = null;
  private discoveredDevices: Map<string, DeviceInfo> = new Map();
  private onDeviceFoundCallback: ((device: DeviceInfo) => void) | null = null;
  
  /**
   * 初始化发现管理器
   */
  async initialize(): Promise<void> {
    try {
      // 创建设备发现管理器实例
      this.discoveryManager = DeviceDiscoveryManager.create();
      
      console.info('[软总线] 设备发现管理器初始化成功');
    } catch (error) {
      console.error(`[软总线] 初始化失败: ${JSON.stringify(error)}`);
      throw error;
    }
  }
  
  /**
   * 开始设备发现
   * @param deviceType 设备类型过滤(可选)
   * @param timeout 超时时间(毫秒)
   */
  async startDiscovery(deviceType?: string, timeout: number = 30000): Promise<DeviceInfo[]> {
    if (!this.discoveryManager) {
      throw new Error('发现管理器未初始化');
    }
    
    // 清空已发现设备列表
    this.discoveredDevices.clear();
    
    // 注册设备发现回调
    this.discoveryManager.on('deviceFound', (device: DeviceInfo) => {
      console.info(`[软总线] 发现新设备: ${device.deviceName} (${device.deviceId})`);
      
      // 过滤设备类型
      if (deviceType && device.deviceType !== deviceType) {
        return;
      }
      
      // 添加到设备列表
      this.discoveredDevices.set(device.deviceId, device);
      
      // 触发回调
      if (this.onDeviceFoundCallback) {
        this.onDeviceFoundCallback(device);
      }
    });
    
    // 注册设备丢失回调
    this.discoveryManager.on('deviceLost', (deviceId: string) => {
      console.info(`[软总线] 设备离线: ${deviceId}`);
      this.discoveredDevices.delete(deviceId);
    });
    
    // 开始发现
    const subscribeId = await this.discoveryManager.startDeviceDiscovery({
      subscribeId: Math.random().toString(36).substring(7),
      mode: 'DISCOVER_MODE_ACTIVE',  // 主动发现模式
      medium: 'AUTO',                 // 自动选择介质
      freq: 'MID',                    // 中等频率
      isSameAccount: false,           // 不限制同账号
      isWakeRemote: true              // 唤醒远程设备
    });
    
    console.info(`[软总线] 开始发现,订阅ID: ${subscribeId}`);
    
    // 等待发现完成
    await new Promise<void>(resolve => {
      setTimeout(() => {
        this.discoveryManager?.stopDeviceDiscovery(subscribeId);
        resolve();
      }, timeout);
    });
    
    return Array.from(this.discoveredDevices.values());
  }
  
  /**
   * 设置设备发现回调
   */
  setOnDeviceFoundCallback(callback: (device: DeviceInfo) => void): void {
    this.onDeviceFoundCallback = callback;
  }
  
  /**
   * 获取已发现的设备列表
   */
  getDiscoveredDevices(): DeviceInfo[] {
    return Array.from(this.discoveredDevices.values());
  }
  
  /**
   * 释放资源
   */
  release(): void {
    if (this.discoveryManager) {
      this.discoveryManager.off('deviceFound');
      this.discoveryManager.off('deviceLost');
      this.discoveryManager = null;
    }
    this.discoveredDevices.clear();
  }
}

3.2 设备连接实战

import { ConnectionManager, ConnectionState } from '@ohos.distributedHardware.connectionManager';

/**
 * 设备连接管理器
 * 封装软总线连接能力
 */
export class DeviceConnectionHelper {
  private connectionManager: ConnectionManager | null = null;
  private connections: Map<string, ConnectionState> = new Map();
  
  /**
   * 初始化连接管理器
   */
  async initialize(): Promise<void> {
    try {
      this.connectionManager = ConnectionManager.create();
      
      // 监听连接状态变化
      this.connectionManager.on('connectionStateChanged', (info) => {
        console.info(`[软总线] 连接状态变化: ${info.deviceId} -> ${info.state}`);
        this.connections.set(info.deviceId, info.state);
      });
      
      console.info('[软总线] 连接管理器初始化成功');
    } catch (error) {
      console.error(`[软总线] 连接管理器初始化失败: ${JSON.stringify(error)}`);
      throw error;
    }
  }
  
  /**
   * 连接设备
   * @param deviceId 目标设备ID
   * @param timeout 连接超时(毫秒)
   */
  async connectDevice(deviceId: string, timeout: number = 10000): Promise<boolean> {
    if (!this.connectionManager) {
      throw new Error('连接管理器未初始化');
    }
    
    // 检查是否已连接
    const currentState = this.connections.get(deviceId);
    if (currentState === ConnectionState.STATE_CONNECTED) {
      console.info(`[软总线] 设备已连接: ${deviceId}`);
      return true;
    }
    
    try {
      // 发起连接
      await this.connectionManager.connect({
        deviceId: deviceId,
        authType: 'AUTH_TYPE_ACCOUNT',  // 账号认证
        priority: 'PRIORITY_HIGH'       // 高优先级
      });
      
      // 等待连接完成
      const startTime = Date.now();
      while (Date.now() - startTime < timeout) {
        const state = this.connections.get(deviceId);
        if (state === ConnectionState.STATE_CONNECTED) {
          console.info(`[软总线] 连接成功: ${deviceId}`);
          return true;
        }
        if (state === ConnectionState.STATE_DISCONNECTED) {
          console.error(`[软总线] 连接失败: ${deviceId}`);
          return false;
        }
        await new Promise(resolve => setTimeout(resolve, 100));
      }
      
      console.error(`[软总线] 连接超时: ${deviceId}`);
      return false;
    } catch (error) {
      console.error(`[软总线] 连接异常: ${JSON.stringify(error)}`);
      return false;
    }
  }
  
  /**
   * 断开设备连接
   */
  async disconnectDevice(deviceId: string): Promise<void> {
    if (!this.connectionManager) {
      return;
    }
    
    try {
      await this.connectionManager.disconnect(deviceId);
      this.connections.delete(deviceId);
      console.info(`[软总线] 已断开连接: ${deviceId}`);
    } catch (error) {
      console.error(`[软总线] 断开连接失败: ${JSON.stringify(error)}`);
    }
  }
  
  /**
   * 获取连接信息
   */
  async getConnectionInfo(deviceId: string): Promise<ConnectionInfo | null> {
    if (!this.connectionManager) {
      return null;
    }
    
    try {
      const info = await this.connectionManager.getConnectionInfo(deviceId);
      return info;
    } catch (error) {
      console.error(`[软总线] 获取连接信息失败: ${JSON.stringify(error)}`);
      return null;
    }
  }
  
  /**
   * 释放资源
   */
  release(): void {
    if (this.connectionManager) {
      this.connectionManager.off('connectionStateChanged');
      this.connectionManager = null;
    }
    this.connections.clear();
  }
}

3.3 数据传输实战

import { DataTransmitManager, TransmitOption } from '@ohos.distributedHardware.dataTransmit';

/**
 * 数据传输管理器
 * 封装软总线数据传输能力
 */
export class DataTransmitHelper {
  private transmitManager: DataTransmitManager | null = null;
  private sessionId: string = '';
  
  /**
   * 初始化传输管理器
   */
  async initialize(): Promise<void> {
    try {
      this.transmitManager = DataTransmitManager.create();
      console.info('[软总线] 数据传输管理器初始化成功');
    } catch (error) {
      console.error(`[软总线] 传输管理器初始化失败: ${JSON.stringify(error)}`);
      throw error;
    }
  }
  
  /**
   * 创建传输会话
   * @param deviceId 目标设备ID
   */
  async createSession(deviceId: string): Promise<string> {
    if (!this.transmitManager) {
      throw new Error('传输管理器未初始化');
    }
    
    try {
      this.sessionId = await this.transmitManager.createSession({
        deviceId: deviceId,
        sessionType: 'SESSION_TYPE_RELIABLE',  // 可靠传输
        dataType: 'DATA_TYPE_BYTES'            // 字节数据
      });
      
      console.info(`[软总线] 会话创建成功: ${this.sessionId}`);
      return this.sessionId;
    } catch (error) {
      console.error(`[软总线] 会话创建失败: ${JSON.stringify(error)}`);
      throw error;
    }
  }
  
  /**
   * 发送消息
   * @param data 要发送的数据
   */
  async sendMessage(data: Uint8Array): Promise<number> {
    if (!this.transmitManager || !this.sessionId) {
      throw new Error('会话未创建');
    }
    
    try {
      const transmitId = await this.transmitManager.sendData({
        sessionId: this.sessionId,
        data: data,
        option: {
          priority: 'PRIORITY_HIGH',
          needAck: true,        // 需要确认
          timeout: 5000         // 超时时间
        }
      });
      
      console.info(`[软总线] 数据发送成功,传输ID: ${transmitId}`);
      return transmitId;
    } catch (error) {
      console.error(`[软总线] 数据发送失败: ${JSON.stringify(error)}`);
      throw error;
    }
  }
  
  /**
   * 接收消息
   * @param callback 接收回调
   */
  onReceiveMessage(callback: (data: Uint8Array) => void): void {
    if (!this.transmitManager) {
      return;
    }
    
    this.transmitManager.on('dataReceived', (info) => {
      if (info.sessionId === this.sessionId) {
        callback(info.data);
      }
    });
  }
  
  /**
   * 发送文件(大文件传输)
   * @param filePath 文件路径
   * @param onProgress 进度回调
   */
  async sendFile(
    filePath: string,
    onProgress?: (progress: number) => void
  ): Promise<void> {
    if (!this.transmitManager || !this.sessionId) {
      throw new Error('会话未创建');
    }
    
    try {
      // 注册进度回调
      if (onProgress) {
        this.transmitManager.on('transmitProgress', (info) => {
          onProgress(info.progress);
        });
      }
      
      // 发送文件
      await this.transmitManager.sendFile({
        sessionId: this.sessionId,
        filePath: filePath,
        option: {
          priority: 'PRIORITY_HIGH',
          blockSize: 65536  // 64KB分块
        }
      });
      
      console.info(`[软总线] 文件发送成功: ${filePath}`);
    } catch (error) {
      console.error(`[软总线] 文件发送失败: ${JSON.stringify(error)}`);
      throw error;
    }
  }
  
  /**
   * 关闭会话
   */
  async closeSession(): Promise<void> {
    if (!this.transmitManager || !this.sessionId) {
      return;
    }
    
    try {
      await this.transmitManager.closeSession(this.sessionId);
      this.sessionId = '';
      console.info('[软总线] 会话已关闭');
    } catch (error) {
      console.error(`[软总线] 关闭会话失败: ${JSON.stringify(error)}`);
    }
  }
  
  /**
   * 释放资源
   */
  release(): void {
    if (this.transmitManager) {
      this.transmitManager.off('dataReceived');
      this.transmitManager.off('transmitProgress');
      this.transmitManager = null;
    }
  }
}

四、踩坑与注意事项

4.1 设备发现相关

坑1:发现不到设备

// ❌ 错误做法:忘记申请权限
// 在module.json5中必须声明权限
{
  "requestPermissions": [
    {
      "name": "ohos.permission.DISTRIBUTED_DATASYNC",
      "reason": "需要发现和连接分布式设备"
    },
    {
      "name": "ohos.permission.ACCESS_BLUETOOTH",
      "reason": "需要使用蓝牙进行设备发现"
    }
  ]
}

解决方案:在module.json5中正确声明权限,并在运行时动态申请。

坑2:发现结果重复

设备可能同时通过蓝牙和Wi-Fi被发现,导致列表中出现重复设备。

// ✅ 正确做法:使用设备ID去重
const deviceMap = new Map<string, DeviceInfo>();

discoveryManager.on('deviceFound', (device: DeviceInfo) => {
  // 使用设备ID作为唯一标识
  if (!deviceMap.has(device.deviceId)) {
    deviceMap.set(device.deviceId, device);
    // 更新UI显示
    updateDeviceList(Array.from(deviceMap.values()));
  }
});

4.2 连接建立相关

坑3:连接超时

某些设备(特别是低功耗设备)响应较慢,默认超时可能不够。

// ✅ 正确做法:根据设备类型设置不同超时
const getTimeoutByDeviceType = (deviceType: string): number => {
  switch (deviceType) {
    case 'WATCH':      // 手表响应较慢
      return 15000;
    case 'PHONE':      // 手机响应较快
      return 8000;
    case 'TV':         // 电视响应中等
      return 10000;
    default:
      return 10000;
  }
};

await connectionManager.connect({
  deviceId: deviceId,
  timeout: getTimeoutByDeviceType(device.deviceType)
});

坑4:连接状态不同步

应用层缓存的状态与实际状态不一致,导致逻辑错误。

// ✅ 正确做法:始终监听状态变化,不依赖缓存
class ConnectionManager {
  private state: ConnectionState = ConnectionState.STATE_DISCONNECTED;
  
  constructor() {
    // 持续监听状态变化
    connectionManager.on('connectionStateChanged', (info) => {
      this.state = info.state;
      this.notifyStateChange(info.state);
    });
  }
  
  // 每次操作前检查实际状态
  async ensureConnected(deviceId: string): Promise<void> {
    const actualState = await connectionManager.getState(deviceId);
    if (actualState !== ConnectionState.STATE_CONNECTED) {
      await this.connect(deviceId);
    }
  }
}

4.3 数据传输相关

坑5:大数据包发送失败

不同通道的MTU不同,超过限制会导致发送失败。

// ✅ 正确做法:根据通道能力分片发送
async sendLargeData(data: Uint8Array, sessionId: string): Promise<void> {
  // 获取通道MTU
  const mtu = await transmitManager.getMtu(sessionId);
  const chunkSize = mtu - 20;  // 预留头部空间
  
  // 分片发送
  for (let offset = 0; offset < data.length; offset += chunkSize) {
    const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));
    await transmitManager.sendData({
      sessionId: sessionId,
      data: chunk,
      option: { needAck: true }
    });
  }
}

坑6:内存泄漏

忘记取消事件监听导致内存泄漏。

// ❌ 错误做法:只注册不取消
aboutToAppear(): void {
  discoveryManager.on('deviceFound', this.handleDeviceFound);
}
// 缺少aboutToDisappear中的取消注册

// ✅ 正确做法:在组件销毁时取消注册
aboutToDisappear(): void {
  discoveryManager.off('deviceFound', this.handleDeviceFound);
  connectionManager.off('connectionStateChanged');
  transmitManager.off('dataReceived');
}

五、HarmonyOS 6适配指南

5.1 API变更

HarmonyOS 6对软总线API进行了重构,主要变更如下:

设备发现API变更

// HarmonyOS 5.0
import deviceManager from '@ohos.distributedHardware.deviceManager';
const dm = deviceManager.createDeviceManager('bundleName');

// HarmonyOS 6.0
import { DeviceDiscoveryManager } from '@ohos.distributedHardware.deviceManager';
const dm = DeviceDiscoveryManager.create();

连接API变更

// HarmonyOS 5.0
dm.bindTarget(deviceId, bindParam, callback);

// HarmonyOS 6.0
import { ConnectionManager } from '@ohos.distributedHardware.connectionManager';
const cm = ConnectionManager.create();
await cm.connect({ deviceId: deviceId, authType: 'AUTH_TYPE_ACCOUNT' });

5.2 行为变更

变更1:发现模式调整

HarmonyOS 6移除了DISCOVER_MODE_PASSIVE被动模式,统一使用DISCOVER_MODE_ACTIVE

// HarmonyOS 6适配代码
await discoveryManager.startDeviceDiscovery({
  subscribeId: subscribeId,
  mode: 'DISCOVER_MODE_ACTIVE',  // 仅支持主动模式
  medium: 'AUTO',
  freq: 'MID'
});

变更2:认证流程简化

HarmonyOS 6简化了设备认证流程,支持自动信任同账号设备。

// HarmonyOS 6适配代码
await connectionManager.connect({
  deviceId: deviceId,
  authType: 'AUTH_TYPE_ACCOUNT',  // 同账号自动信任
  autoTrust: true                 // 启用自动信任
});

变更3:传输QoS增强

HarmonyOS 6新增了QoS配置能力,可以指定传输质量要求。

// HarmonyOS 6新增QoS配置
await transmitManager.sendData({
  sessionId: sessionId,
  data: data,
  qos: {
    reliability: 'HIGH',      // 高可靠性
    latency: 'LOW',           // 低延迟
    bandwidth: 'HIGH'         // 高带宽
  }
});

5.3 兼容性适配

/**
 * 软总线API兼容层
 * 自动适配HarmonyOS 5.0和6.0
 */
export class SoftBusCompat {
  private apiLevel: number = 6;
  
  constructor() {
    // 检测API版本
    this.apiLevel = this.detectApiLevel();
  }
  
  private detectApiLevel(): number {
    try {
      // 尝试导入HarmonyOS 6 API
      require('@ohos.distributedHardware.deviceManager');
      return 6;
    } catch {
      return 5;
    }
  }
  
  async createDiscoveryManager(): Promise<any> {
    if (this.apiLevel >= 6) {
      const { DeviceDiscoveryManager } = require('@ohos.distributedHardware.deviceManager');
      return DeviceDiscoveryManager.create();
    } else {
      const deviceManager = require('@ohos.distributedHardware.deviceManager');
      return deviceManager.createDeviceManager('bundleName');
    }
  }
}

六、总结一下下

分布式软总线是HarmonyOS分布式能力的基石,它通过统一的抽象层,屏蔽了底层通信协议的复杂性,让设备互联变得像"插拔USB"一样简单。

核心要点回顾

  1. 设备发现:多协议协同发现,自动感知周围设备
  2. 连接建立:智能通道选择,自动建立最优连接
  3. 数据传输:可靠传输保证,大文件分片支持
  4. 状态管理:实时状态监听,异常自动恢复

最佳实践建议

  • 使用前务必申请相关权限
  • 设备ID去重避免重复显示
  • 根据设备类型设置合理超时
  • 大数据包主动分片发送
  • 及时取消事件监听避免内存泄漏
  • 使用兼容层适配多版本API

软总线让"分布式"不再是一个概念,而是触手可及的能力。掌握了软总线,你就掌握了HarmonyOS分布式开发的"通行证"。


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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