Android TraceView和Lint使用详解及性能优化
android lint工具是android studio中集成的一个代码提示工具,它主要负责对你的代码进行优化提示,包括xml和java文件,很强大。编写完代码及时进行lint测试,会让我们的代码变得非常规范而且避免代码冗余。让我们及时发现代码中隐藏的问题。
lint的使用时非常简单的,我看可以用它实现代码布局的优化,java代码的优化,不过我觉得根本解决问题还是得依赖于开发者的素质。
例子:我们需要删除掉一些无用的变量和布局文件等,这对代码的冗余有很大的帮助。
代码提示我们在6行需要为imageview添加contentdescription属性,突然感觉好强大。
其实我们还可以用它自定义搜索,主要是删除一些无用的文件用的。
然后按要求优化下代码就好了。
traceview
traveview是android studio集成的一个性能优化工具,相信很多人都用过它,之前也专门讲过,它主要计算工程内方法运行所占用的时间,调用次数,以此来优化app运行效率。
使用traceview主要有两种方式:
1.最简单的方式就是直接打开ddms,选择一个进程,然后按上面的“start method profiling”按钮,等红色小点变成黑色以后就表示traceview已经开始工作了。然后我就可以滑动一下列表(现在手机上的操作肯定会很卡,因为android系统在检测dalvik虚拟机中每个java方法的调用,这是我猜测的)。操作最好不要超过5s,因为最好是进行小范围的性能测试。然后再按一下刚才按的按钮,等一会就会出现上面这幅图,然后就可以开始分析了。
2.第2种方式就是使用android.os.debug.startmethodtracing();和android.os.debug.stopmethodtracing();方法,当运行了这段代码的时候,就会有一个trace文件在/sdcard目录中生成,也可以调用startmethodtracing(string tracename) 设置trace文件的文件名,最后你可以使用adb pull /sdcard/test.trace /tmp 命令将trace文件复制到你的电脑中,然后用ddms工具打开就会出现第一幅图了
步骤:1.选择你要调试的进程。
2.点击start mothod profiling,待图标变黑。
3.选择sample base profiling,等待一会,然后再次点击这个按钮停止(开始的时候红点会变成灰色小方块,停止的时候再次点击这个按钮就 好了)
注意事项:在第三步的时候,需要选择监听的属性。
trace base profiling
整体监听,项目中所有方法都会监听,资源消耗比较大。
sample base profiling
抽样监听,以指定的频率进行抽样调查,一般不要超过5s,需要较长时间获取准确的样本数据。
再次点击start mothod profiling,就会生成检测样本。
整个界面包括上下两部分,上面是你测试的进程中每个线程的执行情况,每个线程占一行;下面是每个方法执行的各个指标的值。
上面一部分是你测试进程的中每个线程运行的时间线,下图中可以可以看到,主要只有一个main线程在执行。
下面是分析面板(profile panel) - 每一列内容
inclusive time - 函数本身运行花费时间 + 函数调用其他函数时间
exclusive time - 函数本身运行花费时间。
calls + recurcall/total 调用 + 重复调用次数 / 函数总调用次数
cpu time/call 总的cpu时间与总的调用次数之比
profile panel面板有一些参数需要注意下
列名 | 描述 |
---|---|
name | 该线程运行过程中所调用的函数名 |
incl cpu time | 某函数占用的cpu时间,包含内部调用其它函数的cpu时间 |
excl cpu time | 某函数占用的cpu时间,但不含内部调用其它函数所占用的cpu时间 |
incl real time | 某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间 |
excl real time | 某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间 |
call+recur calls/total | 某函数被调用次数以及递归调用占总调用次数的百分比 |
cpu time/call | 某函数调用cpu时间与调用次数的比。相当于该函数平均执行时间 |
real time/call | 同cpu time/call类似,只不过统计单位换成了真实时间 |
1. incl cpu time
define inclusive : 全包括的
上图中可以看到0(toplevel) 的incl cpu time 占了100%的时间,这个不是说100%的时间都是它在执行,请看下面代码:
public void top() { a(); b(); c(); d(); }
incl cpu time表示方法top执行的总时间,假如说方法top的执行时间为10ms,方法a执行了1ms,方法b执行了2ms,方法c执行了3ms,方法d执行了4ms(这里是为了举个栗子,实际情况中方法a、b、c、d的执行总时间肯定比方法top的执行总时间要小一点)。
而且调用方法top的方法的执行时间是100ms,那么:
incl cpu time | ||
---|---|---|
top | 10% | |
a | 10% | |
b | 20% | |
c | 30% | |
d | 40% |
从上面图中可以看到:
toplevel的 incl cpu time 是1110.943,而io.bxbxbai.android.examples.activity.expandablelayoutmainactivity$simpleadapter.getitemview方法的incl cpu time为12.859,说明后者的incl cpu time % 约为1.2%
这个指标表示 这个方法以及这个方法的子方法(比如top方法中的a、b、c、d方法)一共执行的时间
2. excl cpu time
理解了incl cpu time以后就可以很好理解excl cpu time了,还是上面top方法的栗子:
方法top 的 incl cpu time 减去 方法a、b、c、d的incl cpu time 的时间就是方法top的excl cpu time 了
3. incl real time
这个感觉和incl cpu time 差不多,第7条会讲到。
4. excl real time
同上
5. calls + recur calls / total
这个指标非常重要!
它表示这个方法执行的次数,这个指标中有两个值,一个call表示这个方法调用的次数,recur call表示递归调用次数,看下图:
我选中了一个方法,可以看到这个方法的calls + recur calls 值是14 + 0,表示这个方法调用了14次,但是没有递归调用
从children这一块来看,很多方法调用都是13的倍数,说明父方法中有一个判断,但是这不是重点,有些child方法调用calls为26,这说明了这些方法被调用了两遍,是不是可能存在重复调用的情况?这些都是可能可以优化性能的地方。
6. cpu time / call
重点来了!!!!!!!!!!
这个指标应该说是最重要的,从上图可以看到,133这个方法的调用次数为20次,而它的incl cpu time为12.859ms,那么133方法每一次执行的时间是0.643ms(133这个方法是simpleadapter的getitemview方法)
对于一个adapter的getview方法来说0.643ms是非常快的(因为这个adapter中只有一个textview,我为了测试用的)
如果getview方法执行时间很长,那么必然导致列表滑动的时候产生卡顿现象,可以在getview方法的children方法列表中找到耗时最长的方法,分析出现问题的原因:
- 是因为有过多的计算?
- 还是因为有读取sd卡的操作?
- 还是因为adapter中view太复杂了?
- 还是因为需要有很多判断,设置view的显示还是隐藏
- 还是因为其他原因…
7. real time / call
real time 和 cpu time 我现在还不太明白它们的区别,我的理解应该是:
- cpu time 应该是某个方法占用cpu的时间
- real time 应该是这个方法的实际运行时间
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
下一篇: 国付宝与支付宝区别 国付宝app是什么