1、HarmonyOS 在一个类中,怎么初始化一个BigInt类型的属性?
可以通过BigInt关键字来初始化,如:
let a = BigInt(1); let b = BigInt("2");
关于Uint8Array与string互转,示例:
// string 转Uint8Array
//1得到输入的数据字符串
let text1 = "hello world"
//2创建ArrayBuffer对象
let buf = new ArrayBuffer(text1.length*2);
//使用typeArray中的Uint16Array方法设置数据
let uint8 = new Uint8Array(buf);
//使用循环设置数据
for(let i =0;i<text1.length;i++){
//使用charCodeAt字符转为二进制编码
uint8[i] = text1.charCodeAt(i);
}
console.log('uint8----',uint8)
// Uint8Array --> **string**
let spArray = uint8.slice(0,3);
let dataString = '';
for (let i = 0; i < spArray.length; i++) {
dataString += String.fromCharCode(spArray[i]);
}
console.log('dataString-----',dataString)
2、不同的hap使用相同的so,在打最终包的时候可以进行合并吗?包体积因为相同so的问题 减少包体积
减小应用包大小是提升应用下载、安装体验的重要方式之一。通过压缩、精简或者复用应用中的代码或资源,可以有效降低应用的大小,提升应用下载和安装速度,减少系统空间占用。
开发者可以参考下面三种方法减小应用包大小:
配置so压缩选项,通过压缩so库来减小应用包大小。应用存在多包(HAP、HSP)的场景时,可以使用HSP(Harmony Shared Package)动态共享包在应用的多个包(HAP、HSP)之间共享代码和资源,消除使用HAR(Harmony Archive)静态共享包造成的多包(HAP、HSP)间代码和资源的重复拷贝,从而减小应用包大小。使用扫描工具扫描分析App、HAP、HSP包,根据输出的检测报告,采取相应措施优化应用。减小应用包大小的方法配置so压缩选项当前DevEco Studio默认打包应用时不压缩so库文件,配置so压缩选项后,DevEco Studio会将so库文件以压缩形式打包到包中,从而减小应用包大小。
修改应用模块配置文件module.json5中的compressNativeLibs字段,将值配置为true,重新编译、打包应用。{"module": {// ..."compressNativeLibs": true // 标识libs库以压缩存储方式打包}}
so压缩效果
以DevEco Studio中C++默认库文件为例,压缩前后的文件大小对比如下:
文件名 原始大小 压缩后大小 压缩率armeabi-v7a/libc++_shared.so 1,108k 386k 34%
多包场景下使用HSP共享代码和资源当前系统提供了两种共享包,HAR(Harmony Archive)静态共享包和HSP(Harmony Shared Package)动态共享包。
HAR与HSP都是为了实现代码和资源的共享,都可以包含代码、C++库、资源和配置文件,最大的不同之处在于:HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝;而HSP中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份。
在多包场景下,如果应用的多个HAP或HSP包使用HAR包实现代码和资源的共享,那么打包后的每个HAP或HSP包中都会存在一份共享HAR包的拷贝,导致App包中存在冗余代码和资源。应用模块HAP1和HAP2/HSP1都引用了HAR2和HAR3,打包后,App包中HAR2和HAR3存在多份重复拷贝,体积较大。
这种场景下,推荐开发者使用HSP代替HAR实现代码和资源共享。使用HSP2对原应用进行升级改造,打包后,App包中HAR2和HAR3只存在一份拷贝,HAR2、HAR3总大小大于HSP(11k)时,可以减小应用包大小。
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/tools/app-check-tool.md
使用扫描工具分析应用包扫描工具可用于分析检测应用包,根据不同的参数设定,扫描指定路径的App、HAP、HSP包内容并输出检测结果报告,为开发者优化包结构或排查问题提供数据支撑。目前扫描工具支持以下几种分析统计:
扫描重复文件。扫描超出指定大小的文件。统计分析各类型文件的总大小和占比。根据扫描结果按照如下方式优化应用
重复文件
同一包内有重复资源,删除重复资源。多包(HAP、HSP)间重复资源,可以使用HSP实现资源的复用。较大文件
确认是否为应用必需,是否可删除。JPG、PNG、GIF等文件,可以考虑压缩。特定类型文件
so文件,通过配置so压缩选项来实现压缩打包。JPG、PNG、GIF等文件,可以考虑压缩。
3、HarmonyOS Tabs嵌套Grid问题?
tabs 的tabcontent 使用grid容器,Grid的元素个数不固定,导致各个tabcontent内容高度不对定,遇到的问题是,tabcontent 总是成了元素对多的高度,导致元素少的也很高,求支援
由于TabContent组件不支持设置通用高度属性,其高度由Tabs父组件高度与TabBar组件高度决定,tabs不能自适应高度。 Grid组件,rowsTemplate、columnsTemplate都不设置时layoutDirection、maxcount、minCount、cellLength才生效,maxCount内的值为多少,对应方向上最大显示行数就是多少,可以理解为maxCount有一个高度控制开关,只要设置了maxCount之后,Grid就能实现自适应高度效果,具体使用方式请参考文档:
https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-grid-V5#示例6
@Entry
@Component
struct Index {
@State numbers: string[] = []
aboutToAppear() {
for (let i = 1; i <= 35; i++) {
this.numbers.push(i + '')
}
}
build() {
Scroll() {
Column({ space: 5 }) {
Blank()
Text('rowsTemplate、columnsTemplate都不设置layoutDirection、maxcount、minCount、cellLength才生效')
.fontSize(15)
.fontColor(0xCCCCCC)
.width('90%')
Grid() {
ForEach(this.numbers, (day: string) => {
GridItem() {
Text(day).fontSize(16).backgroundColor(0xF9CF93)
}.width(40).height(80).borderWidth(2).borderColor(Color.Red)
}, (day: string) => day)
}
.columnsGap(10)
.rowsGap(10)
.backgroundColor(0xFAEEE0)
.maxCount(6)
.minCount(2)
.cellLength(0)
.layoutDirection(GridDirection.Row)
.backgroundColor(Color.Blue)
}.width('90%').margin({ top: 5, left: 5, right: 5 }).align(Alignment.Center)
}
}
}
5、HarmonyOS 有没有适老年化的最佳实践或demo?
有没有适老年化的最佳实践或demo,在系统设置中调大字体后,应用内的布局将非常丑陋。希望有一个最大和最小的字号,无论用户怎么调整,字号只会在这两个值范围内变化。maxFontSize和minFontSize配合maxLine并不起作用。
// xxx.ets
import measure from '@ohos.measure'
@Entry
@Component
struct TextInputExample {
@State text: string = ''
@State truncatedHint: string = "文本未截断"
controller: TextInputController = new TextInputController()
build() {
Column() {
TextInput({ text: this.text, placeholder: 'input your word...', controller: this.controller })
.placeholderColor(Color.Grey)
.placeholderFont({ size: 14, weight: 400 })
.caretColor(Color.Blue)
.width(400)
.height(40)
.margin(20)
.fontSize(14)
.fontColor(Color.Black)
.onChange((value: string) => {
this.text = value
let textSizeShow1 : SizeOptions = measure.measureTextSize({
textContent: this.text,
constraintWidth: 100,
fontSize: 14,
overflow: TextOverflow.Ellipsis,
maxLines: 2
})
let textSizeShow2 : SizeOptions = measure.measureTextSize({
textContent: this.text + " ",
constraintWidth: 100,
fontSize: 14,
overflow: TextOverflow.Ellipsis,
maxLines: 2000000
})
console.log("tag textSizeShow1.height="+ textSizeShow1.height);
console.log("tagtextSizeShow2.height="+ textSizeShow2.height);
if (textSizeShow2 && textSizeShow1 && textSizeShow2?.height && textSizeShow1?.height && (textSizeShow2?.height > textSizeShow1?.height)) {
console.log("tag 文本截断")
this.truncatedHint = "文本截断"
} else {
console.log("tag文本未截断")
this.truncatedHint = "文本未截断"
}
})
Text(this.text)
.maxLines(2)
.width(100)
.textOverflow({overflow: TextOverflow.Ellipsis})
.border({ width: 1 })
.minFontSize(14)
.maxFontSize(24)
Text(this.truncatedHint)
}.width('100%')
}
}
5、编译release包失败?
hvigor Finished :entry:default@PackageHap... after 571 mshvigor Finished :entry:default@SignHap... after 2 s 68 ms
hvigor Finished :entry:assembleHap... after 1 mshvigor Finished ::MakeProjectPackInfo... after 3 ms
hvigor Finished ::GeneratePackRes... after 1 ms
hvigor ERROR: Failed ::PackageApp...
hvigor ERROR: Tools execution failed.
2024/06/17 16:55:38.923 - Ohos BundleTool [Error]: debug is different.
2024/06/17 16:55:38.923 - Ohos BundleTool [Error]: some app variable is different.
2024/06/17 16:55:38.923 - Ohos BundleTool [Error]: Compressor::compressAppMode compress failed.
2024/06/17 16:55:38.926 - Ohos BundleTool [Error]: Compressor::compressProcess Bundle exception.
2024/06/17 16:55:38.926 - Ohos BundleTool [Error]: Compressor::compressProcess compress failed.2024/06/17 16:55:38.926 - Ohos BundleTool [Error]: CompressEntrance::main exit, compress failedDetail: Please check the message from tools.hvigor ERROR: BUILD FAILED in 23 s 837 ms
出现这种问题是多模块引用时,各模块 app.json5的vendor字段不一致导致。打包时应用了哪些模块,排查方法如下:
- File-> Setttings -> Build, Execution, Deployment -> Build Tools -> Hvigor 中将 Use log level 改成Debug。
- 重新执行 Build apps
- Build 日志中搜索 "app_packing_tool"入参:--hap-path、--hsp-path,可得构建app时所有依赖的hsp和hap
- hsp和hap的vendor要一致。
以我本地DevEco编译时,build日志检索结果如下:
hvigor DEBUG BasePackAppTask Use tool [PackageApp]['java','-Dfile.encoding=GBK','-jar',
'D:\DevEco_pakage\Huawei\harmonyos\HarmonyOS-NEXT-DP1\base\toolchains\lib\app_packing_tool.jar','--mode','app','--pack-info-path','D:\demo\MyApplication\build\outputs\default\pack.info','--hap-path',
'D:\demo\MyApplication\entry\build\default\outputs\default\app\entry-default.hap','--hsp-path',
'D:\demo\MyApplication\library\build\default\outputs\default\app\library-default.hsp','--force','true','--out-path',
'D:\demo\MyApplication\build\outputs\default\MyApplication-default-unsigned.app','--main-module-limit','2','--normal-module-limit','2']
具体安装配置流程,请参考:https://developer.huawei.com/consumer/cn/doc/app/agc-help-harmonyos-internalrelease-0000001756878768