app性能优化从“娃娃”抓起

第十六感 第十六感     2022-12-10     722

关键词:


转载请注明转自:http://blog.csdn.net/u011176685/article/details/52511046

上篇文章APP淘宝,你为什么这么慢卡? 通过对淘宝APP进行简单的分析,介绍了很多性能优化的工具。结合工具去优化,网上谷歌一大堆文章。其实APP性能出现问题,始作俑者基本都是程序猿,我们在开发过程中埋下的坑,然后通过工具去找到坑,最后填坑。APP性能优化从“娃娃”抓起,就是总结和整理下一些好的代码的实践。少埋坑,性能自然就上来,也不用再花很多时间去找坑。但是无可厚非,没有埋过坑的程序猿,不是一个正常的程序猿。我们所要做的就是掌握一些好的代码的实践,尽最大可能少埋坑。下面仅仅是列出的相当于是“索引”,如果不是特别清楚的,可以自己进行扩展下。掌握这些“索引”,编写代码时,多少会考虑到很多,不再是只要能跑就好,而是,如何能够更加快速高效的跑!


一、避免OOM

1.简介:OOM及内存溢出(Out Of Memory),内存占有量超过了VM所分配的最大,android程序内存一般限制在16M,也有的是24M。

2.出现原因:加载资源过多,来不及释放,加载对象过大,内存不足

3.避免方法:

3.1动态回收内存,当界面不可见时释放内存,当内存紧张时释放内存。

3.2优化Dalvik虚拟机的堆内存分配

3.3自定义堆内存大小

3.4在内存引用上做些处理,常用的有软引用、强引用、弱引用

3.5加载图片时直接在内存中作处理,如边界压缩。对于大图片,先获取图片的大小信息,根据实际需要展示大小计算inSampleSize,最后decode

3.6使用轻量的数据结构,如使用ArrayMap/SpareseArray代替传统的HashMap

3.7避免在Android中使用Enum

3.8避免对象的内存泄露

3.9内部类引用导致Activity的泄露,典型的是Handler导致的Activity泄露,具体细节请自行谷歌

3.10Activity Context被传递到其他实例中,可能导致自身被引用而发生泄露

3.11注意广播和服务的及时注销,在程序里面注册的广播等,要及时在不需要的时候进行释放和移除

3.12注意cursor对象是否关闭

3.13谨慎使用large heap,特殊情况下可以在manifest中使用largeheap=true声明一个更大的heap空间,但会导致每次gc的运行时间更长,切换任务时性能大打折扣。

3.14谨慎使用多进程

3.15避免在onDraw方法里面执行对象的创建

3.16使用到大量的字符串拼接的操作用StringBuilder来替代频繁的“+”

3.17资源文件需要选择合适的文件夹进行存放,我们知道hdpi/xhdpi/xxhdpi等等不同dpi的文件夹下的图片在不同的设备上会经过scale的处理。例如我们只在hdpi的目录下放置了一张100100的图片,那么根据换算关系,xxhdpi的手机去引用那张图片就会被拉伸到200200。需要注意到在这种情况下,内存占用是会显著提高的。对于不希望被拉伸的图片,需要放到assets或者nodpi的目录下。

3.18节制使用Services

3.19谨慎使用“抽象”编程

3.20使用nano protobufs序列化数据,由Google为序列化结构数据而设计的,类似XML,却比XML更加轻量,快速,简单。

3.21谨慎使用依赖注入框架,虽然它从某种程度上可以简化你的代码,但是注入框架会通过扫描你的代码执行许多初始化的操作,占用内存。

3.22使用ProGuard来剔除不需要的代码

3.23慎用异常,异常对性能不利,异常只能用于错误处理,不应该用来控制程序流程


二、避免ANR

1.简介:全称Application Not Responding,意思就是程序未响应。如果一个应用无法响应用户的输入,系统就会弹出一个ANR对话框

2.出现原因:

2.1.主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞

2.2.主线程中存在耗时的计算

