• 作者:老汪软件技巧
  • 发表时间:2024-08-22 04:04
  • 浏览量:

本文主要记录一下,开发鸿蒙应用中遇到的印象比较深刻的问题,在找相应的解决方案的时候,也花费了不少精力。记录一下,如果有遇到相似的问题的小伙伴可以共同交流下。

鸿蒙静态库开发,包体积异常变大问题

在开发静态库(.har)的时候,我们需要引用一个第三方的har包,第三方的的har包大小为 400KB,我们发布自己的har包时,发现我们的包体积达到了 1.1M,包体积异常变大了。

查看静态库结构,发现引用了两份第三方库

在oh-package.json5中,是通过file的形式引入的,将har包放在了ets的目录下了

分析问题:

ets目录下存放的源码,har在打包的时候,默认把ets目录下的所有文件进行拷贝,然后会将 dependencies下 file引用的文件拷贝到静态库根目录下的Hars文件夹中。这样会导致同一份har包会拷贝两份。

解决方案

将本地引用的har包放到 src目录下

引用路径改为

"dependencies": {
  "xxxxxx": "file:./src/Hars/xxxxxx-1.0.0.har"
},

这样在打包发布之后,就不会存在两份的问题了

CustomDialogController 设置透明背景

使用 CustomDialogController来显示弹窗时,系统默认会有毛玻璃效果,导致无法设置成透明的背景,可以将 backgroundBlurStyle 设置为 BlurStyle.NONE

new CustomDialogController({
  builder: SwitchDialog(),
  width: 260,
  alignment: DialogAlignment.Center,
  autoCancel: false,
  cornerRadius:borderRadiuses(8),
  maskColor: "rgba(0,0,0,0.60)",
  backgroundBlurStyle: BlurStyle.NONE
})

获取App的应用名

通过bundleInfo.appInfo.label获取到的值为 $string:app_name,需要通过 labelId在资源管理里面去查询下,才能得到app的应用名。

appName(){
  const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
  const label = getContext(this).resourceManager.getStringSync(bundleInfo.appInfo.labelId)
  return label
}

将Resource中的图片转化为PixelMap

private async getResourceContentPixelMap(resource: Resource){
  let data =  await getContext(this).resourceManager.getMediaContent(resource)
  let arrayBuffer = data.buffer.slice(data.byteOffset, data.byteLength + data.byteOffset)
  let fontImageSource: image.ImageSource = image.createImageSource(arrayBuffer);
  let fontValue =  await fontImageSource.getImageInfo();
  let fontOpts: image.DecodingOptions = {
    editable: true,
    desiredSize: {
      height: fontValue.size.height,
      width: fontValue.size.width
    }
  };
  let fontPixelMap =  await fontImageSource.createPixelMap(fontOpts)
  return fontPixelMap
}

将Base64图片转化为PixelMap


import { util } from '@kit.ArkTS';
private async base64ToPixelMap(imageBase64: string){
  let helper = new util.Base64Helper();
  let buffer: ArrayBuffer = helper.decodeSync(imageBase64, util.Type.MIME).buffer as ArrayBuffer;
  let imageSource = image.createImageSource(buffer);
  let opts: image.DecodingOptions = { editable: true };
  let pixelMap = await imageSource.createPixelMap(opts);
  return pixelMap;
}