系列文章目录

【鸿蒙】ArkUI-X跨平台问题集锦



前言

以下问题背景:从ArkUI纯鸿蒙项目——>改造为——>ArkUI-X项目。

问题集锦

1、HSP,HAR模块中 无法引入import bridge from ‘@arkui-x.bridge’;

报错:Cannot find module ‘@arkui-x.bridge’ or its corresponding type declarations. 找不到模块“@arkui-x.bridge”或其对应的类型声明<ArkTS检查>

原因:模块不支持跨平台,所以无法引入。
解决:
(推荐)方案一、
在项目.arkui-x/arkui-x-config.json5文件中,配置模块名称;
例如:
“modules”: [
“arkuix”, “utils”
]
(不推荐)方案二、在entry模块 引入bridge;
其他模块通过线程通讯emitter, 调用桥接 ;

2、CustomDialog 自定义弹窗中的点击事件在Android 中无任何响应;

解决:CustomDialogController 实例化时,不要设置showInSubWindow: true,默认值应为false,表示弹窗仅在应用内显示;

3、调用 buildRouterMode() 路由跳转页面前,必须手动import(‘/*page’)页面。无法自动导入?

解决:entry模块未配置模块动态导入;
参考文档:动态import变量表达式

4、主题Android\iOS未适配沉浸式;

Android应用/Activity主题样式 使用
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

5、华为一键登录控件,不支持跨平台;

解决:自定义华为登录按钮 调用登录API;
参考文档:使用自定义按钮登录

6、webview.registerJavaScriptProxy不支持跨平台,不支持创建H5桥接对象

解决方案:仅鸿蒙用此web,其他平台Android、iOS跳转至原生Web页面实现。
官方说明:当前该api内部已规划需求,请持续关注后续版本更新。

7、平台差异化,代码如何只编译鸿蒙平台 或者Android、iOS平台,避免编译报错,不支持某平台问题;

调整架构设计,参考文档:跨平台应用改造指南

8、关于DevEco Studio编译时报错问题解决,报错:“ xxx can’t support crossplatform application. ”

解决:修改静态编辑检查配置文件 C:\Program Files\Huawei\DevEco Studio\sdk\default\openharmony\ets\build-tools\ets-loader\lib\fast_build\system_api\api_check_utils.js
修改此配置为警告
“CROSSPLATFORM_TAG_CHECK_ERROER,!1,_typescript.default.DiagnosticCategory.Warning”
参考文档:关于DevEco Studio编译时报错问题解决

9、在Android中无法使用JSON解析,报错: Load native module failed, so is @ohos:util.json

[default] Throw error: Cannot read property parse of undefined
[default] at anonymous (arkuix|network|1.0.0|src/main/ets/Request.ts:86:1)

解决方案:
使用JSON,不用导包,导包反而报错,移除以下代码即可;
// import JSON from ‘@ohos.util.json’;
其他API加载失败请参考:异常Load native module failed, so is @ohos

10、DevEco Studio中build App无异常,在Android端启动时闪退,提示找不到ability

报错:ReferenceError: Cannot find module ‘com…/entry/ets/entryability/EntryAbility’ , which is application Entry Point

解决方案:
在项目根目录下build-profile.json5中,将以下代码注释掉;即可正常运行了
// “useNormalizedOHMUrl”: true
相关Issues:如何为纯HarmonyOS项目添加arkuix的支持

11、在Android中,跳转页面,闪退报错 GetModuleBuffer failed.

在Android Studio中报错如下:

 E  [js_module_reader.cpp(47)] GetModuleBuffer failed.
 A  [default] [LoadJSPandaFile:101] resolveBufferCallback get hsp buffer failed, hsp path:/data/storage/el1/bundle/xxx/ets/modules.abc, errorMsg:modulePath:

并且项目‘.arkui-x/android/app/src/main/assets/arkui-x’文件夹下,未生成相应的HSP模块文件;

原因:
1、名为“xxx”的HSP模块,并非是[ArkUI-X]Shared Library类型的模块;这里由于在arkui项目改造为ArkUI-X项目过程中,HSP模块是之前IDE选择"Shared Library"模板创建的,因此不支持跨平台;

解决方案:
方案一:新建HSP模块时选择“[ArkUI-X]Shared Library”,在此基础上进行开发;
在这里插入图片描述
方案二:修改现有项目中的HSP模块,使其支持跨平台。具体步骤如下:
1、在‘.arkui-x/arkui-x-config.json5’文件中配置HSP模块名称;例如:

{
 "crossplatform": true,
 "modules": [
   "entry",
   "libraryHSP"// 此为HSP模块
 ]
}

2、修改HSP模块中的‘hvigorfile.ts’文件,具体内容如下图所示,左侧为普通HSP配置,右侧为跨平台HSP配置;
在这里插入图片描述
跨平台HSP配置:

import { HspTasks } from '@ohos/hvigor-ohos-arkui-x-plugin';

export default {
   system: HspTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */
   plugins:[]         /* Custom plugin to extend the functionality of Hvigor. */
}

12、配置gradle 使用JDK 17后,DevEco Studio 编译APP报错:jlink.exe 不存在

报错信息:

* What went wrong:
Execution failed for task ':app:compileGuanwangReleaseJavaWithJavac'.
> Could not resolve all files for configuration ':app:androidJdkImage'.
   > Failed to transform core-for-system-modules.jar to match attributes {artifactType=_internal_android_jdk_image, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}.
      > Execution failed for JdkImageTransform: D:\Android\Sdk\platforms\android-34\core-for-system-modules.jar.
         > jlink executable C:\Program Files\Huawei\DevEco Studio\jbr\bin\jlink.exe does not exist.

