为什么需要提性能
ANR
其实anr是一个老生常谈的问题,做Android开发一般都会遇到,操作过程中突然弹出一个dialog,提示xxx无响应,是否关闭,遇到这种情况别提有多恶心,这种用户体验是很差的。
其实这个问题在很大程度是可以避免的。- 主线程 超时时间是5s
- Service 超时时间是20s
- BroadCast 超时时间是10
一般在开发过程只要避免在这些地方做耗时操作即可,如文件的读写,数据库的操作等。但是,,,注意有一种情况比较特使,子啊Android开发中免不了遇到并发编程,由于线程死锁导致的程序ANR,不知道大家有没有遇见过???死锁的概念不解释,熟悉java的应该都知道,怎么分析是由于死锁导致的呢?
Android 程序在产生anr后,会在 data/anr这个文件夹下产生track.txt文件,手机版本不同,生成的文件名略有差异。 至于怎么分析这个文件,网上有好多写的不错,我就不赘述了,贴出连接,感兴趣的可以看卡Dalvik虚拟机
每个android程序都是运行在自己的进程中,这个进程是运行在dalvik虚拟机的内部,换句话说,每个程序都是运行在一个dalvik内部的。android 应用只要是使用java代码编写,dalvik与jvm是有区别的,android代码是先编译成字节码文件,然后在转为dex文件,这个过程是有android 提供的工具来实现的,这个相比于.class 占用的内存更少,效率更高。
上面说过,每一个android 应用都是运行在一个dalvik里面,在最初开始,android 系统会为每个程序最多分配16M的可用队空间,但是随着android版本的升级,内存的不断增加,这可值也有所变化,上升到24M,32M,64M,具体数值,机型不同可能会略有差异。如果系统分配的内存不够用,可以申请更大的堆空间
可以在AndroidManifest.xml的application节点下添加android:largeHeap="true"属性,但是不建议这么做,还是建议优化应用。因为应用在退到后台之后,由于系统资源紧张,系统会优先杀死进程优先级低的,占用内存高的进程。电量消耗
电量优化重要性不解释,不管你的应用做的多优先,用户有多少,如果用户的手机由于你的应用导致手机的电量的大大的减少,用户肯定会毫不犹豫的卸载的,还会给你好评,什么垃圾。。。
我个人觉的可以从两方面入手
尽可能的减少和服务器的交互
这个是一个比较宽的概念,不是说为了达到省电的目的影响到应用的功能。
大家都知道,其实访问网络的是很耗电的,尤其是在网络状况理想的情况下。简单有个耗电量对比,网络状况良好<网络状况差
wifi情况下<移动数据下
所以在网络状况不太理想或者是在移动数据下,可以一些非刚需的网络请求,在合适的时机处理,至于是集中处理还是单独处理,这个就根据应用的情况自行选择吧
- 尽可能的减少传输数据的大小
这个就比较好理解,都知道xml类型的数据较与json,相同的数据,使用xml和json两种格式占用的大小是不一样的,这是一个方面,还有就是对传输的数据进行压缩等。
举个栗子:由于我们公司是做即时通讯的,在文件文件传输过程中,尤其是图片传输过程中,对图片进行压缩,现在手机的像素都比较高,拍出来的照片,少则8、9M,多则2、30M,如果直接发送的话,一个对数据消耗大,2是传输时间长,其实有时候是灭有必要发送这种大图的,可以对发送的图片进行压缩,或者先发送一个缩略图,如果用户觉的满足不了的话可以选择下载原始大图。可以参考微信的图片发送,这里只说一个大概,细节后面再说
NDK
c/c++对于底层相比于java有天然的亲近,执行效率来说要比java要高,虽然咱们是高java的,对于java不擅长的领域,要学会放手,当然这个对于从业人员来说,要求又提高了
几个关键值
0.1
程序在0.1s内完成相应,这样用户会认为是瞬时响应,在这种情况下就没有必要给用户任何反馈或者通知v
1s
程序在1s内响应未完成,会给用户不流畅的感觉,在0.1-1s之间,没有必要给用户反馈或者是提示,如果大于1s,则需要10s
10s是一个极限值,如果用户操作10s都没有任何响应,这个体验是非常糟糕的,需要在合适的时机给用户反馈
本节算是一个引子吧,后面会详细进行说明