androidapp开发内存优化有感

1. 内存简析

待完善(所学有限,不知如何下笔,怕误导,建议看下面的参考文章,顺便给腾讯系的开发点个赞......)

2. 内存检测工具的使用

        2.1.   内存泄露检测:          

3. 内存技术优化

     题一简单解释了Android app中内存的使用,题2说明了内存泄露及其android提供的内存分析工具,针对发现的问题项目做了以下优化点:

        3.1. 内存泄露的优化

                代码的开发过程中,某个知识点不熟甚至某个时间点脑短路很正常的,逻辑代码中出现内存泄露也是很正常的,内存泄露不同的泄露点有着不同的处理方法,不再一一赘述,此处将项目中出现几个奇葩的内存泄露备注一下:

                3.1.1. Android常见内存泄露(handler,内部类,上下文胡乱传递等)参考下面文章参考

                3.1.2. 在华为手机中常见的输入法内存泄露(甚至没有使用输入框的页面也会出现),分析文章很多,给出解决方法也很多,下面方法经实测起作用,做一备注: 

华为手机输入法内存泄露处理方案

                    多数网上文章提供的是上面的类似代码,经实测是不起作用的,debug发现反射后的view获取到的context和传进来的并不是同一个context,所以并不会走置空方法,输入法的泄露并不能避免,究其原因是页面decorview在Android高版本中并没有直接持有context而是有封装一层decorcontext,此处通过反射的方式再反射一次即可:


view反射真正的context

            3.1.3. rxjava的使用造成内存泄露:当前多数app框架中都使用了rxjava框架,rxjava对于线程及其逻辑优化确实牛逼,但是使用不当也会引起内存泄露:activity的finsh并不能即时停止rxjava放到io线程里面逻辑执行,所以此时如果activity停止的时候没有解除订阅,rxjava待io执行完毕后还会将结果发送到ui县城里面执行,此时会造成内存泄露,解决方法很简单,io不能及时停止,将其所有订阅解除即可,解除方法通过CompositeDisposable添加解除或者参考下面文章参考。

   3.2. 内存技术优化

针对内存可以做下面几种优化(下面优化后多数app的内存会得到很大的提升):

            3.2.1. 规范编码,平时编码过程中多加注意内存的问题,在功能提测时,根据Android studio工具进行检测功能模块涉及到页面的内存,检测是否有内存泄露和内存占有量比较大的类,即时修改规范。

            3.2.2. 取合适大小的服务端图片(内存优化的头等大事),oom多数都是图片造成的,app的view也都是有大小的,过大的图片除了浪费流量以外也在浪费这用户的内存。对此多数cdn服务都会提供相应的服务(以七牛为例):

                图片缩放,旋转,裁剪

                获取图片格式,大小,色彩模型信息(对此头像有利,不需要再特殊的处理)

                转换图像文件格式

                图片添加水印

                计算图片的平均色调

上面功能实现也很方便,多数都是设置一个参数即可,但是图片如果在不同的cdn服务器上app和服务端之间需要做协议支撑。

            3.2.3. 图片加载框架的优化:

                根据不同性能的手机手动设置框架的内存缓存大小,当前以glide为例进行图片框架优化。即:

                   动态设置glide的内存缓存池,多数图片加载框架都是内存,硬盘双缓存,glide在此基础上还有一个bitmap内存缓存提升最近使用图片的加载速度,glide是通过手机系统的内存大小比例值计算设置的,平时不建议修改,但是内存吃紧的时候,可以比glide自己计算所得小的内存设置,减少内存缓存。      

                    根据手机内存系统大小动态设置图片的解析字节数,低内存是565,高内存8888,这样低内存可以缩减一半内存。

                    glide框架提供了clearMemory()和trimMemory()两个内存处理api,方便系统api onLowMemory和onTrimMemory()时使用。同样可以在这两个系统api中设置解析字节数565也可以一定程度上解决内存溢出的问题。

                    避免使用圆角图片,可以利用Glide提供的圆角转换,这样可以节省imageview中的圆角转换,减少内存的使用。

                    结合上面的,view并不需要原图,上面是传递宽高交由cdn三方存储对图片进行切割,相反,在view层也可以处理,glide支持设置view宽高进行裁剪图片后存储。相比还是前种更好,节省流量,小图片相对解析也快。

            3.2.4. webview的优化:

                    webview提供了onpause,onresume,freememery等api,可以在页面生命周期内调用尽可能做内存回收的处理

                    不再使用webview的时候,更深程度的去回收webview所占的内存,即:

webview的更深程度优化

            3.2.5. 针对app做一些具体的内存回收的优化:

                    针对首页多tab,及其新闻系app(某个tab又有很多的tab),此时某个tab不再使用的时候,可以将其页面中的图片回收掉(多数是viewpager,可以在其adapter中处理)

                    针对recyclerview可以做下面几项优化处理:

                        android针对recyclerview提供了RecycledViewPool,对其每一类型的item都可以设置其对应的数量,合适的item数量有两方面的提升,一是减少itemview的创建极可能复用itemview,还有结合下面的操作可以优化内存。

                        recyclerview的adapter提供一个api叫做 onViewRecycler,结合上面,在itemview回收的时候掉用,此时可以将itemview涉及到的图片url置空(外在不再引用图片框架的资源,在下一次加载的时候缓存池才能及时的释放掉资源)

对于此还有很大的优化空间,学习有限,欢迎各路大神来吐槽和指教。

        3.2.6. 内存运营及其设计方面的优化:

                做开发做的久了,除了问题总是在想自己的问题,对于内存优化,运营和设计方面的优化有时候比某个技术体现的更明显(此处记录下面一些优化的点):

                   不影响体验的前提下,尽可能的压缩服务端图片的大小

                    结合app的安转终端,对于图片大小指定合适的图片规范,例如bannner图片重点1080情况下提供1080图即可(甚至720图也可以),没必要为了追求清晰出1440的图

                    产品UI设计:通过Android studio提供的内存分析工具可以很方便的看到每一个页面占有的内存的大小,针对占用内存比较大的页面可以优先看一下UI设计,是不是有优化的空间(通常会有惊喜)


参考文章:

如何降低App的待机内存(三)——探索内存增长的原因

如何降低App的待机内存(四)——进阶:内存原理

Android 内存泄漏分析心得

Android 内存优化总结&实践

Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?

bitmap占用内存分析

bitmap内存版本迭代分析

java gc分析

Android gc 版本迭代史

小伙伴们,若是把你从坑里拉出来,别忘了赞赏一下小弟,加个关注也好奥

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 1,340评论 0 3
  • 转载来之http://blog.nimbledroid.com/2016/05/23/memory-leaks-z...
    坚持编程_lyz阅读 1,007评论 0 0
  • 1. 内存与内存分配策略概述 1.1 什么是内存 通常情况下我们说的内存是指手机的RAM,它主要包括一下几个部分:...
    爱码士平头哥阅读 521评论 0 1
  • 1、日志工具类L.java ``` package com.zhy.utils; import android.u...
    蛊惑007阅读 994评论 1 1
  • 程序自动生成10道(1-10之间的)加法题,每生成1道,就进行答题,10题答完,自动记分 ``` public s...
    gaoger阅读 199评论 0 0