原因:
jlink 是 JDK 的模块化工具(来自 JDK 17+);
而华为 DevEco Studio 的 JBR 是定制化 Java 运行时,可能不包含完整 JDK 工具链;

解决方案
(1)强制指定标准 JDK 路径
在项目的 gradle.properties 中添加:

# 指向 Android Studio 的 JDK 或独立安装的 JDK 17+
org.gradle.java.home=C\:\\Program Files\\Android\\Android Studio\\jbr
# 或
org.gradle.java.home=C\:\\Program Files\\Java\\jdk-17.0.8

(2)最后在DevEco Studio中,清理构建缓存,重新编译APP即可。

13、同步项目时,Ohpm Install 报错:Error: Invalid dependency

报错信息:

ohpm ERROR: Invalid dependency uicomponents@D:\DevEcoStudioProjects\arkui-x\commons\uicomponents -> uicomponents@1.0.0
ohpm ERROR: Found exception: Error: Invalid dependency, reached retry limit or non retryable error encountered.
ohpm ERROR: Invalid dependency utils@D:\DevEcoStudioProjects\arkui-x\commons\utils -> utils@1.0.0
ohpm ERROR: Found exception: Error: Invalid dependency, reached retry limit or non retryable error encountered.
ohpm ERROR: Invalid dependency network@D:\DevEcoStudioProjects\arkui-x\commons\network -> network@1.0.0
ohpm ERROR: Found exception: Error: Invalid dependency, reached retry limit or non retryable error encountered.
ohpm ERROR: Install failed, detail: Error: Invalid dependency

原因:
模块间出现了循环依赖;

解决方案:排查模块的依赖关系,避免出现循环依赖,在模块下的oh-package.json5 中移除冲突的依赖项;例如上述日志中提到,需要排查的“uicomponents”和“utils”模块。

14、页面跳转场景:原生跳跨平台,跨平台跳原生

方式一:用启动Ability的方式拉起原生Activity

// xxx.ets
 let want: Want = {
    bundleName: 'com.example.helloworld',
    moduleName: 'entry', //小写
    abilityName: 'Jump', //首字母大写
    parameters:{id:1,name:'ArkUI-X'} //可选参数
    };
    let context = getContext(this) as common.UIAbilityContext;
    context.startAbility(want, (err, data) => {
    }); 

方式二:用桥接方法/消息方式拉起原生页面;

15、StageActivity()子类内,无法调用注册协定方法:registerForActivityResult()

原因:StageActivity的父类为android.app.Activity,若要使用注册协定,需要父类为 1.7.0 版或更高版本的androidx.activity.ComponentActivity

解决方案:使用传统方法startActivityForResult(@RequiresPermission Intent intent, int requestCode) 启动Activity接收回调。

16、Android平台上传文件至华为OBS失败,错误码400

在使用跨平台文件上传request.uploadFile(getContext(), uploadConfig),上传文件至华为OBS时,遇到400错误,此问题仅出现在Android平台,鸿蒙与iOS无此问题。
在这里插入图片描述

解决方案:需将ArkUI-X的SDK更新至6.0.0版本。ps:目前正式版未发布。

17、如何将IDE使用的ArkUI-X SDK改为使用更高版本?

首先,在IDE中使用的ArkUI-X SDK版本,是与编译的系统SDK版本 一一对应的。
这里以DevEco 5.1.1为例。
项目中的运行操作系统为HarmonyOS,而HarmonyOS SDK版本是与DevEco 版本绑定的,内置在IDE中的,DevEco 5.1.1内置的HarmonyOS SDK API 19,因此项目能配置的最高编译SDK版本为"5.1.1(19)"。
编译SDK版本为19,则对应的ArkUI-X SDK也是19。

在这里插入图片描述
项目根目录下配置文件:build-profile.json5

		// compatibleSdkVersion ≤ targetSdkVersion ≤ compileSdkVersion
        // 指定编译时使用的 SDK 版本。最佳实践:设置为最新稳定版.
        "compileSdkVersion": "5.1.1(19)",
        // 适配的目标系统版本,默认等于 compatibleSdkVersion,最佳实践:设置为最新稳定版.
        "targetSdkVersion": "5.1.1(19)",
        // 兼容的最低系统版本,格式:HarmonyOS 工程:"M.S.F(X)" 格式;OpenHarmony 工程:纯数字格式
        "compatibleSdkVersion": "5.0.1(13)",
        // 运行的操作系统类型:"HarmonyOS":华为鸿蒙系统;"OpenHarmony":开源鸿蒙系统
        "runtimeOS": "HarmonyOS",
  • 那么我们怎么使用ArkUI-X SDK 20的版本?

方案一、
升级IDE。

方案二、(适用于 IDE已最新)
下载新版本arkui-x SDK后,解压替换本地arkui-x 19 SDK,并手动修改sdk中arkui-x.json的配置项: “apiVersion”:从"20"改为 “19”, 最后将项目.arkui-x\android\app\libs下内容删除,重新编译生成lib内容即可。
ps:在IDE设置中,可以看到当前已安装的arkui-x SDK版本。
在这里插入图片描述


总结

以上就是鸿蒙跨平台 开发过程中 遇到的问题,后期会不定时补充,欢迎大家留言交流。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