Android内存优化之内存优化手段

【车联网】通用安卓Android内存优化策略:通过综合运用这些架构级优化手段(适配低内存设备/内存压缩技术/使用Native代码),可以显著提高应用在不同设备上的内存使用效率,提升应用的性能和稳定性。 以下是对这些架构级优化手段的详细解释与使用建议:通过综合运用这些架构级优化手段,可以显著提高应用在不同设备上的内存使用效率,提升应用的性能和稳定性。 阅读详情

Android内存优化之内存优化手段

上一节我们说到内存泄漏中常见的几种类型,没看的小伙伴可点击此链接去查阅哦

https://blog.youkuaiyun.com/Joson_Chou/article/details/83992239

通过分析内存泄漏问题,本身也属于内存优化的一部分,合理使用内存会对我们的Android应用得到很大的帮助,今天我们就来看下Android内存优化中抛开内存泄漏后的内存优化,通过改变代码编写风格、API转换调用等来提升我们的内存掌控能力。主要分两点去进行:

(1)UI布局的优化,包含布局嵌套的优化、绘制优化等;

(2)代码性能的优化,包含如何正确调用更省资源的API;

 

UI布局优化

UI(User Interface)用户界面,我们学习Android时再熟悉不过了,通过在使用Android提供的VIew、ViewGroup或者自定义的View来布局我们的用户界面,在移动终端或者其他Android延伸产品中,屏幕大部分情况都是有限的,如何正确的布局我们的元素,尤为重要。

我们先重新认识一下View,类View是Android中最基本的UI类,我们日常大部分所用到的UI组件都是继承于View类的,比如Button、TextView、LinearLayout、RelativeLayout、Widget基类等等。

Android系统处理我们的UI组件大概分以下:

(1)Android系统会把我们编写的布局文件xml转换成GPU能识别的绘制对象,其中这里会有一个DisplayList对象,该对象会在xml转换为GPU识别对象时yong用到,并且该对象保存了所有要GPU绘制的对象的数据信息;

(2)CPU将VIew处理成多维图形、计算纹理,然后通过OpenGL ES 接口调用GPU进行栅格化渲染;

                               

图片来源于网络,这个图具有一定代表性。

(3)在进行垂直同步后进行绘制到屏幕上。

这里有必要知道一下Android绘制屏幕的频率,人的眼睛和大脑是无法写作感知到超过60fps的画面更新,超过了60这个值基本属于浪费状态,但是如果远远低于60这个值,那我们就能感知到画面不连续,出现卡顿。比如电影画面播放的帧数大概是24帧,低于这个值我们就感受到画面会不连续,当然高出这个帧基本没问题,只不过是成本考虑罢了。

我们的Android性能标准在60fps,所以在1000ms内保证60帧绘制的话,那么一帧所用到的时间可以得出:

1000 / 60 ≈ 16ms  ,也就是说我们必须保证我们所用到的View的绘制一帧在16ms内,不然就会可能出现跳帧的现象,而刚刚也说到了Android系统渲染是通过一个垂直信号Vsync来保证同步的,也就是我们自定义View时在ondraw()绘制渲染需要控制好绘制时间。

 

合理使用布局减少嵌套层数

(1)在存在横向对齐时很多人会使用LinearLayout布局,然后跟布局又是一个LinearLayout或者RelativeLayout,造成了一个横向对齐子布局中存在多种嵌套,例如下面所示:

我们会在代码发现在跟布局RelativeLayout中有两个zibu子布局,一个是LinearLayout和一个TextView,LinearLayout内有两个子布局,分别为一个确定和取消的Button,为横向对齐排布,这个时候我们可以改进u一下写法,如下:

直接外部一层RelativeLayout,里面通过属性使用来排布,减少布局的嵌套层数,在减少布局时,我们可以使用<merge/>标签来优化界面,其中我们推荐使用<ViewStub/>、<requestFocus/>、<merge/>配合<include/>来使用,<merge/>标签在UI结构中起到非常重要的作用,通过该标签可以让我们的布局多余的嵌套层数减少,从而优化Android布局结构,加快绘制。而<ViewStub/>该标签多用于不确定的布局中,比如一些应用通过身份ID等来确定绘制哪类布局,用LayoutInflate将所需的布局进行加载进来,也就是我们所说的延迟加载,优化启动速度。

