【每日学点鸿蒙知识】so 库瘦身、IDE 内存配置、判断前后台呢

server/2025/1/12 1:55:55/

1、如何减小编译产物so大小?

如果是在cmake命令中构建,在CMakeLists.txt中添加CMake编译参数和C++编译器参数
1、设置构建类型为Release,这将关闭debug调试信息

set(CMAKE_BUILD_TYPE Release)

2、-s 剥离符号表信息

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s")

如果是DevEco Studio IDE中集成,则在 externalnativeoptions 配置编译参数和编译器参数
模块级build-profile.json5中 externalNativeOptions 参数是NDK工程C/C++文件编译配置的入口,可以通过path指定CMake脚本路径、arguments配置CMake参数、cppFlags配置C++编译器参数、abiFilters配置编译架构等。

"externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": "-DCMAKE_BUILD_TYPE=Release","cppFlags": "-s",
}

2、如何判断应用处于前台还是后台?

有没有判断前后台的API 在切换到前后台时有回调吗?
可以使用ApplicationContext.on注册对当前应用前后台变化的监听:
https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-inner-application-applicationcontext-V5

或者appManager.getRunningProcessInformation获取当前运行进程的有关信息:
https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-app-ability-appmanager-V5#ZH-CN_TOPIC_0000001893370457__appmanagergetrunningprocessinformation

3、如何调整 IDE 内存大小?

AndroidStudio 中 gradle.properties 中 org.gradle.jvmargs 可以设置IDE占用内存大小,DevEco有没有类似配置呢?
在hvigor-config.json5中修改maxOldSpaceSize字段,根据工程的大小,适当将其增大(如设置为8192)

"nodeOptions": {"maxOldSpaceSize": 8192
}

4、如何处理tabs嵌套web滑动场景?

tabs组件嵌套web组件滚动场景会出现下面问题:

  1. web页上下滑动的时候会误触发tab页翻页手势
  2. tab页切换时web组件还可以上下滚动
  • 问题1:可以通过给web组件设置嵌套滚动nestedScroll属性解决
  • 问题2:可以通过给web组件设置网页是否允许滚动setScrollable属性解决

参考代码:

import web_webview from '@ohos.web.webview';
import business_error from '@ohos.base';@Component
@Entry
struct TabWebPage2 {@State message: string = 'Hello World';private tabsController = new TabsController();private currentIndex: number = 0;private webviewController: web_webview.WebviewController = new web_webview.WebviewController();private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.Vertical })// 控制滑动页面进行页面切换@State flag: boolean = truebuild() {Tabs({ barPosition: BarPosition.End, controller: this.tabsController }) {TabContent() {Web({ src: 'https://m.xxx.com/', controller: this.webviewController })// 设置嵌套滚动.nestedScroll({scrollForward: NestedScrollMode.PARENT_FIRST,scrollBackward: NestedScrollMode.SELF_FIRST})}.tabBar(this.tabBuilder('首页', 0))TabContent() {Column() {Text("发现")}.width('100%').height('100%')}.tabBar(this.tabBuilder('发现', 1))TabContent() {Column() {Text("推荐")}.width('100%').height('100%')}.tabBar(this.tabBuilder('推荐', 2))TabContent() {Column() {Text("我的")}.width('100%').height('100%')}.tabBar(this.tabBuilder('我的', 3))}.onChange((index: number) => {this.currentIndex = index;}).scrollable(this.flag).onAnimationStart((index: number, targetIndex: number, event: TabsAnimationEvent) => {}).onAnimationEnd((index: number, event: TabsAnimationEvent) => {// 切换动画结束时触发该回调,设置web组件可以滑动this.webviewController.setScrollable(true)}).onGestureSwipe((index: number, event: TabsAnimationEvent) => {// 在页面跟手滑动过程中,逐帧触发该回调,设置tab页切换的时web页无法上下滑动this.webviewController.setScrollable(false)})}@BuildertabBuilder(title: string, targetIndex: number) {Column() {Text(title).fontColor(this.currentIndex === targetIndex ? '#1698CE' : '#6B6B6B')}.width('100%').height(50).justifyContent(FlexAlign.Center)}
}

5、Marquee 组件的文字滚动,第一次滚动出现大量空白,如何避免空白出现?

Marquee 组件在文本滚动时,文本滚动到控件的开头,会造成大量空白,如何实现让文本末尾滚动到控件末尾时停止,避免空白出现呢?

Marquee 目前不支持在文本末尾停止,可以使用 scroll 代替跑马灯组件实现文字滚动。

示例代码:

