Android性能优化

第一.布局优化 

LinearLayout和RelativeLayout都可以完成布局的情况下优先选择LinearLayout。

复用布局:< include > 

延迟加载:< ViewStub > 标签来加载不常用的布局

减少布局的嵌套层次:< Merge >

第二.绘制优化

onDraw中不要创建新的局部对象和做耗时的任务

第三 网络优化

工具:Network Monitor,Charles,Fiddler,Stecho

接口:API设计要合理 ;使用GZIP压缩 ;合适的数据格式

图片处理:1.图片下载,使用缩略图  2.使用WebP图片   3. 根据设备规格,指定图片尺寸请求图片。 使用完善的合适的图片加载框架 4.图片上传,一般要支持断点续传.

网络缓存 1.适当缓存 2.使用DiskLruCache

打包网络请求 网络状况好(如:WiFi状态下),可一次异步发起多个业务模块的数据请求

监听相关状态变化 1.休眠状态,尽量不要发起网络请求。2.充电状态,可适当做一些必要的网络请求,但要控制频率  3.弱网状态 可压缩和减少数据传输量;不要自动加载图片,用占位图显示;页面视图先显示,网络请求延迟提交。

优化网络请求机制 1.划分网络请求的优先级,同一页面,同一模块,重要的数据优先请求。2.网络差,减少请求量;网络好,提高请求量。3.合并网络请求,减少请求次数。比如,本地埋点数据,无需实时上报,可先本地缓存,再根据上报策略,选择合适时机一并上报。

IP直连和HttpDns 1.IP直连,省去DNS解析时间。2.使用HttpDns,防止运营商域名劫持或跨网访问问题。

开启 keep-alive进行连接复用

优化请求频率 1.使用本地缓存,让App在离线状态也能使用。2.优先使用缓存;当没有缓存或缓存过期,再请求网络数据。

第四 安装包优化

1.减少应用中不必要的资源文件,比如图片 2.在使用了SO库的时候优先保留v7版本的SO库,删掉其他版本的SO库。

3.res资源优化,

(1)只使用一套图片,使用高分辨率的图片。

(2)对图片进行无损压缩。

(3)svg图片 一些图片的描述,牺牲CPU的计算能力的,节省空间。

(4)图片使用WebP。

4.代码优化

(1)实现功能模块的逻辑简化

(2)Lint工具检查无用文件将无用的资源列在“UnusedResources: Unused resources”,删除。

(3)移除无用的依赖库。

lib资源优化

(1)动态下载的资源。

(2)一些模块的插件化动态添加。

(3)so文件的剪裁和压缩。

assets资源优化

(1)音频文件最好使用有损压缩的格式,比如采用opus、mp3等格式,但是最好不要使用无损压缩的音乐格式

(2)对ttf字体文件压缩,可以采用FontCreator工具只提取出你需要的文字。比如在做日期显示时,其实只需要数字字体,但是使用原有的字体库可能需要10MB大小,如果只是把你需要的字体提取出来生成的字体文件只有10KB

代码混淆。

使用proGuard 代码混淆器工具,它包括压缩、优化、混淆等功能。

插件化

可将功能模块放服务器,需要用时再加载。

7z极限压缩

第五.Android内存优化

解决内存泄露

第六.卡顿优化

工具 1.Profile GPU Rendering  2.Debug GPU overDraw过度绘制检测

(1)不要在主线程进行网络访问/大文件的IO操作

(2)绘制UI时,尽量减少绘制UI层次;减少不必要的view嵌套,可以用Hierarchy Viewer工具来检测,后面会详细讲;

(3)当我们的布局是用的FrameLayout的时候,我们可以把它改成merge,可以避免自己的帧布局和系统的ContentFrameLayout帧布局重叠造成重复计算(measure和layout)

(4)提高显示速度,使用ViewStub:当加载的时候才会占用。不加载的时候就是隐藏的,仅仅占用位置。

(5)在view层级相同的情况下,尽量使用 LinerLayout而不是RelativeLayout;因为RelativeLayout在测量的时候会测量二次,而LinerLayout测量一次,可以看下它们的源码;

(6)删除控件中无用的属性;

(7)布局复用.比如listView 布局复用

(8)尽量避免过度绘制(overdraw),比如:背景经常容易造成过度绘制。由于我们布局设置了背景,同时用到的MaterialDesign的主题会默认给一个背景。这时应该把主题添加的背景去掉;还有移除

(9)XML 中非必须的背景

(10)自定义View优化。使用 canvas.clipRect()来帮助系统识别那些可见的区域,只有在这个区域内才会被绘制。也是避免过度绘制.

(11)启动优化,启动速度的监控,发现影响启动速度的问题所在,优化启动逻辑,提高应用的启动速度。比如闪屏页面,合理优化布局,加载逻辑优化,数据准备.

(12)合理的刷新机制,尽量减少刷新次数,尽量避免后台有高的 CPU 线程运行,缩小刷新区域。

第七.耗电优化

工具:Battery Historian

八.ListView/RecycleView及Bitmap/图片优化

ListView/RecycleView

(1)使用ViewHolder模式来提高效率

(2)异步加载:耗时的操作放在异步线程中

(3)ListView/RecycleView的滑动时停止加载和分页加载

Bitmap/图片优化

(1)主要是对加载图片进行压缩,避免加载图片多大导致OOM出现。

(2)对图片本身进行操作。尽量不要使用setImageBitmap、setImageResource、BitmapFactory.decodeResource来设置一张大图,因为这些方法在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存.

(3)图片进行缩放的比例,SDK中建议其值是2的指数值,值越大会导致图片不清晰。

(4)不用的图片记得调用图片的recycle()方法

第九. 数据库SQLite优化

(1).  合理使用索引,可加快数据库表数据的查询速率。

(2).事务  保证数据的完整性,安全性,提高数据更新,删除操作的效率。

(3)尽量少用cursor.getColumnIndex()。

(4)用StringBuilder(非线程安全)或StringBuffer(线程安全)来拼接字符串。

(5)查询时,只返回需要的数据或结果。

(6)cursor使用后要及时关闭。

第十. 启动优化

(1)通过启动加载逻辑优化。可以采用分布加载、异步加载、延期加载策略来提高应用启动速度。

(2)数据准备。数据初始化分析,加载数据可以考虑用线程初始化等策略。

异步加载一:Application中加入异步线程

异步加载二:MainActivity中加入异步线程

延迟加载功能:首屏绘制完成之后加载

动态加载布局:主布局文件优化  功能代码深度优化

第十 一. 数据结构优化

(1)使用Android自带的spareArray来代替HashMap;

(2)比如HashMap和ArrayMap,优先使用ArrayMap;

(3)优先使用基本类型,而非包装类

(4)减少占内存较大的枚举的使用

(5)采用三级缓存机制:LRUCache

(6)图片压缩:inSampleSize、RGB_565替换RGB_8888

第十二. 稳定性优化

(1)提高代码质量。比如开发期间的代码审核,看些代码设计逻辑,业务合理性等。

(2)代码静态扫描工具。常见工具有Android Lint、Findbugs、Checkstyle、PMD等等。

(3)Crash监控。把一些崩溃的信息,异常信息及时地记录下来,以便后续分析解决。

(4)Crash上传机制。在Crash后,尽量先保存日志到本地,然后等下一次网络正常时再上传日志信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值