HarmonyOS鸿蒙Next的SDK内部资源获取异常问题?

HarmonyOS鸿蒙Next的SDK内部资源获取异常问题? HarmonyOS 的SDK内部资源获取异常问题?Har包内字符串资源相互获取异常,无法通过正常的API(resource.getStringSync)接口进行资源获取。目前SDK情况如下:

Har包A持有真实的资源信息,且能获取Resource,Har包B提供了一个通用的资源获取方法,入参为Resource,通过resourceManager.getStringSync,目前通过getStringByNameSync来解决。

在问题1修复方案上,提供给客户包的时候发现,Har包的传递依赖资源无法获取,客户对SDK封装成了一个Har工程bizHar,entry工程依赖客户必须在entry主工程dependencies中在我们提供的所有Har包资源才能获取。


更多关于HarmonyOS鸿蒙Next的SDK内部资源获取异常问题?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

目前整体分析如下:

  1. 对于HAP包自带全局Context,对应resourceManager的接口只会读取HAP下的resource资源;
  2. 对于HSP包需要使用createModuleContext(moduleName)创建独立的Context,对应resourceManager的接口只会读取HSP下的resource资源;
  3. 对于HAR包,目前没有自己的context,所以resourceManager像getStringValue这种接口会报资源找不到 — 当前问题根因;

该问题对策如下:

以字符串举例,HAR包可以通过resourceManager的getStringByNameSync接口获取到字符串文本,但是有个规则:

  1. 如果是HAP包直接依赖的HAR包,则需要使用getContext().resourceManager来获取resourceManager;
  2. 如果是HSP包直接依赖的HAR包,这需要使用getContext().createModuleContext(moduleName).resourceManager来获取resourceManager;

参考示例如下

import { Context } from '@kit.AbilityKit';

/**
 * 对外暴露资源名称
 */
export enum HarStringName {
  PAGE_SHOW = 'page_show',
  PAGE_SHOW_SUMMARY = 'page_show_summary'
}

/**
 * 封装一个单例类,用于har包对外暴露资源文件。
 * 对外暴露的字符串名称需要做限制,这里做了枚举限制。
 */
export class ResUtils {
  private static sResUtils?: ResUtils;
  private mContext?: Context;
  private mModuleName?: string;

  private ResUtils() {
  }

  public static getInstance(): ResUtils {
    if (!ResUtils.sResUtils) {
      ResUtils.sResUtils = new ResUtils();
    }
    return ResUtils.sResUtils;
  }

  public getStringByNameSync(stringName: HarStringName) {
    let pageShowRes = $r(`app.string.${stringName}`);
    let stringValue: string | undefined = undefined;
    try {
      // 这里主要是为了创建 mContext
      if (!this.mContext || !this.mModuleName || pageShowRes.moduleName !== this.mModuleName) {
        this.mModuleName = pageShowRes.moduleName;
        this.mContext = getContext().createModuleContext(pageShowRes.moduleName);
      }
      // 目前只能使用该接口获取资源
      stringValue = this.mContext?.resourceManager.getStringByNameSync(stringName);
    } catch (error) {
      console.warn('getStringByNameSync, error: ' + error);
    }
    console.debug('stringName: ' + stringValue);
  }
}

更多关于HarmonyOS鸿蒙Next的SDK内部资源获取异常问题?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next的SDK中,资源获取异常通常与资源ID的引用或资源文件的配置有关。开发者需检查以下方面:

  1. 资源ID引用:确保在代码中引用的资源ID与资源文件中定义的ID一致。资源ID不一致会导致系统无法找到对应资源,抛出异常。

  2. 资源文件配置:检查resources目录下的资源文件(如elementmedia等)是否正确配置。资源文件格式错误或路径不正确会导致资源加载失败。

  3. 多语言支持:若应用支持多语言,需确保每种语言对应的资源文件都存在且配置正确。缺少某种语言的资源文件会导致系统在加载该语言资源时抛出异常。

  4. 资源缓存:HarmonyOS会缓存资源以提高性能,若资源文件更新后未及时清理缓存,可能导致系统加载旧资源,引发异常。开发者可通过清除缓存或重启设备解决。

  5. 权限问题:部分资源(如媒体文件)可能需要特定权限才能访问。若应用未申请相应权限,访问这些资源时会抛出异常。

开发者应根据异常日志定位问题,修复后重新编译运行。

在HarmonyOS鸿蒙Next开发中,SDK内部资源获取异常可能由以下原因引起:

  1. 资源路径错误:确保资源路径正确,特别是在多模块项目中,路径需准确指向资源文件。

  2. 资源未打包:检查资源文件是否包含在构建输出中。使用build.gradlepom.xml确保资源文件被正确打包。

  3. 权限问题:某些资源访问可能需要特定权限,确保在AndroidManifest.xmlconfig.json中声明了所需权限。

  4. 资源ID冲突:确保资源ID唯一,避免冲突,特别是在多模块或第三方库集成时。

  5. 缓存问题:清理项目并重新构建,有时缓存可能导致资源加载异常。

  6. SDK版本兼容性:确保使用的SDK版本与开发环境兼容,及时更新SDK和开发工具。

通过以上步骤,可以有效排查和解决SDK内部资源获取异常问题。

回到顶部