2.3主线程中错误的操作,比如Thread.wait或者Thread.sleep等

3.避免方法:

3.1Activity的onCreate和onResume回调中尽量避免耗时的代码(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)

3.2使用AsyncTask处理耗时IO操作。

3.3使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。

3.4使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。

3.5BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。IntentService是对service的一个很好的封装,

3.6提高用户感知响应,通常100到200毫秒就会让人察觉程序反应慢,为了更加提升响应。如果程序正在后台处理用户的输入,建议使用让用户得知进度,加入一个加载的控件,比如使用ProgressBar控件。程序启动时可以选择加上欢迎界面,避免让用户察觉卡顿。


三、安全性

1.使用Android Studio的analyze,代码检测会检测到一些不合理的地方,也会有相应的提示及如何修改

2.粗暴简单的方法可以使用比较出名的第三方平台加密比如爱加密,梆梆,阿里聚安全

3.阿里聚安全提供了项目安全性的扫描,可以使用它得到一份内部安全问题的检测报告,加以修改

4.使用严苛模式(StrictMode),主要检测两大问题,一个是线程策略,即TreadPolicy,另一个是VM策略,即VmPolicy


四、用户流量

1.避免在onresume里面执行过多的网络请求

2.避免没必要的地方加载高清大图

3.善用图片三级缓存机制

4.gzip压缩数据

5.请求加载大量数据时,判断网络环境,若非wifi,提示给予提示。

五、总结

上面列出来的,比较多,相当于来说会看着比较烦吃力。慢慢消化吧。性能优化从娃娃“”抓起,一个优秀的APP不是一个人能够做出来的,需要团队成员共同努力,避免一些常用导致性能的设计,需要大家一起努力!!


如果觉得不错,欢迎关注微信公众号和点赞。专注于干货的分享!!公众号历史文章那有福利噢!!

参考资料:

1.http://hukai.me/android-performance-oom/

2.http://blog.sina.com.cn/s/blog_618199e60101kvbl.html

3.http://droidyue.com/blog/2015/07/18/anr-in-android/index.html

java编程也要从娃娃抓起

因为市面上没有教孩子编程的教程书,于是本文作者自己编了一本。InfoQ的用户朋友们有没有教自己孩子编程的呢?我司倒是有一个教自家跳小苹果的孩子学C语言的。十二年前,我的小儿子Dave出现在我的办公室,手里拿着Java教... 查看详情

计算机要从娃娃抓起---------正则表达式(学习笔记一)

这篇主要是将正则,学习新东西,我记得老师说过一个好方法,要带着疑问去学习,不能光看理论,你要一直想着这个东西是干嘛的,怎么用,用在哪,我觉得的说的很好.所以在看的时候要一直想着这些问题.这是本喵的学习笔记可能有很... 查看详情

android性能优化深入解析,将你的app优化到极致的操作!

作为一个Android程序员,性能优化是无法避开的事情,并且性能优化也是Android中最有挑战的工作之一,更是每个工程师都需要掌握的核心技能。性能问题和Bug不同,后者的分析和解决思路更清晰,很多时候从应... 查看详情

app性能优化的那些事

...发人员把注意力更多的放在开发功能上面,比较少去考虑性能的问题,可能这其中涉及到objective-c,c++跟lua,优化起来相对复杂一些,导致应用在比如touch等较低端的产品上,光从启动到进入页 查看详情

android性能优化之启动加速35%

一、前言随着项目版本的迭代,App的性能问题会逐渐暴露出来,而好的用户体验与性能表现紧密相关,从本篇文章开始,我将开启一个Android应用性能优化的专题,从理论到实战,从入门到深挖,手把手... 查看详情

android性能优化之启动加速35%

一、前言随着项目版本的迭代,App的性能问题会逐渐暴露出来,而好的用户体验与性能表现紧密相关,从本篇文章开始,我将开启一个Android应用性能优化的专题,从理论到实战,从入门到深挖,手把手... 查看详情

