OpenS 是 HarmonyOS 中模块间安全共享调试信息的轻量机制,通过编译期 opens to 声明实现作用域隔离,仅允许白名单模块访问特定调试变量,不暴露 API、不污染全局、不依赖日志。

OpenS 是 HarmonyOS 生态中用于模块间安全共享调试信息的轻量机制,它不依赖全局变量或日志输出,而是通过编译期控制 + 运行时作用域隔离,实现“对内可见、对外不可见”的调试变量共享。关键在于 opens to 语法——它不是运行时 API,而是模块配置层面的显式声明,告诉构建系统:“本模块允许哪些特定模块访问我的调试符号”。
一、明确 opens to 的作用边界
opens to 只影响编译链接阶段的符号可见性,不改变运行时行为。它不导出任何用户可调用的 API,也不生成额外 JS/ArkTS 接口。调试变量(如 __DEBUG_STATE、_mockDataPool)仍保留在模块内部,仅当调用方模块被显式列入 opens to 白名单时,其源码中才能直接引用这些变量名。
它与以下方式有本质区别:
- export const DEBUG = ...:会暴露给所有 import 该模块的代码,包括最终打包进 App 的用户侧逻辑
- window.DEBUG = ... 或 globalThis.__debug:全局污染,极易被用户脚本读取或篡改
- hilog.debug() 或 console.log():仅输出文本,无法被其他模块直接读取、检查或断点调试
二、在 module.json5 中配置 opens to
在提供调试变量的模块(例如 core-debug)的 module.json5 文件中,添加 opensTo 字段:
{
"module": {
"name": "core-debug",
"type": "library",
"description": "内部调试工具集",
"opensTo": ["feature-auth", "feature-payment", "test-runner"]
}
}
其中 feature-auth、feature-payment 是同项目内其他业务模块名;test-runner 是独立的调试测试模块。只有这些模块在构建时才能解析并使用 core-debug 中标记为调试用途的变量。
三、在源码中定义受控调试变量
在 core-debug/src/debugState.ets 中,使用命名约定 + 注释标明调试意图:
// @debug-only: internal state for auth flow tracing export const __AUTH_TRACE_LOG = new Map<string number>(); // @debug-only: mock data registry for payment SDK testing export const _PAYMENT_MOCK_REGISTRY = new Set<string>();</string></string>
注意:不加 export 默认不可见;加了 export 但未被 opensTo 允许的模块,构建时报错“symbol not exported”**,不会静默失败**。
四、消费方模块中安全使用
在已列入 opensTo 的 feature-auth 模块中,可直接导入并调试:
import { __AUTH_TRACE_LOG } from '@ohos/core-debug';
export function login() {
const traceId = Date.now().toString();
__AUTH_TRACE_LOG.set(traceId, 1); // ✅ 合法:模块白名单内
// ...
}
若某第三方 SDK 或用户侧页面(如 pages/login.ets)尝试同样导入,DevEco Studio 编译器会立即报错,且该语句不会进入最终 HAP 包。