谷歌在RelativeLayout布局上推出了一个增强版的相对布局ConstaintLayout,ConstraintLayout允许你在不适用任何嵌套的情况下创建大型而又复杂的布局,所以使用RelativeLayout布局时,不妨采用ConstaintLayout来替代。

 

避免UI过度绘制

过度绘制通过是我们不注意布局背景颜色的设置,比如我们以下代码,根布局RelativeLayout里面设置了一个全局白色背景,而子布局LinearLayout也设置了白色背景,导致背景颜色重复绘制,增加了系统绘制开销,所以我们可以通过检查类似的写法,来优化我们的布局,加快系统绘制。

 

 

布局优化监测工具

(1)Hierarchy Viewer,层级观察器,可分析得出层级嵌套的树状图,直观;

(2)Layout OptiOptimization工具,该工具提供优化意见,可在tools文件夹下找到layoutopt.bat来启动工具;

(3)Android Lint,一款代码扫描工具,不仅仅提供布局优化意见,还提供代码优化意见;

 

代码性能优化

如果自己写过几万行代码了,那么我估计你都自己掌握了一套自身的代码优化手段,优秀的代码让人阅读起来会赏心悦目,以前小编曾任职过一家公司,内部代码经过了好几手,到我手上时候ji就一个变量命名我都看不出是啥意思,这让我在后面的工作中难以进行,直到后来我重构了里面的代码,这才让我工作得心应手。

 

命名定义优化

(1)在Java中,遵从驼峰式命名,禁止使用下划线“_xxx”开头命名,因为这本身不符合Java程序员的阅读习惯,我们说过了,除了写给自己阅读之外,还有供别人阅读,所以在命名时需要遵从驼峰式命名。

(2)类名遵从UpperCamelCase风格,首字母大写,禁止小写:

(3)常量定义全部大写,字母间用下划线间隔,如:

(4)抽象类使用Abstract或者Base开头,而异常类使用Exception结尾,如:

命名规范有很多,我这里只提一小部分,大家可以移步到阿里巴巴Java开发手册.pdf和阿里andrAndroid开发手册,里面总结的内容都很不错,至少我在里面改了好度coding坏习惯。附个链接:

《阿里巴巴Java开发手册》

《阿里Android开发手册》

避免重复循环

(1)在使用for循环时会存在一种坏习惯,我们先上一段有问题的代码:

可以看到在循环体内部,重复创建了一个Object对象,导致内存中存在许多重复对象,造成内存过度浪费,我们可以将创建对象的操作搬到循环体外部:

(2)循环条件判断优化,在遍历数组时循环条件稍微改一改,得到的效果大不一样,我们先上错误的代码:

在执行条件中,每一次都会去获取数据array的长度length,造成时间的损耗,如果不是做插入或者删除操作,我们可以将数组长度存到一个临时对象当中,这样我们每次循环就不用去重复去获取数组的length对象了:

 

API和对象选择使用的优化

我们在选择对象或者方法时,尽量使用系统优化过的,这样会让我们的代码编写得更加出色。

(1)字符拼接的使用:String类我们使用再频繁不过了,但如果我们阅读过源码会发现,里面内部其实是通过char[]数组进行存储字符的,我们在使用String类其实就是间接使用char[]数组,初始化赋值时就会定char数组的长度,如果我们想进行字符拼接或者删减,都会触发系统去开辟一块新的内存,然后将新字符复制拼接存储,所以在频繁操作String类型的数据时我们可以选用一些比较好的类。

StringBuffer的使用,使用StringBuffer是线程安全的,在并发访问该对象时会进行加锁访问,还有一个类就是StringBuilder,该类非线程安全,这两个的选择需要考虑使用场景,如果不考虑线程安全问题,推荐使用StringBuilder,毕竟效率会比StringBuffer要高。