@Observed
class NewsTitle {public title: stringconstructor(title: string) {this.title = title;}
}@Entry
@Component
struct Index {@State textList: string[] = ['this is a test string1 this is a test string1 this is a test string1','this is a test string2 this is a test string2','this is a test string3 this is a test string3 this is a test string3 this is a test string3',]@State count: number = 1;build() {Row() {Column() {myMarqueeCard({textList: $textList,updateList: () => {this.textList = [`这是测试数据${this.count++}这是测试数据${this.count++}这是测试数据${this.count++}这是测试数据${this.count++}`,`这是测试数据${this.count++}这是测试数据${this.count++}这是测试数据${this.count++}`,`这是测试数据${this.count++}这是测试数据${this.count++}这是测试数据${this.count++}这是测试数据${this.count++}这是测试数据${this.count++}`,]}})}.width('100%').margin(20)}.height('100%')}
}class Tmp {text: string = ''scroller: Scroller = new Scroller()
}@Component
struct myMarqueeCard {@Link @Watch('handleNewList') textList: string[]@State list: string[] = [];scroller1: Scroller = new Scroller()scroller2: Scroller = new Scroller()scroller3: Scroller = new Scroller()updateList?: () => voidhandleNewList() {console.log(JSON.stringify(this.textList))}build() {Column() {this.SingleText({ text: this.textList[0], scroller: this.scroller1 })this.SingleText({ text: this.textList[1], scroller: this.scroller2 })this.SingleText({ text: this.textList[2], scroller: this.scroller3 })}}@BuilderSingleText($$: Tmp) {Scroll($$.scroller) {Row() {Text($$.text).fontSize(30).onAppear(() => {this.handleScroll($$.scroller)})}}.width(300).scrollable(ScrollDirection.Horizontal).enableScrollInteraction(false).scrollBar(BarState.Off)}handleScroll(scroller: Scroller) {let timer: number = setInterval(() => {const curOffset: OffsetResult = scroller.currentOffset()scroller.scrollTo({xOffset: curOffset.xOffset + 50, yOffset: curOffset.yOffset, animation: {duration: 1000,curve: Curve.Linear}})if (scroller.isAtEnd()) {// clearInterval(timer);if (this.scroller1.isAtEnd() && this.scroller2.isAtEnd() && this.scroller3.isAtEnd()) {// 其他操作if (this.updateList) {this.scroller1.scrollTo({ xOffset: 0, yOffset: 0, animation: { duration: 0 } })this.scroller2.scrollTo({ xOffset: 0, yOffset: 0, animation: { duration: 0 } })this.scroller3.scrollTo({ xOffset: 0, yOffset: 0, animation: { duration: 0 } })this.updateList()}}}}, 500)}
}

http://www.ppmy.cn/server/157631.html

相关文章

iChainfo 品牌升級為 ichaingo,打造 Web3 數據基礎設施新標杆

Web3 數據基礎設施服務商 iChainfo 今⽇正式宣佈,全新名稱 「ichaingo」 重磅登場,新的官⽅網站 ichaingo.com 正式上線。此次品牌升級基於 Web3 ⾏業的發展趨勢和公司⾃⾝的戰略布局,旨在為全 球⽤戶提供更準確、即時、全⾯、深⼊的 Web3 數…

[Qt] 多元素控件 | 容器类控件 | 布局管理器layout

目录 一.多元素控件 1、List Widget 【使用 ListWidget】 2、Table Widget 【使用 QTableWidget】 3、Tree Widget 【使用 QTreeWidget】 二、容器类控件 1、Group Box 【给麦当劳案例加上分组框】 2、Tab Widget 【使用标签页管理多组控件】 三、布局管理器 1、…

微信小程序中使用weui组件库

这里只介绍官方推荐的通过useExtendedLib扩展库的方式引入,这种方式引入的组件将不计入代码包的大小。 app.json中配置 {"useExtendedLib": {"kbone": true,"weui": true} }在使用组件的页面的 json 文件加入 usingComponents 配置字…

DeepSeek-V3与GPT-4o的对比详解

DeepSeek-V3,作为一款引人注目的开源大型语言模型,自其诞生以来,便以卓越的性能和高效的性价比,在AI界掀起了一股新的浪潮。本文将详细介绍DeepSeek-V3的诞生背景、技术优势,以及与顶尖闭源模型GPT-4o的对比&#xff0…

WebRTC 在视频联网平台中的应用:开启实时通信新篇章

在当今这个以数字化为显著特征的时代浪潮之下,实时通信已然稳稳扎根于人们生活与工作的方方面面,成为了其中不可或缺的关键一环。回首日常生活,远程办公场景中的视频会议让分散各地的团队成员能够跨越地理距离的鸿沟,齐聚一堂共商…

CPP-Net模型详解

模型背景 在细胞核分割领域,早期的研究主要依赖于 基于形状模型 和 基于图割 的方法。这些传统方法虽然能在一定程度上解决问题,但存在显著局限性: 基于形状模型的方法需要预先定义形状模板,难以适应多样化的细胞核形态; 基于图割的方法虽能较好处理重叠细胞核,但计算复…

物联网开发 的开发语言建议

对于物联网开发,选择合适的编程语言取决于具体的项目需求、硬件平台以及开发团队的技能。以下是几种常用的物联网开发语言及其适用场景,特别考虑到您当前的工作空间中包含 JavaScript 和 Vue 等技术栈: JavaScript (Node.js) 优点&#xff1a…

BI结合数据分析系统,为企业发展提供坚实的保障

BI商业智能结合数据分析是一个复杂而系统的过程,它涉及数据的收集、处理、分析和呈现等多个环节。数聚就从多年的部署实施经验来详细的阐述BI如何结合数据分析系统,是如何为企业发展奠定基础的。 一、数据集成与清洗 数据集成:BI系统首先需要…