头图

1、背景介绍

在应用开发中会用到各种各样的资源文件,字符串、图片、音视频媒体、颜色值、主题等。字符串有时候会涉及到国际化的东西,而颜色图片可能涉及到主题切换的事情。

做过Android开发的都知道,在Android中有三种资源,一种是参与编译最终通过R文件访问的,放置在res下面,用于存放应用程序的资源,包括图标、GUI布局等。这些资源在打包时会被直接通过aapt(资源文件打包工具)处理,映射到Android工程的R文件中,生成R.资源文件对应的ID,通常都可以通过资源ID访问‌;另一种是raw,在res/raw下面,用于存放原始的、未经处理的资源文件,例如音频文件、视频文件和纯文本文件。这些文件在编译时不会被处理成其他格式,而是以原样保留。最后一种是assets,用于存放需要打包到应用程序的静态文件,以便部署到设备中,assets文件夹下的文件不会被编译成二进制文件,而是按原样复制到设备上‌。

HarmonyOS Next也提供了类似的资源目录,里面存放需要用到颜色、字体、间距、图标等资源,在不同的设备或配置中,这些资源的值可能不同。下面先介绍HarmonyOS Next的资源目录。

2、资源目录介绍

HarmonyOS Next目录分为两种:

  • 资源目录:包含base目录、限定词目录、rawfile目录、resfile目录
  • 资源组目录:包含element、media、profile
    工程中资源结构如下图所示:

image.png

下面介绍下各个目录的作用:

  • base目录:base目录是默认存在的目录,二级子目录element用于存放字符串、颜色、布尔值等基础元素,media、profile存放媒体、动画、布局等资源文件。目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。通过指定资源类型(type)和资源名称(name)访问。类似于Android的res目录。
  • 限定词目录:en_US和zh_CN是默认存在的两个限定词目录,其余限定词目录需要开发者根据开发需要自行创建。二级子目录element、media、profile用于存放字符串、颜色、布尔值等基础元素,以及媒体、动画、布局等资源文件。目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。通过指定资源类型(type)和资源名称(name)来访问。限定词有以下几种:

    • 移动国家码和移动网络码
    • 语言
    • 文字
    • 国家或地区
    • 横竖屏
    • 设备类型
    • 颜色模式
    • 屏幕密度
  • rawfile目录:支持创建多层子目录,子目录名称可以自定义,文件夹内可以自由放置各类资源文件。目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。通过指定文件路径和文件名访问。
  • resfile目录:支持创建多层子目录,子目录名称可以自定义,文件夹内可以自由放置各类资源文件。目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。应用安装后,resfile资源会被解压到应用沙箱路径,通过Context属性resourceDir获取到resfile资源目录后,可通过文件路径访问。

3、资源访问

一般在har包内,可以通过"$r""$rawfile"访问资源:

  • 对于“color”、“float”、“string”、“plural”、“media”、“profile”等类型的资源,通过"$r('app.type.name')"形式访问。其中,app为resources目录中定义的资源;type为资源类型或资源的存放位置;name为资源名,开发者定义资源时确定。
  • 对于rawfile目录资源,通过"$rawfile('filename')"形式访问。其中,filename为rawfile目录下文件的相对路径,文件名需要包含后缀,路径开头不可以"/"开头。
  • 通过本应用上下文获取ResourceManager后,调用不同资源管理接口访问不同资源。例如:getContext().resourceManager.getStringByNameSync('test') 可获取字符串资源;getContext().resourceManager.getRawFd('rawfilepath') 可获取Rawfile所在hap包的descriptor信息,访问rawfile文件时需{fd, offset, length}一起使用。

这里有两个注意点:

  • 对于string.json中使用多个占位符的情况,通过$r('app.string.label','aaa','bbb',444)形式访问。
  • 通过资源id方式获取资源比直接通过资源获取性能更好。

对于跨HAP/HSP包应用资源的访问,通过createModuleContext(context, moduleName)接口创建同应用中不同module的上下文,获取resourceManager对象后,调用不同资源管理接口访问不同资源。通过"$r""$rawfile"访问资源

4、API介绍

资源的访问系统提供了@ohos.resourceManager接口。
首先通过resourceManager.getResourceManager获取首先通过resourceManager,接着可以通过getStringSync、getMediaContent等接口,提供的接口如下图:

image.png
image.png
image.png

5、参考资料

6、总结

HarmonyOS Next提供了类似Android的资源目录,包括base、限定词和rawfile目录。base目录包含编译后的二进制文件,而限定词目录根据不同语言或设备类型存放相应资源。rawfile目录直接打包原始文件,不经过编译。资源可以通过$r$rawfile访问,或者使用ResourceManager接口获取。


轻口味
35.2k 声望5.3k 粉丝

移动端十年老人,主要做IM、音视频、AI方向,目前在做鸿蒙化适配,欢迎这些方向的同学交流:wodekouwei