(2)图片对象创建的方法选择:在Android中,我们尽量不要使用setImageBitmap、setImageResource、BitmapFactory.decodeResource来设置一张大图,这些方法完成decode后,都是通过调用Java层的createBitmap()来创建Bitmap对象的,对于内存开销大,我们推荐使用BitmapFactory.decodeStream来创建一个Bitmap对象,因为该方法直接调取的是JNI>>nativeDecodeAsset()方法来完成decode的,直接节省内存,避免在Java层中做过多的开销。

(3)处理字符串时,尽量多使用诸如String.indexOf()等,这方法都是直接调用JNI的。

 

异常处尽量自行处理,不要直接捕获

直接捕获异常这样的坏习惯对性能会有影响,比如我们的RuntimeException中的NullPointerException,我们可以通过判空来达到目的,不要直接去catch异常,这样大大节省系统产生异常时让CPU停下来去处理的时间。我们在编写Adapter时会经常遇到活动时数组越界的异常,这类异常我们不用直接去捕获,直接判断是否越界,通过if()...else...来处理。

 

优化代码调用

我们一般都是习惯使用接口编程,比如使用List,如下:

采用第一种是经常遇到的,因为这样做更加明智,它允许我们实现不同的实现类,但在Android系统中这样做未必是好的习惯,因为通过这样的接口引用会花费两倍以上的时间。所以我们推荐使用第二种来编程。

 

控件的选择

我们在使用ListView时,不f妨直接选用更加丰富的RecyclerView,ListView一直受人诟病的内存占用问题,而在RecyclerView就得到了良好的改善,而我RecyclerView提供更加丰富的API,相比ListView可为相对好的。在使用RelativeLayout时可用ConstaintLayout,增强版的相对布局,可减少布局嵌套层数。

 

建议使用Drawable

虽然Bitmap能让我们直接省事,直接放进去显示就好了,但是采用Drawable会更加出色,Drawable也是能实现图像功能,使用更少的内存。

 

成员方法修饰优化

当一个方法经常被外部调用或者它不依赖于外部对象同时也不是Override,我们推荐将方法修饰为static,这样调用的速度回jia加快。

 

单例的写法

我们编写单例有很多方式,其中一种比较推荐的方式是“饿狼模式”单例,如下面代码:

synchronized直接修饰方法ti体内部,不直接修饰fa方法,这样大大加快的访问的速度,因为我们的单例大部分时候都是已经有实例的,如果修饰方法的话,我们每次都会去同步竞争,降低了方法的访问速度。

 

结语

写了一天文章,可能思路不太全,但是大部分都是自己的总结和遇到过的,程序员要保持学习能力才能在以后的IT浪潮中存活下来,避免被市场淘汰哈哈哈。如果对本文有异议的可下方留意,同时也欢迎大家转发拍砖点赞收藏分享哦~

 

 

AutoModelForCausalLM 加载失败:flash_attn 缺失的三种解决方案 本文针对使用AutoModelForCausalLM加载大语言模型时因缺失flash_attn依赖而报错的问题,提供了三种实用解决方案。最推荐通过修改模型配置文件或代码动态指定注意力实现为“eager”模式来绕过检查,也介绍了临时修改库源码的应急方法,并解释了flash_attn的作用及正确安装指南。 阅读详情

相关推荐

2024最新版Anaconda Navigator安装使用指南

本文简要介绍如何下载安装Anaconda Navigator最新版,以及如何使用Python内核搭载来完成应用程序开发。

jackson_lingua的博客 1万+

Android:最全面&详细的性能优化攻略(含内存优化、内存泄漏、绘制优化、布局优化、图片优化、APK优化、多线程优化、列表优化等)

前言:佛教中有一句话:初学者的心态,拥有初学者心态是件了不起的事情。真正的大师永远怀有一颗学徒的心。 一、概述 在Android中,性能优化非常重要,因为这决定这一个APP的质量好坏,一个更快更稳更省的app能给用户更优秀的体验。 更快:App流畅不卡顿,快速响应; 更稳:App稳定运行,程序不崩溃(Crash)和无响应(ANR); 更省:节省资...

