问题背景
在桌面转屏发现响应不够迅速,对比其他产品有很大的提升空间,针对此问题进行了一些分析和优化。
问题分析和解决方法
首先简单介绍一下旋转屏幕的流程,首先各个界面要进行重绘,在重绘过程中要进行冻屏,只有所有Window
都进行绘制完成了才进行转屏,因此这里面就有个木桶效应,转屏的时间取决于重绘最慢的那个。
首先分析Log,找出可以优化的点:
1 | adb shell dumpsys window -d enable 10 |
adb shell dumpsys window -d enable 10
是使能DEBUG_ORIENTATION
,开启打印转屏相关的Log。
1 | WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{249e41f u0 StatusBar}, surface Surface(name=StatusBar) |
通过Log发现,转屏是要等StatusBar
,Launcher
和ImageWallpaper
绘制完才会开始的。
根据Screen frozen for +968ms due to Window{249e41f u0 StatusBar}
发现目前的瓶颈在状态栏这里,首先分析一下状态栏的代码,可以借助于 TraceView 工具迅速定位到耗时较多方法的位置,发现在NotificationPanelView
的onConfigurationChanged
函数中有一项耗时的操作,先进行这部分优化。
然后看效果:
1 | WindowManager: Screen frozen for +747ms due to Window{3aaa434 u0 com.android.launcher/com.android.launcher.Launcher} |
发现这个时候瓶颈已经不再StatusBar
这里了,接下面再优化Launcher
就可以。
接下来看看ImageWallpaper
是不是有优化的余地呢?
通过 TraceView 工具发现在ImageWallpaper.drawFrame()
方法中,每次旋转屏幕都会在updateWallpaperLocked()
中调用mWallpaperManager.getBitmap()
进行解码图片,这个也是没有必要的,只初始化一次就可以了,可以进行如下的修改:
1 | // Load bitmap if it is not yet loaded or if it was loaded at a different size |
只在mBackground
为null
是加在壁纸图片。
第三步的任务就是优化Launcher
了,此处的优化点各不相同,而且较多,就不一一介绍了。