Android内存优化项目经验分享 兼顾效率与性能

2024-03-25 20:12

本文主要是介绍Android内存优化项目经验分享 兼顾效率与性能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

        项目上线一段时间后,回顾重要页面 保证更好用户体验及生产效率,做了内存优化和下载导出优化,具体效果如最后的一节的表格所示。

下面针对拍摄流程的两个页面 预览页 导出页优化实例进行介绍:

一.拍摄前预览页面优化

预览效果问题 存在内存回收不及时情况

问题描述

在预览页面两分钟的情况时: 内存回收不及时 会持续上涨到阈值 才会触发回收情况

对比图

处理前 AddCaptureActivity

处理后 AddCaptureActivity

原因

预览图未及时清除 到达阈值的时候才会回收

解决方案

对临时预览图不光置空 还要对其标记回收

效果

减少40%常驻值

后续提升

针对低性能设备可以降低预览视频 帧率及分辨率

二.拍摄保存页面

目标

业务目标:在减少导出时间 减少预览加载时间

技术目标:兼顾效率的情况下内存优化

现状

进入页面会加载预览图(全屏可滑动的全景图 ),点击下方保存按钮会下载图片。

需要导出的图片规格 6720x3360

预览组件

在compose下用个webview实现 下载好了图片转为base64通过js桥传到web中 web中负责渲染

组件布局
加载的具体实现

下载组件

通过网络请求对数据下载 默认重试时间10s 失败有toast提示 成功返回房源编辑页面

内存情况

内存常驻值为628 峰值780

内存情况

现状总结

现状情况总结:预览组件和下载导出是独立的组件

优点:独立进行加载 保证了两个业务相互独立 可以在没有预览的情况下 仍能够正常导出

缺点:导出时间长 且没有及时反馈,10s重试、占用内存峰值高

整改

第一步 打通两个组件的加载逻辑 实现缓存共用

打通两个组件的加载逻辑 实现缓存共用 实现以空间换时间实现速度提升,就是将预览组件的缓存 在导出的时候使用。

措施

通过图片缓存框架进行通过控制图片加载、缓存机制,减少无用开销、提升图片复用情况。

效果

导出速度显著提升,但是内存波动大、处在此页面时内存一直处于高位。

第二步 针对内存情况进行优化

分析

经过分析:

内存高位: 导出后bitmap在内存中并没有及时回收、缓存数据缓存了原始数据及对应UI组件大小的缩放资源

内存波动大:导出时io操作 读取bitmap 且本身io操作就会占用一定量的内存

措施
  1. 导出时 将从glide中读取bitmap保存文件后临时变量标记回收,改为获取flie形式直接copy到指定目录中。
  2. 不再缓存解码后的数据、避免浪费资源。
    diskCacheStrategy(DiskCacheStrategy.DATA)
  3. 减少预览渲染的图片大小 不展示原始图片、降低分辨率。、
  4. 在compose中及时销毁webview
    DisposableEffect(webView) { onDispose { webView?.destroy() // 销毁WebView } }
glide 磁盘缓存描述

总体流程改造后的效果

拍摄数量大于40张+,

时期

内存

效果

导出时间

优化前

内存常驻值为628 峰值780

z1 3s

SC2 弱信号下导出23.36s 正常导出 5s内

优化中

导出速度显著提升,但是内存波动大、处在此页面时内存一直处于高位。

7ms

优化后

房源编辑页常驻值为530~550

拍摄预览页为550~560

拍摄保存页内存为588~600

峰值670

7ms

这篇关于Android内存优化项目经验分享 兼顾效率与性能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846134

相关文章

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”