https://juejin.cn/user/1654096907477549/posts 1万+

智警杯1.4---excel可视化

知识点

lulu001128的博客 949

深入探索 Android 内存优化(炼狱级别)

前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。 本篇是 Android 内存优化的进阶篇,难度可以说达到了炼狱级别,建议对内存优化不是非常熟悉的仔细看看前篇文章:Android性能优化之内存优化,其中详细分析了以下几大模块: 1)、Android的内存管理机制 2)、优化内存的意义 3)、避免内存泄漏 4)、优化内存空间 5)、图片管理模块的设计与实现 如果你对以上基础内容都比较了解了,那么我们便开始 Android 内...

idaretobe的专栏 4147

《UE4游戏开发》之 《音效系统的实现》

音效系统需要负责管理什么事情: 1.1 确定声音控制的分类:如背景音乐、技能音效、界面音效、角色配音等,不同游戏对声音有不同的分类 1.2 控制每个分类的声音的开启与关闭,以及调节每个分类声音的大小 解决如何分类: 2.1 首先需要知道ue4为声音分类提供了什么:SoundClass通常需要一个根分类【SC_RPG_Master】,便于总体控制音效,以及指定引擎默认启动的音效 打开SoundClass资产【SC_RPG_Master】,对根控制的设置,将逐级传递并按比例进行设置,以此达到控制一类声音的目的.

qq_21919621的博客 2126

No Target Connected 错误时的一种情况

STM32的SWD烧录模式No Target Connected 错误的一种情况 STM32的SWD烧录模式No Target Connected 错误时的一种处理情况 这是我第一次烧板子的时候遇到的问题,在给板子download的时候出现了“No Target Connected”的错误,这里讲一种解决方法。不一定适用于全部状况,但是可以作为一种纠错方法。 打开 Options for Target… 1.首先点击Options for Target…这个像魔棒一样的按键打开,会出现这个页面 2.点击

Logan_CodeGou的博客 1万+

Android 内存优化

一、重识内存优化 Android给每个应用进程分配的内存都是非常有限的,那么,为什么不能把图片下载下来都放到磁盘中呢?那是因为放在 内存 中,展示会更 “快”,快的原因有两点,如下所示: 1)、硬件快:内存本身读取、存入速度快。 2)、复用快:解码成果有效保存,复用时,直接使用解码后对象,而不是再做一次图像解码。 这里说一下解码的概念。Android系统要在屏幕上展示图片的时候只认 “像素缓冲”,而这也是大多数操作系统的特征。而我们 常见的jpg,png等图片格式,都是把 “像素缓冲” 使用不同的手段

十年代码写十年 2743

PADS VX2.4差分对设置避坑指南:常见错误与解决方案

本文深度解析了在PADS VX2.4中进行高速PCB设计时,差分对设置的核心要点与常见陷阱。针对Layout规则设置、Router布线实战中的阻抗控制、线长匹配等关键环节,提供了具体的避坑指南和解决方案,帮助工程师确保信号完整性,提升设计质量。

weixin_29216049的博客 359

Android内存优化的10条建议

合理设置应用的minSdkVersion和targetSdkVersion,使应用可以运行在更多设备上,这可以提高内存利用效率。 避免在Application和Activity的onCreate方法中做过多工作,这会占用过多内存。可以将不必要的初始化工作放到onStart或延迟加载。 避免在UI线程中进行过多工作,可以使用AsyncTask或者Thread执行耗时操作,避免ANR问题发生。 重用已有对象,避免重复创建对象,这会产生大量垃圾对象,增加GC负担。可以使用对象池技术重用对象。 优化布局,减少视图

wayne214的博客 1061

360加固DEX解密与ELF修复技术解析

