cpu:
布局优化:
1.减少过度绘制,减少层级,同样层级时,可以用线程布局替代相对布局等
2.把控件不必要的背景色设置为透明
3.使用merge标签
ondraw
1.ondraw里面不要创建过多的局部变量,因为onDraw可能会被频繁调用,会在一瞬间产生大量的临时对象,会导致占用过多内存,系统更加频繁的gc,造成内存抖动,降低执行效率
2.Android系统每隔16ms发出VSYNC信号,绘制一帧,所有里面不要做耗时操作,要不无法进行正常渲染,就会出现丢帧。
3.Useless calls to onDraw():我们知道调用View.invalidate()会触发View的重绘,有两个原则需要遵守,第1个是仅仅在View的内容发生改变的时候才去触发invalidate方法,第2个是尽量使用ClipRect等方法来提高绘制的性能。
Useless pixels:减少绘制时不必要的绘制元素,对于那些不可见的元素,我们需要尽量避免重绘。
Wasted CPU cycles:对于不在屏幕上的元素,可以使用Canvas.quickReject把他们给剔除,避免浪费CPU资源。另外尽量使用GPU来进行UI的渲染,这样能够极大的提高程序的整体表现性能。
内存优化:
1.需要避免在for循环里面分配对象占用内存
2.可以考虑对象池模型,通过对象池来解决频繁创建与销毁的问题。
使用对象池技术有很多好处,它可以避免内存抖动,提升性能,但是在使用的时候有一些内容是需要特别注意的。通常情况下,初始化的对象池里面都是空白的,当使用某个对象的时候先去对象池查询是否存在,如果不存在则创建这个对象然后加入对象池,但是我们也可以在程序刚启动的时候就事先为对象池填充一些即将要使用到的数据,这样可以在需要使用到这些对象的时候提供更快的首次加载速度,这种行为就叫做预分配。
通常对象池中的对象可能是bitmaps,views,paints等等。
使用对象池也有不好的一面,程序员需要手动管理这些对象的分配与释放,所以我们需要慎重地使用这项技术,避免发生对象的内存泄漏。为了确保所有的对象能够正确被释放,我们需要保证加入对象池的对象和其他外部对象没有互相引用的关系。
电池优化:
1.Purdue University研究了最受欢迎的一些应用的电量消耗,平均只有30%左右的电量是被程序最核心的方法例如绘制图片,摆放布局等等所使用掉的,剩下的70%左右的电量是被上报数据
2.我们应该尽量减少唤醒屏幕的次数与持续的时间,使用WakeLock来处理唤醒的问题,能够正确执行唤醒操作并根据设定及时关闭操作进入睡眠状态。
3.某些非必须马上执行的操作,例如上传歌曲,图片处理等,可以等到设备处于充电状态或者电量充足的时候才进行。
4.触发网络请求的操作,每次都会保持无线信号持续一段时间,我们可以把零散的网络请求,后续很可能触发的请求,打包进行一次操作,避免过多的无线信号引起的电量消耗。设置好超时和重试机制,避免长时间等待请求结果。
可是什么时候才算是条件合适了呢?最简单粗暴的,例如我们可以在Queue大小到10的时候触发任务,也可以是当手机开始充电,或者是手机连接到WiFi等情况下才触发队列中的任务。手动编写代码去实现这些功能会比较复杂繁琐,Google为了解决这个问题,为我们提供了GCMNetworkManager来帮助实现那些功能,仅仅只需要调用API,设置触发条件,然后就OK了。
5.在上传与下载数据之前,使用CPU对数据进行压缩与解压,可以很大程度上减少网络传输的时间。
通过GPS定位服务相比起使用网络进行定位更加的耗电,但是也相对更加精准一些。Android提供了下面4种不同精度与耗电量的参数给应用进行设置调用,应用只需要决定在适当的场景下使用对应的参数就好了。
获取到移动网络的详细子类型,例如4G(LTE),3G等等,获取到详细的移动网络类型之后,我们可以根据当前网络的速率来调整网络请求的行为:
通常来说,我们可以把网络请求延迟划分为三档:例如把网络延迟小于60ms的划分为GOOD,大于220ms的划分为BAD,介于两者之间的划分为OK
首先针对不同的机器与网络环境,网络延迟的三档阈值都不太一样,出现的概率也不尽相同,我们会需要针对这些不同的用户与设备选择不同的阈值进行差异化处理
避免错误的使用Service,例如我们不应该使用Service来监听某些事件的变化,不应该搞一个Service在后台对服务器不断的进行轮询(应该使用Google Cloud Messaging)
如果已经事先知道Service里面的任务应该执行在后台线程(非默认的主线程)的时候,我们应该使用IntentService或者结合HanderThread,AsycnTask Loader实现的Service。
图片:
Android为图片提供了4种解码格式
ARG8888,ARG565,RGB4444,ALPHA8
相比起JPEG,PNG能够提供更加清晰无损的图片,但是PNG格式的图片会更大,占用更多的磁盘空间。到底是使用PNG还是JPEG,需要设计师仔细衡量
一种新的图片格式:Webp,它是由Google推出的一种既保留png格式的优点,又能够减少图片大小的一种新型图片格式。
inSampleSize能够等比的缩放显示图片,同时还避免了需要先把原图加载进内存的缺点
内存优化工具:
Memory Monitor:跟踪整个app的内存变化情况。
Heap Viewer:查看当前内存快照,便于对比分析哪些对象有可能发生了泄漏。
Allocation Tracker:追踪内存对象的来源。
Android为移动操作系统特意编写了一些更加高效的容器,例如SparseArray,今天要介绍的是一个新的容器,叫做ArrayMap。
我们应该在满足下面2个条件的时候才考虑使用ArrayMap:
1.对象个数的数量级最好是千以内
2.数据组织形式包含Map结构
SparseBooleanArray
SparseIntArray
这些容器的使用场景也和ArrayMap一致,需要满足数量级在千以内,数据组织形式需要包含Map结构。
通常来说,当所有的background应用都被kill掉的时候,forground应用会收到onLowMemory()的回调。在这种情况下,需要尽快释放当前应用的非必须内存资源,从而确保系统能够稳定继续运行。Android系统还提供了onTrimMemory()的回调,当系统内存达到某些条件的时候,所有正在运行的应用都会收到这个回调。
压缩apk大小:
我们可以使用Gradle来帮助我们分析代码,分析引用的资源,对于那些没有被引用到的资源,会在编译阶段被排除在APK安装包之外,要实现这个功能,对我们来说仅仅只需要在build.gradle文件中配置shrinkResource为true就好了,如下图所示:
可以用这个命令打开布局边界 :adb shell am force-stop com.launcher ; adb shell setprop debug.layout true ; adb shell monkey -p com.company.appname -c android.intent.category.LAUNCHE











网友评论