片头声明:
1、本片是据Romain Guy剧本编写Android Performance Case Study衍生的电影,某些部分可能由于个人英语水平有限及理解原因,可能有别于原作者的原意。如有发现,请指正。以利于我们共同学习,共同进步。
2、本片是继Android性能优化案例研究(上) by孙立出的下版。狗尾续貂,望大家海涵。 剧情介绍:孙立翻译的上半部分是如何发现性能问题,我这的下半部分是如何使用工具确定这些问题并给与了部分问题的解决方案。对于上部,就不再这里转载了,可以直接点击上面链接进行阅读学习。也可能过几天会转载过来
各位看官,下面就接上部开播: 移除无用的图层:为了减少重绘,我们首先必须知道,什么会导致重绘。这也是Hierarchy Viewer和Tracer for OpenGl之前的用处所在。 Hierarchy Viewer(图层查看器)是ADT的一部分,可以用于检查View Hierarchy(视图层级)的快照。它在解除布局问题时尤其有用,但也可以方便的检查工作性能。 【重要:默认情况下Hierarchy Viewer只能工作在非安全模式的设备上,比如工程机、平板或者虚拟机。要在所有手机上使用Hierarchy Viewer,需要添加一个叫ViewServer的开源库项目到你的应用中。 https://github.com/romainguy/ViewServer】 在ADT(或者监视器)中打开Hierarchy Viewer视图,然后选择Windows tab。(粗体高亮现实的窗口就是手持终端的foreground设备,一般也就是你要检测的那个界面)。点击高亮显示的条目,然后点击在工具栏中的Load按钮。(它看起来想一个蓝色方块树。)然后耐心等待载入整个树。当这该视图树载入完毕,你将看到如下图相似的画面。【译者:最好使用Monitor,译者多次使用ADT总是出错。】  现在,View Hierarchy已经在工具中载入成功,我们可以将其作为一个图片文档导出。只要点击工具栏中的第二个按钮(工具提示为:Capture the window layers捕获窗口图层)。Adobe Photoshop不是必须的软件,可以使用与其兼容的工具,比如Pixelmator,GIMP等等。可以下载我生成的PSD文件: 这个图像文件展示了应用中在一个Layer(图层)的每一个View。每一个layer(图层)基View.getVisibility返回的数据,分别被标记为可见或者不可见的。每一个layer(图层)使用View 可用android:id或者它的类名来命名。我开始添加支持组件来重建视图树,我应该完成这个功能。 通过检查这一系列图层,我们可以快速认出至少一个资源的overdraw,多个全屏背景。第一个就是这第一个layer。称为DecorView。这个视图被Android生成并包含了在主题中的特殊背景。在应用中这个默认梯度(默认透明度)是不可见的。因此可以安全的将其移除。 滚动DecorView你可以看见一个LinearLayout包含了另外一个全屏梯度(透明)背景。它与DecorView的背景是完全一样的,因此,它也是不需要的。唯一可见背景必须保持,它就是命名为id/tweet_list_container的视图。 【移除窗口背景:定义在你主题中的背景 被系统用来在启动的你应用之前作为预显示窗口。千万不要将其设置为null除非你的应用是透明的,相反,应该设置一个你认为好的颜色或者图片,或者在onCreater()方法中调用getWindow().setBackgroundDrawable(null)来将其去掉】。
进一步的减少overdraw: 通过图像文件,我们可以很容易明白应用是怎么生成的。但是它对于移除小区域的overdraw就显得十分吃力。那我们就需要打开Tracer for OpenGL。在ADT或者Monitor中名字为Tracer for OpenGL的视图,在工具栏中点击箭头那个图标。输入你应用的包名和主Activity的名字,然后选择存放位置(destination File)点击trace按钮。 【建议:OpenGL检测可能很大并且可以真正减速获取图像。 为了让它更小,获取图像更快,不要复选Data Collection Options boxes框。】
【Activity名字:当你打开应用后,logcat将显示包名和Activity名字。根据这个你就可以晓得在Tracer for OpenGL中要输入什么东东了。】 |