android性能优化难题一文总结

前言现在都在谈性能优化或者在面试的时候被问到性能优化相关问题,那么我们为什么要做性能优化呢?以及性能优化的难点是什么?在整个项目周期中不同的阶段该做什么?优化效果如何长期保持?作为一... 查看详情

androidapp性能优化——内存cpu耗电量启动时间指标获取(代码片段)

最近公司要求对App进行性能优化。考虑到既然是优化性能,那首先要获取App的相关性能指标,比如:内存占用、CPU利用率、App启动时间、App耗电量等情况,获取以上各指标后,才能针对性分析确定是否存在优化的可能。最近公司... 查看详情

「性能优化系列」app内存优化理论与实践(代码片段)

好文推荐:作者:付十一性能优化系列:启动优化内存优化布局优化卡顿优化apk瘦身优化电量优化项目地址:fuusy/FuPerformance当一个应用同时运行越来越多的任务以及复杂的业务,Android系统的内存管理机制已经... 查看详情

app基本性能优化

布局优化避免OverDraw过渡绘制优化布局层级避免嵌套过多无用布局当我们在画布局的时候,如果能实现相同的功能,优先考虑相对布局,然后在考虑别的布局,不要用绝对布局。使用标签把复杂的界面需要抽取出... 查看详情

app瘦身性能优化总结

App瘦身资源瘦身使用tinypng压缩PNG图片。视频可以通过Finalcut等软件进行分辨率压缩。音频则降低码率即可。非必须资源文件可以放到自己服务器上启动图使用LaunchScreen.storyboard,启动图在一个项目资源中占比其实蛮大的,但是使... 查看详情

ios开发性能优化大纲

前言  今年团队工作计划的一部分是性能优化,主要会涉及到内存优化,启动优化,渲染优化,卡顿优化,耗电量,网络流量优化,弱网优化等。之前写过一篇内存优化策略的文章,大家感兴趣... 查看详情

探索app性能优化之稳定性优化(解决方案)(代码片段)

前言Android稳定性优化是一个需要长期投入,持续运营和维护的一个过程,不仅深入探讨了JavaCrash、NativeCrash和ANR的解决流程及方案,还分析了其内部实现原理和监控流程。本文对稳定性优化方面的知识做了一个全面总... 查看详情

从-view-绘制谈性能优化(转)

 在开发过程中,往往会听到“性能优化”这个概念,这个概念很大,比如网络性能优化、耗电量优化等等,对我们开发者而言,最容易做的,或者是影响最大的,应该是View的性能优化。一般小项目或许用不上View性能优化,... 查看详情

阿里p7架构师力荐《android性能优化—实战解析》,全方面解析android性能优化

前言性能问题是造成App用户流失的罪魁祸首之一。App的性能问题包括崩溃、网络请求错误或超时、响应速度慢、列表滚动卡顿、流量大、耗电等等。而导致App性能低下的原因有很多,除去设备硬件和软件的外部因素,其... 查看详情

面试系列——app启动性能优化总结

启动性能优化总结需求背景随着业务增多,引入很多SDK或一些业务模块,导致启动性能急速下降,用户体验感下降,数据指标越来越难看。衡量启动时间线上统计attachBaseContext首页的onWindowsFocusChanged方法上报打点... 查看详情

能跑就行?掌握了它,就搞定了app性能优化一半的问题!

Android高工绕不开的性能优化不管是对于Android开发者,还是对于整个程序员行业而言,性能优化已然成为了用来区别初中级工程师和高级工程师的“分水岭”。随着移动互联网的高速发展,以及微信、淘宝、抖音等亿... 查看详情

app性能优化的那些事

 来源:树下的老男孩 链接:http://www.jianshu.com/p/2a01e5e2141f 这次我们来说说iOSapp中滑动的那些事。iOS为了提高滑动的流畅感,特意在滑动的时候将runloop模式切换到UITrackingRunLoopMode,在这个过程中专心做跟滑动相关的工... 查看详情