本文深入解析了360加固APK的逆向分析技术,重点探讨了其DEX解密与ELF文件修复的核心流程。通过动态调试与Frida脚本,详细拆解了壳的启动机制、反调试绕过、自实现Linker技术,并还原了基于RC4和自定义算法的多层DEX解密过程,为移动安全研究人员提供了实用的实战分析思路。

alice7model的博客 701

OPPO 后端校招面试,过于简单了!

你好,我是 Guide。2026 届秋招陆续开奖公司的越来越多了,今天来看一家手机厂 OPPO。前几天,已经分享了和今年校招开奖的情况。其中,小红书的薪资最为炸裂,大白菜一年都能给到 51w+。不过,相对应的工作强度和压力也是真的难顶,确实很难有钱多又轻松的活!OV (OPPO 和 Vivo)这几年发展真还可以的,这两家的高端机口碑都不错。本人也是最近入手了一款 Vivo 的上一代旗舰,拍照是真的不错啊!每个月会有 1.2k 生活补贴,生活费是按照 8 % 缴纳。

JavaGuide 750

Android:内存优化

内存问题或多或少都会存在于我们的App中,作为开发人员这也是我们要研究学习的重要课题之一,是否具备内存优化能力也是能否成为高级开发工程师的指标。这篇文章算是我网易课程的学习笔记,分享给大家交流学习,若有不当之处也请各路大神指正。 一.什么是内存问题? 1.内存泄漏 一个不再被程序使用的变量或对象依旧存活在内存中无法被回收,出现这个问题的根本原因就在于 一个短生命周期的对象被一个长生命周期的对象引用...

qq_27246079的博客 678

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android进程内存优化手段

常见内存优化手段1、使用优化的容器,如SparseArray等2、避免内存泄露、内存溢出3、避免Bitmap的浪费,应该尽量去适配屏幕设备。4、应用内存删减常见方法    1)删减无用代码及功能资源    2)尽量减少依赖的包    3)缩减所使用的库的大小    4)dex拆分(multidex)/插件话/动态加载    5)使用外部进程(android:process)    6)跑progu...

weixin_38031122的博客 263

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【内存优化】 Android 内存优化---概念、定位常用手段跟重要内存优化点

Android内存优化 最近半年做了比较多的内存优化工作,虽说现在网上关于内存优化的博客一抓一大把,而且确实很多都写的很棒总结的很好,但还是忍不住想要自己总结归纳一番,分享一点自己的心得。 什么是内存优化,什么时候需要内存优化,内存优化的目的是什么 内存优化就是优化内存嘛,让应用占用的内存更小嘛,让用户使用起来更流畅,占用的资源更小,而且最重要的是内存不会无限制增大导致OOM。所以,当你

Seek42的专栏 428

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android性能优化-内存优化

避免在onDraw方法里面执行对象的创建,onDraw界面,图像,view有变动,则会重新执行onDraw,如果在里面进行对象创建,则会影响绘制时间,如果onDraw绘制时间较长,则会引起UI卡顿,且onDraw频繁执行,创建也会频繁执行;典型例子:在一个activity中有一个比较耗时的线程,当推出activity时,线程依然在执行,无法回收内存,导致了内存泄漏;onTrimMemory()回调方法,及时释放不需要的内存,减小app占用内存,减少系统清理app的可能性。因为是多任务系统,需要协作运行。

qq_34358193的博客 2203

Android 内存原理详解以及优化(二)

这个其实和单例的原理是一样的,由于静态对象 test 的生命周期和整个应用的生命周期一致,而非静态内部类 Test 持有外部类 MainActivity 的引用,导致 MainActivity 退出的时候不能被回收,从而造成内存泄漏,解决的方法也很简单,把 test 改成非静态,这样 test 的生命周期和 MainActivity 是一样的了,就避免了内存泄漏。3.1 对于大图片加载的时候,会内存溢出。知道了内存泄漏的根本原因,再分析为什么会出现内存泄漏就很简单了,下面就针对一些常见的内存泄漏进行分析。

门徒07的博客 977

android:内存优化总结

