【OpenHarmony】通用互联APP架构
通用互联APP架构设计摘要 本项目为基于OpenHarmony的通用互联应用(ohos-connect-hap),采用ArkTS/TypeScript开发,支持API 12。系统采用分层架构设计,包含表现层、业务层、协议层和数据层,通过标准接口实现多协议设备互联。主要功能包括: 支持蓝牙/WiFi/IoT三协议设备发现与控制 统一设备管理及场景自动化 模块化架构设计,分为公共基础模块、协议实现模块
通用互联APP架构设计
目录
1. 模块概述
源码:https://gitee.com/ohos-oneconnect/ohos-connect-hap/tree/v1.0.0.0
1.1 功能与目标
通用互联APP 是一个面向鸿蒙生态的设备控制应用,主要功能包括:
- 设备发现与连接:支持蓝牙(BLE)、WiFi、IoT-Connect 三种协议的设备发现与连接
- 设备管理:设备库管理、附近设备扫描与控制、设备状态查询
- 场景管理:自动化场景创建、执行与管理
- 多协议支持:统一的协议抽象层,支持多种连接协议的扩展
使用场景:
- 智能家居设备控制
- IoT设备配网与管理
- 智能场景自动化
- 设备库资源查询
1.2 系统位置
本应用是 HarmonyOS Next 生态中的核心设备控制入口,作为用户与智能设备交互的桥梁:
- 核心模块:
common(公共基础服务) - 协议模块:
connect_ble、connect_wifi、connect_iot(协议实现) - 功能模块:
nearbydevice、devicelibrary、scenelibrary、mine(业务功能) - 主入口模块:
product/phone(应用入口与UI主框架)
1.3 设计思路与模式
设计思路
-
分层架构:采用经典的分层架构,实现关注点分离
- 表现层(View Layer):UI组件、页面、视图模型
- 业务层(Business Layer):设备管理、扫描管理、连接管理
- 协议层(Protocol Layer):协议抽象接口与具体实现
- 数据层(Data Layer):数据库、首选项存储
-
接口抽象与多态:通过定义统一的协议接口(
InfDevicesController、InfDevicesDiscover、InfDevicesConnector等),实现对蓝牙、WiFi、IoT等协议的统一管理 -
模块化设计:按功能域划分模块,降低模块间耦合度
- 公共模块(common)提供基础能力
- 连接模块(connect)实现具体协议
- 功能模块(features)实现业务逻辑
设计模式
-
单例模式(Singleton):
ConnectDatabaseHelperImpl:数据库辅助类DevicesManager:设备连接状态管理DeviceDiscoverManager:设备发现管理
-
工厂模式(Factory):
- 通过
getControllerByProtocolType()根据协议类型创建对应的控制器
- 通过
-
观察者模式(Observer):
- 通过
CommonEventManager实现设备状态变化通知 - 设备连接状态变化、数据变化通过事件机制广播
- 通过
-
策略模式(Strategy):
- 不同协议类型对应不同的扫描、连接、控制策略
-
DAO模式(Data Access Object):
DeviceLibraryDao、SceneLibraryDao封装数据库访问
1.4 系统框图
2. 模块结构
2.1 common 公共模块
功能描述:提供协议抽象接口、数据库支持、工具类等公共能力。
2.1.1 主要目录结构
common/
├── src/main/ets/
│ ├── constants/ # 常量定义
│ │ ├── CommonConstants.ets
│ │ ├── DevceType.ets
│ │ ├── EventConstants.ets
│ │ └── RelativeRules.ets
│ ├── database/ # 数据库模块
│ │ ├── ConnectDatabaseHelperImpl.ets
│ │ ├── dao/
│ │ │ ├── DeviceLibraryDao.ets
│ │ │ └── SceneLibraryDao.ets
│ │ ├── entity/
│ │ │ ├── Device.ets
│ │ │ └── Scene.ets
│ │ ├── DeviceLibraryAccess.ets
│ │ ├── GenericValues.ets
│ │ ├── IDatabaseHelper.ets
│ │ ├── PreferencesHelper.ets
│ │ └── TableConfig.ets
│ ├── inf/ # 协议接口抽象层
│ │ ├── InfAccessManager.ets
│ │ ├── InfAccessManagerBluetooth.ets
│ │ ├── InfAccessManagerWifi.ets
│ │ ├── InfDevice.ets
│ │ ├── InfDevicesBusiness.ets
│ │ ├── InfDevicesConnector.ets
│ │ ├── InfDevicesController.ets
│ │ ├── InfDevicesDiscover.ets
│ │ ├── InfDevicesParser.ets
│ │ ├── InfBroadcastData.ets
│ │ ├── InfConstants.ets
│ │ ├── ControlCmd.ets
│ │ ├── EnvManager.ets
│ │ └── TypeEnum.ets
│ └── utils/ # 工具类
│ ├── GlobalContext.ets
│ ├── Logger.ets
│ └── PermissionUtil.ets
└── index.ets # 模块导出
2.1.2 核心接口定义
InfDevicesController(设备控制器接口)
功能:协议控制器的顶层接口,整合设备发现、连接、业务、解析能力。
关键方法:
export declare interface InfDevicesController {
// 获取设备发现器
getDiscover(): InfDevicesDiscover;
// 获取设备连接器
getConnector(): InfDevicesConnector;
// 获取设备业务操作接口
getDevicesBusiness(): InfDevicesBusiness;
// 获取广播解析器
getParser(): InfDevicesParser;
// 获取协议类型
getProtocolType(): ProtocolType;
// 获取子协议类型
getSubProtocolType(): SubProtocolType;
}
InfDevicesDiscover(设备发现接口)
功能:负责设备扫描与发现。
关键方法:
export declare interface InfDevicesDiscover {
// 开始扫描
startScan(options: ScanOptions | null, callback: Callback<InfDevice>): void;
// 停止扫描
stopScan(): void;
// 扫描是否可用
isScanEnable(): boolean;
}
InfDevicesConnector(设备连接接口)
功能:负责设备连接与断开。
关键方法:
export declare interface InfDevicesConnector {
// 连接设备
connect(device: InfDevice): Promise<boolean>;
// 获取当前连接的设备
getCurrentConnectedDevice(): InfDevice | undefined;
// 断开连接
stopConnect(device: InfDevice): Promise<boolean>;
}
InfDevicesBusiness(设备业务操作接口)
功能:设备业务操作,包括状态查询、服务查询、设备控制。
关键方法:
export declare interface InfDevicesBusiness {
// 查询设备状态
queryDeviceState(sid: string[]): Promise<Array<InfDeviceState>>;
// 查询设备所有服务
queryDeviceAllServices(): Promise<Array<InfDeviceState>>;
// 查询设备信息
queryDeviceInfo(): Promise<InfDeviceInfo>;
// 控制设备
controlDevice(control: InfControl): Promise<boolean>;
}
2.1.3 数据库模块
ConnectDatabaseHelperImpl(数据库辅助实现类)
设计模式:单例模式
功能:
- 管理关系型数据库(RelationalStore)
- 表的创建与升级
- SQL执行
关键方法:
export class ConnectDatabaseHelperImpl extends IDatabaseHelper {
// 单例获取
public static async getInstance(): Promise<ConnectDatabaseHelperImpl>
// 获取RdbStore
async getRdbStore(): Promise<boolean>
// 初始化数据库
async init(): Promise<boolean>
// 创建表
async createTable(): Promise<boolean>
// 创建设备库表
private async createDeviceLibraryTable(): Promise<boolean>
// 创建场景库表
private async createSceneLibraryTable(): Promise<boolean>
// 升级数据库
upgradeTable(startVersion: number, endVersion: number): boolean
}
表结构:
-
设备库表(DEVICE_LIBRARY)
PID(text, primary key):产品IDVALUE(text, not null):设备JSON数据
-
场景库表(SCENE_LIBRARY)
SCENE_ID(text, not null):场景IDLANGUAGE(text, not null):语言VALUE(text, not null):场景JSON数据- 主键:(
SCENE_ID,LANGUAGE)
DeviceLibraryDao(设备库数据访问对象)
功能:封装设备库的CRUD操作。
SceneLibraryDao(场景库数据访问对象)
功能:封装场景库的CRUD操作。
2.1.4 实体类
Device 实体类
export class Device {
industry: Array<Industry> = [] // 行业信息
manufacturer: Manufacturer = new Manufacturer() // 厂商信息
deviceType: DeviceType = new DeviceType() // 设备类型
productId: string = ''; // 产品ID
deviceName: string = ''; // 设备名称
osTypeName: string = ''; // 操作系统类型
osVersion: string = ''; // 操作系统版本
typicalService: string = ''; // 典型服务
deviceIcons: Array<string> = []; // 设备图标
deviceModel: string = ''; // 设备型号
deviceProfile: string = ''; // 设备配置文件
pinType: number = 0; // PIN类型
oHConnectCertified: boolean = false; // OH Connect认证
}
2.1.5 枚举类型
ProtocolType(协议类型)
export enum ProtocolType {
WIFI, // WiFi协议
BLE, // 蓝牙协议
IOT_CONNECT, // IoT-Connect协议
VIRTUAL, // 虚拟协议(用于测试)
ETHERNET, // 以太网协议
UNKNOWN, // 未知协议
}
ConnectType(连接类型)
export enum ConnectType {
OFFLINE = 0, // 离线
ONLINE = 1, // 在线
}
2.2 connect 连接模块
2.2.1 connect_ble 蓝牙协议模块
功能描述:实现基于BLE的设备发现、连接、控制。
主要类:
- BleDevicesController:蓝牙设备控制器,实现
InfDevicesController接口 - BleDevicesDiscover:蓝牙设备发现,实现
InfDevicesDiscover接口 - BleDevicesConnector:蓝牙设备连接器,实现
InfDevicesConnector接口 - BleDevicesBusiness:蓝牙设备业务操作,实现
InfDevicesBusiness接口 - BleDevicesParser:蓝牙广播数据解析器
- BleScanner:封装系统BLE扫描API
- BleDevice:蓝牙设备实体
协议支持:
- 开源蓝牙协议(ble_open)
- IoT Connect Service SDK蓝牙协议(ble_iot_connect_service)
- 开鸿智谷蓝牙协议(ble_open_valley)
2.2.2 connect_wifi WiFi协议模块
功能描述:实现基于WiFi(CoAP协议)的设备发现、连接、控制。
主要类:
- WifiDevicesController:WiFi设备控制器
- CoapServerManager:CoAP服务器管理器
依赖库:
libcoap.har:CoAP协议库
2.2.3 connect_iot IoT-Connect协议模块
功能描述:实现基于IoT-Connect SDK的设备连接与控制。
主要类:
- IotDevicesController:IoT设备控制器
- IotHelper:IoT辅助工具
依赖库:
IoTConnectKit.har:IoT连接套件
2.3 features 功能模块
2.3.1 nearbydevice 附近设备模块
功能描述:附近设备扫描、连接、控制的核心业务逻辑。
关键类:
DevicesManager(设备管理器)
设计模式:单例模式
功能:
- 管理已发现的设备列表
- 设备连接状态管理
- 连接锁机制(防止并发连接)
- 设备连接状态变化通知
- 设备数据变化通知
关键方法:
export default class DevicesManager {
// 单例获取
static getInstance(): DevicesManager
// 注册事件订阅(在EntryAbility onCreate中调用)
subscribeEvent(): void
// 添加设备
addDevice(device: InfDevice): void
// 连接设备
async connect(index: number): Promise<void>
// 断开连接
disconnect(): void
// 获取当前连接的设备
getConnectingDevice(): InfDevice | undefined
// 注册连接状态变化回调
registerConnectStateChanged(name: string, callBack: Callback<number>): void
// 注册消息接收回调
registerMessageReceivers(name: string, callBack: Callback<InfDeviceState[]>): void
}
DeviceDiscoverManager(设备发现管理器)
设计模式:单例模式
功能:
- 管理多个协议控制器
- 根据协议类型获取对应的控制器
- 启动/停止设备扫描
ConnectState(连接状态枚举)
export enum ConnectState {
NOT_START, // 未开始
CONNECTING, // 连接中
CONNECT_SUCCESS, // 连接成功
CONNECT_FAILED // 连接失败
}
2.3.2 devicelibrary 设备库模块
功能描述:设备库查询、搜索、详情展示。
主要页面:
DeviceLibraryPage:设备库主页- 设备搜索页面
- 设备详情页面
2.3.3 scenelibrary 场景库模块
功能描述:自动化场景的创建、编辑、执行、管理。
主要功能:
- 场景列表展示
- 场景创建与编辑
- 场景执行
- 条件与动作配置
2.3.4 mine 我的模块
功能描述:用户设置、关于信息、帮助文档等。
2.4 product/phone 主入口模块
功能描述:应用主入口、页面框架、Tab导航。
2.4.1 EntryAbility(应用入口)
功能:
- 应用生命周期管理
- 权限申请
- 设备管理器事件订阅
- 应用崩溃恢复
关键生命周期:
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 申请蓝牙权限
// 启用应用崩溃恢复
// 订阅设备事件
DevicesManager.getInstance().subscribeEvent();
}
onDestroy(): void {
// 取消订阅设备事件
DevicesManager.getInstance().unSubscribeEvent();
}
onWindowStageCreate(windowStage: window.WindowStage): void {
// 加载主页面 LauncherPage
}
onForeground(): void {
// 应用前台事件
}
onBackground(): void {
// 应用后台事件
}
}
2.4.2 页面结构
- LauncherPage:应用启动页
- CategoryPage:分类主页(Tab导航)
- 附近设备Tab
- 设备库Tab
- 场景库Tab
- 我的Tab
3. 模块间交互
3.1 交互描述
3.1.1 纵向交互(分层交互)
表现层 → 业务层:
DevicesScanPage调用DevicesManager进行设备连接DevicesScanPage调用DeviceDiscoverManager启动扫描
业务层 → 协议层:
DevicesManager通过InfDevicesConnector连接设备DeviceDiscoverManager通过InfDevicesDiscover扫描设备
协议层 → 系统能力层:
BleDevicesConnector调用 HarmonyOS Bluetooth APIWifiDevicesController使用 CoAP 库通信
业务层 → 数据层:
- 设备库、场景库通过 DAO 访问数据库
- 通过
PreferencesHelper读写首选项
3.1.2 横向交互(模块间协作)
协议模块间:
- 各协议模块(
connect_ble、connect_wifi、connect_iot)均实现common定义的接口 - 通过多态实现协议的热插拔
功能模块间:
nearbydevice与devicelibrary共享设备数据scenelibrary可调用nearbydevice的设备控制能力
3.2 模块间依赖框图
3.3 外部依赖框图
3.4 异步处理与事件驱动
事件机制
通过 CommonEventManager 实现跨模块通信:
发布事件:
- 设备连接状态变化:
KEY_ON_CONNECT_STATE_CHANGED - 设备数据变化:
KEY_ON_DEVICE_DATA_CHANGED
订阅事件:
DevicesManager在EntryAbility.onCreate()中订阅事件- 各业务模块通过
DevicesManager注册回调
事件流程:
设备连接状态变化 → CommonEvent发布 → DevicesManager接收 →
分发给各注册的回调 → UI更新
多线程处理
- 异步操作:设备连接、扫描、数据库查询均使用
Promise异步处理 - 主线程:UI渲染与用户交互
- 工作线程:数据库操作、网络通信(由系统API内部管理)
4. 状态机转换图
4.1 设备连接状态机
4.1.1 状态定义
export enum ConnectState {
NOT_START, // 未开始
CONNECTING, // 连接中
CONNECT_SUCCESS, // 连接成功
CONNECT_FAILED // 连接失败
}
4.1.2 状态转换图
4.1.3 状态转换规则
| 当前状态 | 触发事件 | 目标状态 | 条件 |
|---|---|---|---|
| NOT_START | 用户点击连接 | CONNECTING | 无其他设备正在连接 |
| CONNECTING | 连接成功回调 | CONNECT_SUCCESS | connector.connect() 返回 true |
| CONNECTING | 连接失败/超时 | CONNECT_FAILED | connector.connect() 返回 false 或异常 |
| CONNECT_SUCCESS | 用户点击断开 | NOT_START | 无 |
| CONNECT_SUCCESS | 切换设备 | CONNECTING | 先断开当前设备 |
| CONNECT_FAILED | 自动重置 | NOT_START | 连接失败后自动重置 |
4.1.4 连接锁机制
目的:防止并发连接多个设备
实现:
private connectLock = false;
async connect(index: number) {
// 检查锁状态
if (this.isLock()) {
Logger.warn("other devices are currently connecting");
showPop($r('app.string.other_devices_connecting'));
return;
}
// 加锁
this.setLock(true);
try {
// 执行连接逻辑
const result = await connector.connect(device);
// ...
} finally {
// 释放锁
this.setLock(false);
}
}
4.2 设备在线状态机
4.3 扫描状态机
5. 接口设计
5.1 公共接口
5.1.1 InfDevicesController 接口
功能:设备控制器顶层接口
方法列表:
| 方法名 | 参数 | 返回值 | 功能描述 |
|---|---|---|---|
getDiscover() |
无 | InfDevicesDiscover |
获取设备发现器 |
getConnector() |
无 | InfDevicesConnector |
获取设备连接器 |
getDevicesBusiness() |
无 | InfDevicesBusiness |
获取设备业务操作接口 |
getParser() |
无 | InfDevicesParser |
获取广播解析器 |
getProtocolType() |
无 | ProtocolType |
获取协议类型 |
getSubProtocolType() |
无 | SubProtocolType |
获取子协议类型 |
5.1.2 InfDevicesDiscover 接口
功能:设备发现与扫描
方法列表:
| 方法名 | 参数 | 返回值 | 功能描述 |
|---|---|---|---|
startScan() |
options: ScanOptions | nullcallback: Callback<InfDevice> |
void |
开始扫描,扫描到设备后通过回调返回 |
stopScan() |
无 | void |
停止扫描 |
isScanEnable() |
无 | boolean |
扫描功能是否可用 |
异常处理:
- 权限不足:在
startScan前需先调用InfAccessManager.isEnable()检查权限 - 蓝牙未开启:返回扫描不可用
5.1.3 InfDevicesConnector 接口
功能:设备连接与断开
方法列表:
| 方法名 | 参数 | 返回值 | 功能描述 |
|---|---|---|---|
connect() |
device: InfDevice |
Promise<boolean> |
连接设备,返回是否成功 |
getCurrentConnectedDevice() |
无 | InfDevice | undefined |
获取当前连接的设备 |
stopConnect() |
device: InfDevice |
Promise<boolean> |
断开连接,返回是否成功 |
异常处理:
- 连接超时:抛出异常,由调用方处理
- 设备不可达:返回
false
5.1.4 InfDevicesBusiness 接口
功能:设备业务操作
方法列表:
| 方法名 | 参数 | 返回值 | 功能描述 |
|---|---|---|---|
queryDeviceState() |
sid: string[] |
Promise<Array<InfDeviceState>> |
查询设备状态 |
queryDeviceAllServices() |
无 | Promise<Array<InfDeviceState>> |
查询设备所有服务 |
queryDeviceInfo() |
无 | Promise<InfDeviceInfo> |
查询设备信息 |
controlDevice() |
control: InfControl |
Promise<boolean> |
控制设备 |
数据结构:
// 设备状态
export interface InfDeviceState {
data: Record<string, string | number> // 状态数据键值对
sid: string, // 服务ID
}
// 控制信息
export interface InfControl {
getServiceId(): string; // 获取服务ID
getDataJson(): string; // 获取控制数据JSON
}
5.2 数据交换接口
5.2.1 数据库访问接口
IDatabaseHelper(数据库辅助基类)
方法列表:
| 方法名 | 参数 | 返回值 | 功能描述 |
|---|---|---|---|
getRdbStore() |
无 | Promise<boolean> |
获取数据库实例 |
executeSql() |
sql: string |
Promise<boolean> |
执行SQL语句 |
insert() |
table: TableTypevalues: ValuesBucket |
Promise<number> |
插入数据 |
update() |
table: TableTypevalues: ValuesBucketpredicates: RdbPredicates |
Promise<number> |
更新数据 |
delete() |
table: TableTypepredicates: RdbPredicates |
Promise<number> |
删除数据 |
query() |
table: TableTypepredicates: RdbPredicates |
Promise<ResultSet> |
查询数据 |
DeviceLibraryDao(设备库DAO)
方法列表:
| 方法名 | 参数 | 返回值 | 功能描述 |
|---|---|---|---|
insert() |
device: Device |
Promise<boolean> |
插入设备 |
queryByPid() |
pid: string |
Promise<Device | null> |
根据PID查询设备 |
queryAll() |
无 | Promise<Device[]> |
查询所有设备 |
delete() |
pid: string |
Promise<boolean> |
删除设备 |
5.2.2 事件通信接口
发布事件:
// 连接状态变化
const data = {
[InfConstants.ON_CONNECT_STATE_CHANGED_TYPE]: ConnectType.ONLINE
};
eventManager.publish({
bundleName: 'com.example.app',
isOrdered: false,
parameters: {
event: `KEY_${InfConstants.ON_CONNECT_STATE_CHANGED}`,
data: JSON.stringify(data)
}
});
// 设备数据变化
const deviceStates: InfDeviceState[] = [/*...*/];
eventManager.publish({
bundleName: 'com.example.app',
isOrdered: false,
parameters: {
event: `KEY_${InfConstants.ON_DEVICE_DATA_CHANGED}`,
data: JSON.stringify(deviceStates)
}
});
订阅事件:
// 在 DevicesManager 中订阅
subscribeEvent() {
let info: eventManager.CommonEventSubscribeInfo = {
events: [
`KEY_${InfConstants.ON_CONNECT_STATE_CHANGED}`,
`KEY_${InfConstants.ON_DEVICE_DATA_CHANGED}`
]
}
eventManager.createSubscriber(info).then((subscriber) => {
this.subscriber = subscriber;
eventManager.subscribe(this.subscriber, this.callEvent);
})
}
6. 数据流与时序
6.1 设备扫描时序图
6.2 设备连接时序图
6.3 设备控制时序图
6.4 数据库访问时序图
7. 部署与配置
7.1 环境要求
- 开发工具:DevEco Studio NEXT Developer Beta1 (5.0.3.403)
- SDK版本:API 12
- 目标平台:HarmonyOS Next
- 支持设备:HarmonyOS手机、平板
7.2 权限配置
在 product/phone/src/main/module.json5 中配置:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.ACCESS_BLUETOOTH",
"reason": "$string:bluetooth_permission_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
},
{
"name": "ohos.permission.USE_BLUETOOTH",
"reason": "$string:bluetooth_permission_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
},
{
"name": "ohos.permission.DISCOVER_BLUETOOTH",
"reason": "$string:bluetooth_permission_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
},
{
"name": "ohos.permission.INTERNET",
"reason": "$string:internet_permission_reason"
}
]
}
}
7.3 模块依赖配置
在 build-profile.json5 中配置模块:
{
"modules": [
{
"name": "phone",
"srcPath": "./product/phone"
},
{
"name": "common",
"srcPath": "./common"
},
{
"name": "connect_ble",
"srcPath": "./connect/connect_ble"
},
{
"name": "connect_wifi",
"srcPath": "./connect/connect_wifi"
},
{
"name": "connect_iot",
"srcPath": "./connect/connect_iot"
},
{
"name": "nearbydevice",
"srcPath": "./features/nearbydevice"
},
{
"name": "devicelibrary",
"srcPath": "./features/devicelibrary"
},
{
"name": "scenelibrary",
"srcPath": "./features/scenelibrary"
},
{
"name": "mine",
"srcPath": "./features/mine"
}
]
}
7.4 签名配置
- 打开 DevEco Studio,点击工具栏
Project Structure - 进入
SigningConfigs菜单 - 登录华为开发者账号
- 选择自动签名
7.5 编译与运行
# 连接设备
# 点击 DevEco Studio 工具栏 "Run phone" 按钮
# 或使用命令行
hvigorw assembleHap --mode module -p product=default
附录
A. 关键类图
A.1 协议接口类图
A.2 设备管理类图
B. 术语表
| 术语 | 说明 |
|---|---|
| ArkTS | HarmonyOS的TypeScript超集语言 |
| BLE | Bluetooth Low Energy,低功耗蓝牙 |
| CoAP | Constrained Application Protocol,受限应用协议 |
| DAO | Data Access Object,数据访问对象 |
| HAR | HarmonyOS Archive,HarmonyOS库文件格式 |
| IoT | Internet of Things,物联网 |
| PID | Product ID,产品标识符 |
| RDB | Relational Database,关系型数据库 |
| SDK | Software Development Kit,软件开发工具包 |
| ViewModel | 视图模型,MVVM架构中的VM层 |
更多推荐



所有评论(0)