本文主要记录一下,开发鸿蒙应用中遇到的印象比较深刻的问题,在找相应的解决方案的时候,也花费了不少精力。记录一下,如果有遇到相似的问题的小伙伴可以共同交流下。
鸿蒙静态库开发,包体积异常变大问题
在开发静态库(.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;
}