android的内存优化对于大型的android项目来说,十分重要!今天就选几个常见的列举一下1. Context的引用    在Activity和Fragment之外,使用Context的时候,尽量使用Application Context,在AndroidAnnotations中,也即是:@RootContext Context context;原因:应用的Context的生命周期很长,它与我

郑海波(莫川)的优快云博客 2308

Android性能优化之内存篇

性能优化一直是高级Android工程师必问的,这也往往涉及到对Java、JVM、Android运行机制、监控工具使用等全方位的知识点,是很好的面试方向。本篇会围绕Android与Java的性能优化专项之内存展开并深入。内存是Android运行性能至关重要的一项指标,每个进程能使用的内存是有限的。不合理的使用内存会导致频繁的GC、甚至发生OOM,过多GC会导致App卡顿,而内存泄漏或者内存抖动都可以...

weixin_33843947的博客 135

浅谈Android内存优化

今天我们来聊一聊Android 内存优化,这篇文章本来很早就应该写了,但因为小游戏开发太吸引人了,所以这个就拖到了现在才开始,不过我觉得也不晚

weixin_34395205的博客 245

Android应用性能优化实践

Android应用性能优化实践 Android系统不断进化,开发者优化应用的手段也在变多。本文作者总结归纳了Android性能优化的原则,讲解如何使用现有的工具去分析解决性能问题,并结合自身实践给出了常用的内存优化技巧。

320

Android 性能优化之内存泄漏检测以及内存优化(上)

在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用函数来释放内存,但也随之带来了内存泄漏的可能

Shawn_Dut的专栏 1万+

写的还不错的专题,android性能优化

http://www.trinea.cn/android/android-performance-demo/

weixin_34050427的博客 74

Android Runtime调试检测与反制手段(86)

在Android Runtime(ART)中,调试检测与反制是保护应用安全的重要机制。随着移动应用安全威胁的不断增加,开发者需要采取措施防止应用被调试、逆向工程或篡改。ART提供了多种调试检测机制,包括调试器存在检测、内存完整性检查、代码注入检测等。这些机制通过系统调用、内存监控和安全标志位等方式实现,能够有效识别和阻止未经授权的调试活动。

Android开发领域创作者 1000

C++模板本质:编译期类型工厂与实例化机制解析

C++模板并非泛型语法糖,而是一种在编译期根据实际类型生成专用代码的元编程机制。其核心原理是模板实例化——仅对被调用的类型生成对应函数或类,实现零运行时开销与强类型安全。这一机制支撑了STL容器、constexpr计算、CRTP静态多态等关键技术价值,并广泛应用于嵌入式系统、高性能库及编译期优化场景。理解模板参数推导、显式特化与非类型模板参数(NTTP),是驾驭现代C++模板编程的基础能力。

weixin_33768481的博客 331

Jitsi Meet移动端性能优化:电量消耗与内存管理终极指南

Jitsi Meet作为一款开源的视频会议应用,在移动端使用时常常面临电量消耗过快和内存占用过高的问题。本文将分享实用的优化策略,帮助用户在保持会议质量的同时,延长设备续航并提升应用流畅度。 ## 📱 电量消耗的主要元凶 在移动设备上,视频会议应用的电量消耗主要来自三个方面:**摄像头持续工作**、**网络数据传输**和**CPU密集型计算**。Jitsi Meet通过多种技术手段平衡会议体

gitblog_00296的博客 863

Android内存管理优化技巧

1.使用service的风险 当应用程序使用service执行后台操作时,一定要保证只用执行操作时才让service运行,操作完成时,service应当停止运行,为防止内存泄露,谷歌官方推荐使用IntentService。 2.当界面不可见的时候,释放内存 到用户打开另一个app时,上一个app已经处于不可见状态,我们应到把与界面有关的资源进行释放,只需要在Activity中,重写onT

Allan的博客 615
上一篇: Android内存优化之内存泄漏的陋习
下一篇: Android文档阅读之Office文档阅读的方案实现
JosonChou
博客等级 码龄11年 8粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值