这个错误通常发生在你集成了某些第三方SDK(如友盟、支付SDK等)或使用了特定类型的共享包(如字节码HAR或集成态HSP),但你的项目构建配置没有启用必要的支持时。
简单来说,HarmonyOS NEXT 为了优化模块的加载和解析,引入了一种标准化的模块寻址方式(useNormalizedOHMUrl)。一些比较新的、或者经过编译优化的依赖包,强制要求你的工程也必须采用这种新的寻址方式,否则编译器就“不认识”它们,从而报错。
🛠️ 如何解决?—— 启用标准化OHMUrl
修复这个问题的核心步骤,是在你项目根目录下的build-profile.json5文件中,将useNormalizedOHMUrl设置为true。
定位配置文件:在项目根目录下找到
build-profile.json5文件。添加配置:在
app->products对应的配置项中,找到或添加buildOption->strictMode,然后设置"useNormalizedOHMUrl": true。
配置代码示例如下:
json
{ "app": { "products": [ { "compatibleSdkVersion": "5.0.0(12)", "buildOption": { "strictMode": { "useNormalizedOHMUrl": true // 关键配置行 } } } ] } }(配置示例参考自)
⚠️ 开启后的连锁反应
开启这个开关不只是加一行代码那么简单,它会引发一系列构建规则的收紧,你需要对自己的项目代码也做相应的调整。主要体现在以下几点:
依赖名称必须精确匹配:在
oh-package.json5中引用本地模块(如HSP/HAR)时,你定义的别名必须和该模块自身oh-package.json5文件里的name字段完全一致,包括大小写。导入路径检查更严格:
开启后,会默认开启
noExternalImportByPath的严格检查。这意味着,强烈建议你使用模块的导出(export)接口来引用,而不是通过相对路径(../../)或绝对路径直接引用其他模块内部的代码。否则,编译就会报错。
模块名大小写敏感:由于路径解析方式变严格,所有模块的物理目录名、依赖名和代码中的导入语句,其大小写都必须完全一致。
💡 为什么会有这个配置?
这个配置的引入,主要是为了支持更灵活的模块共享方案——集成态HSP(Harmony Shared Package)。
传统的HSP在编译时会和主应用(HAP)的包名(bundleName)和签名强绑定,导致一个HSP很难被不同包名的应用复用。而“集成态HSP”就是为了解决这个问题的中间产物。但使用这种新型HSP以及更高效的字节码HAR,就必须使用标准化的OHMUrl寻址方式,也就是必须开启useNormalizedOHMUrl。当你集成的第三方库使用了这些新技术时,你的工程就必须同步开启以支持它们。
所以,这个报错可以看作是HarmonyOS NEXT生态演进过程中的一个“软强制”升级提示,它推动开发者采用更规范、更先进的模块化开发方式。虽然需要你多花些功夫调整配置和代码,但长期来看,会让你的项目结构更清晰、更易于维护。