资讯动态

Capacitor 插件鸿蒙化实战:@capacitor/device 从安装到模拟器验证全记录

发布时间:2026/10/8 18:23:05 来源:尧图企业网站定制
Capacitor 插件鸿蒙化实战capacitor/device 从安装到模拟器验证全记录本文聚焦插件层以 CPF-Ionic 鸿蒙化的capacitor/device插件为例完整走通安装插件 → React 调用 → 构建签名 → 模拟器运行验证全链路所有步骤实测。一、插件生态背景1.1 CPF-Ionic 插件体系Capacitor 的设备能力全部通过插件capacitor/xxx提供。华为 CPF-Ionic 团队按原插件包名不变、原生实现替换为 OHOS的原则完成了 29 个官方插件 14 个 Ionic 三方插件的鸿蒙化完整清单见 ionic-readme已同步至 AtomGit组织主页 https://atomgit.com/cpf-ionic Capacitor 官方插件app、browser、camera、device、filesystem、keyboard、barcode-scanner、app-launcher、clipboard、geolocation、haptics、push-notifications、network、share、status-bar、text-zoom、action-sheet、dialog、screen-reader、splash-screen、toast、file-transfer、file-viewer、inappbrowser、local-notifications、motion、preferences、privacy-screen、screen-orientationIonic 三方插件ionic-native/xxx对应status-bar、splash-screen、file、in-app-browser、device、file-transfer、app-version、camera、clipboard、file-opener、keyboard、network、android-permissions、pdf-generator1.2 鸿蒙化插件的双包结构每个鸿蒙化插件由两个 npm 包组成包角色安装位置capacitor/device官方原包Web/API 层TS 类型定义 Promise APIWeb 层调用的入口前端工程 node_modulescapacitor-ohos/deviceOHOS 原生实现ArkTS CDevice.ets / Device.cpp / Device.h由 hionic 拷入openharmony/capacitor/参与编译Web 层调用Device.getInfo()时代码与 Android/iOS完全一致——插件鸿蒙化的全部意义就在于此API 契约不变原生实现替换。1.3 插件接入鸿蒙工程需要做的四件事查看插件的plugin.xml可知一个 OHOS Capacitor 插件接入壳工程需要四处修改插件注册表entry/src/main/resources/rawfile/capacitor.plugins.json加{pkg: capacitor/device, classpath: Device}CMake 编译capacitor/src/main/cpp/CMakeLists.txt加add_subdirectory(Device)并链入Device库源码拷贝CDevice.h/.cpp/CMakeLists.txt→cpp/Device/ArkTSDevice.ets→ets/components/Device/ArkTS 编译范围capacitor/build-profile.json5的buildOption.arkOptions.runtimeOnly.sources加入 Device.ets。好消息这四步 hionic 全部自动化一条命令搞定见下文。二、环境延续上一篇的 capacitorMyApp 项目hionic 2.1.16 / Capacitor 8.5.2 / capacitor-ohos/ohos 8.0.2 / openssl 已集成 / 模拟器 127.0.0.1:5555 在线。三、逐步操作过程第 1 步安装插件hionic pluginaddcapacitor/device一条命令hionic 自动完成了上面第一节的全部四件事关键输出log: ✓ Added runtimeOnly source: ./src/main/ets/components/Device/Device.ets log: Installing CMakeLists configuration to: src/main/cpp/CMakeLists.txt log: Updated CMakeLists.txt: src/main/cpp/CMakeLists.txt log: - add_subdirectory(Device) log: Installing config-json to: src/main/resources/rawfile/capacitor.plugins.json log: Successfully added plugin: capacitor/device验证四处修改都已落盘# ① 注册表$catopenharmony/entry/src/main/resources/rawfile/capacitor.plugins.json[{pkg:capacitor/CapacitorPlugin,classpath:CapacitorPlugin},{pkg:capacitor/device,classpath:Device}← 新增]# ② CMake$grepDevice openharmony/capacitor/src/main/cpp/CMakeLists.txt add_subdirectory(Device)← 第20行 Device ← target_link_libraries 中链入# ③ 源码$lsopenharmony/capacitor/src/main/cpp/Device/ CMakeLists.txt Device.cpp Device.h $lsopenharmony/capacitor/src/main/ets/components/Device/ Device.ets# ④ npm 双包$grepdevice package.jsoncapacitor-ohos/device:^8.0.2← 鸿蒙原生实现capacitor/device:^8.0.3← 官方 API 层卸载同样一条命令hionic plugin remove capacitor/device。第 2 步React 层调用插件修改src/App.jsx与 Android/iOS 上的写法完全一致import { useState, useEffect } from react import { Device } from capacitor/device function App() { const [device, setDevice] useState(null) useEffect(() { const load async () { try { const [info, id, battery, lang] await Promise.all([ Device.getInfo(), Device.getId(), Device.getBatteryInfo(), Device.getLanguageTag(), ]) setDevice({ info, id, battery, lang }) console.log(Device info:, info) console.log(Device id:, id) } catch (e) { console.error(Device plugin error:, e) } } load() }, []) // ... 渲染部分追加设备信息区块 return ( {/* 原有 UI */} {device ( div classNamedevice-info h2Device Info (Capacitor OHOS)/h2 ul liname: {device.info.name}/li limodel: {device.info.model}/li liplatform: {device.info.platform}/li lioperatingSystem: {device.info.operatingSystem}/li liosVersion: {device.info.osVersion}/li limanufacturer: {device.info.manufacturer}/li liisVirtual: {String(device.info.isVirtual)}/li limemUsed: {device.info.memUsed} bytes/li liidentifier (ODID): {device.id.identifier}/li libatteryLevel: {device.battery.batteryLevel ?? N/A}/li liisCharging: {String(device.battery.isCharging)}/li lilanguageTag: {device.lang.value}/li /ul /div )} / ) }一次并发调用四个 API覆盖插件的全部五类能力中的四类getInfo / getId / getBatteryInfo / getLanguageTag。第 3 步构建 → 同步 → 编译 HAPCapacitor 标准三连注意每次改完前端都要重新 buildui synchionic buildui# vite build → dist/233KB JShionicsyncopenharmony# dist → rawfile/www/同时刷新插件注册# 编译鸿蒙工程cdopenharmonyexportDEVECO_SDK_HOME/Applications/DevEco-Studio.app/Contents/sdkexportPATH.../tools/hvigor/bin:.../tools/node/bin:.../tools/ohpm/bin:$PATHhvigorw assembleHap--modemodule-pmoduleentrydefault-pproductdefault\-prequiredDeviceTypephone --no-daemon输出 hvigor Finished :entry:defaultSignHap... after 917 ms hvigor BUILD SUCCESSFUL in 4 s 896 ms 41 tasks in total: 32 executed, 9 up-to-date注意这次编译比上次多了Device.cpp的 NAPI 编译任务32 executed vs 上次 26签名配置沿用 DevEco 自动签名直接产出signed HAP。第 4 步安装到模拟器并运行hdc list targets# 127.0.0.1:5555hdcinstall-ropenharmony/entry/build/default/outputs/default/entry-default-signed.hap# [Info] install bundle successfullyhdc shell aa start-aEntryAbility-bcom.nutpi.MyApp# start ability successfully.第 5 步验证日志验证hdc shell hilog -x | grep ARKWEB-CONSOLE——插件调用真实发生并返回ARKWEB-CONSOLE: Device info: [object Object] ← Device.getInfo() 成功 ARKWEB-CONSOLE: Device id: [object Object] ← Device.getId() 成功截图验证hdc shell snapshot_display -f /data/local/tmp/cap_device.jpeghdc file recv页面完整渲染出设备信息字段模拟器返回值说明name / modelemulatorplatform / operatingSystemHarmonyOS插件正确上报鸿蒙平台osVersionOpenHarmony-7.0.0.105模拟器 ROM 版本manufacturerHUAWEIisVirtualtrue正确识别模拟器真机应为 falsememUsed336972 bytes应用内存占用四、桥接链路解析一次Device.getInfo()调用的完整数据流React (App.jsx) │ Device.getInfo() ← capacitor/device 官方 API 层跨平台一致 ▼ capacitor.js / native-bridge.js ← rawfile/www/ 下的桥接脚本 │ JSON 消息 {plugin:Device, method:getInfo} ▼ ArkWeb Web 组件拦截 → ArkTS 容器层 ▼ capacitor.plugins.json 注册表 → 找到 classpath Device ▼ Device.etsArkTS→ Device.cppC/NAPI编译进 libcapacitor.so │ 调用 OpenHarmony 系统 APIohos.deviceInfo / batteryInfo / i18n ▼ 结果 JSON 回传 → Promise resolve → React setState → 页面渲染关键点API 契约不变getId()在 OHOS 上返回 ODIDOpenHarmony 设备标识Android 返回 GUIDiOS 返回 UIDevice identifier——语义等价Web 层无感注册表驱动capacitor.plugins.json的pkg/classpath映射是插件查找的依据这就是为什么手动接入时漏掉第①步会导致插件调用无响应编译双链ArkTS 文件要进runtimeOnly.sourcesC 要进 CMake漏一个都会在运行时报 “plugin not found” 或编译期报符号缺失。五、踩坑复盘本项目插件环节很顺利hionic 自动化程度高但有几个易错点值得记录#易错点现象规避方法1改了前端忘记 sync模拟器上跑的还是旧页面每次 buildui 后必须hionic sync openharmony再重新 hvigorw 编译2混淆 hionic 插件安装方式以为要按 README手动引入四步走命令行安装hionic plugin add会自动完成四步手动引入仅用于 hionic 无法处理的特殊插件3console.log 看不到输出ArkWeb 的 console 走 hilog用hdc shell hilog -x | grep ARKWEB-CONSOLE查看 WebView 内日志4截图时机应用启动有加载过程aa start后 sleep 3 秒再snapshot_display5前置条件Device.cpp 编译失败确认上一篇的 openssllibs 头文件已集成——capacitor 原生库与插件共享同一 CMake 工程六、总结在鸿蒙上给 Capacitor 应用装插件核心路径可以概括为三步走1. 一条命令 ── hionic plugin add capacitor/xxx四项工程修改全自动 2. 零改动 ── React 层 import 原包调用API 与 Android/iOS 完全一致 3. 三连循环 ── buildui → sync → hvigorwhilog snapshot 验证以capacitor/device为样板验证后CPF-Ionic 清单里的其余 40 插件camera、geolocation、filesystem……都可按同样路径接入。唯一需要留意的差异是各插件 README 中标注的权限要求如 geolocation 需在 module.json5 声明定位权限及 reason——device 插件无需权限是最适合作为首个验证的插件。参考文档ionic-readmeCPF-Ionic 插件总清单CPF-Ionic 组织主页AtomGitcapacitor-device 仓库Capacitor Device 插件官方文档

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