【每日学点鸿蒙知识】初始化BigInt、包体积瘦身、Tabs嵌套Grid、老年化适配、Release打包失败

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库文件以压缩形式打包到包中,从而减小应用包大小。

配置方法:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/module-configuration-file.md

修改应用模块配置文件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字段不一致导致。打包时应用了哪些模块,排查方法如下:

  1. File-> Setttings -> Build, Execution, Deployment -> Build Tools -> Hvigor 中将 Use log level 改成Debug。
  2. 重新执行 Build apps
  3. Build 日志中搜索 "app_packing_tool"入参:--hap-path、--hsp-path,可得构建app时所有依赖的hsp和hap
  4. 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

相关推荐
李游Leo2 小时前
自学记录HarmonyOS Next DRM API 13:构建安全的数字内容保护系统
安全·华为·harmonyos
李游Leo3 小时前
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
学习·华为·harmonyos
轻口味6 小时前
【每日学点鸿蒙知识】渐变效果、Web组件注册对象报错、深拷贝list、loadContent数据共享、半屏弹窗
前端·list·harmonyos
轻口味7 小时前
【每日学点鸿蒙知识】子窗口方向、RichEdit不居中、本地资源缓存给web、Json转对象丢失方法、监听状态变量数组中内容改变
前端·缓存·harmonyos
二流小码农7 小时前
鸿蒙开发:自定义一个英文键盘
android·ios·harmonyos
二流小码农7 小时前
鸿蒙开发:自定义一个股票代码选择键盘
android·ios·harmonyos
鸿蒙自习室7 小时前
鸿蒙UI开发——全局自定义弹窗实现
ui·华为·harmonyos·鸿蒙
塞尔维亚大汉8 小时前
【OpenHarmony】 鸿蒙 UI动画开发之ohos-svg
harmonyos·arkui
轻口味9 小时前
【每日学点鸿蒙知识】图片base64、最先hap包下载、RN获取定位、app安装、SNAPSHOT组件管理
华为·harmonyos