Android 性能优化之旋转屏幕优化

我的博客原文地址

问题背景

在桌面转屏发现响应不够迅速,对比其他产品有很大的提升空间,针对此问题进行了一些分析和优化。

问题分析和解决方法

首先简单介绍一下旋转屏幕的流程,首先各个界面要进行重绘,在重绘过程中要进行冻屏,只有所有Window都进行绘制完成了才进行转屏,因此这里面就有个木桶效应,转屏的时间取决于重绘最慢的那个。
首先分析Log,找出可以优化的点:

adb shell dumpsys window -d enable 10
adb logcat -v threadtime -s WindowManager | grep -E "Screen frozen for|Dismissing screen|Orientation start waiting for draw|Orientation not waiting for draw"

adb shell dumpsys window -d enable 10是使能DEBUG_ORIENTATION,开启打印转屏相关的Log。

WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{249e41f u0 StatusBar}, surface Surface(name=StatusBar)
WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{731dc6a u0 com.android.launcher/com.android.launcher.Launcher}, surface Surface(name=com.android.launcher/com.android.launcher.Launcher)
WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{b22eda5 u0 com.android.systemui.ImageWallpaper}, surface Surface(name=com.android.systemui.ImageWallpaper)
WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{731dc6a u0 com.android.launcher/com.android.launcher.Launcher}, surface Surface(name=com.android.launcher/com.android.launcher.Launcher)
WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{731dc6a u0 com.android.launcher/com.android.launcher.Launcher}, surface Surface(name=com.android.launcher/com.android.launcher.Launcher)
WindowManager: Orientation start waiting for draw mDrawState=DRAW_PENDING in Window{94517ed u0 com.android.launcher/com.android.launcher.Launcher}, surface Surface(name=com.android.launcher/com.android.launcher.Launcher)
WindowManager: Orientation not waiting for draw in Window{94517ed u0 com.android.launcher/com.android.launcher.Launcher}, surface Surface(name=com.android.launcher/com.android.launcher.Launcher)
WindowManager: Orientation not waiting for draw in Window{b22eda5 u0 com.android.systemui.ImageWallpaper}, surface Surface(name=com.android.systemui.ImageWallpaper)
WindowManager: Orientation not waiting for draw in Window{249e41f u0 StatusBar}, surface Surface(name=StatusBar)
WindowManager: Screen frozen for +968ms due to Window{249e41f u0 StatusBar}
WindowManager: **** Dismissing screen rotation animation

通过Log发现,转屏是要等StatusBarLauncherImageWallpaper绘制完才会开始的。
根据Screen frozen for +968ms due to Window{249e41f u0 StatusBar}发现目前的瓶颈在状态栏这里,首先分析一下状态栏的代码,可以借助于 TraceView 工具迅速定位到耗时较多方法的位置,发现在NotificationPanelViewonConfigurationChanged函数中有一项耗时的操作,先进行这部分优化。
然后看效果:

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()进行解码图片,这个也是没有必要的,只初始化一次就可以了,可以进行如下的修改:

                // Load bitmap if it is not yet loaded or if it was loaded at a different size
                if (mBackground == null/* || surfaceDimensionsChanged*/) {

只在mBackgroundnull是加在壁纸图片。
第三步的任务就是优化Launcher了,此处的优化点各不相同,而且较多,就不一一介绍了。

--------------------- 作者:寒江蓑笠 来源:CSDN 原文:https://blog.csdn.net/heqiangflytosky/article/details/71087428?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/c_z_w/article/details/83011686