主页 > ipad知识 >

安卓冷启动白屏解析,带你一步步分析解决问题

安卓冷启动白屏解析,带你一步步分析解决问题

我在第一次启动程序的时候发现了很长时间白屏的问题,而且正如评论所说,有时白屏时间可以长达七八秒。

看来这个问题已经是普遍现象了,可能很多人都有疑问。所以在这里我会专门写一篇文章来回答你的问题。

重现问题

我是在升级Android Studio2.0后第一次发现这个问题的。当时Android Studio的版本直接从1.5升级到2.0。这么大版本的飞跃,说明变化一定是比较大的。

从此以后,我们每次在新手机上安装程序并第一次启动,都会遇到白屏时间长,如下图所示:

安卓冷启动白屏解析,带你一步步分析解决问题

上图中的播放速度为实时速度,没有加减速。如您所见,这是一个几乎没有任何功能的空项目。白屏第一次开机,持续了5秒左右!虽然只是第一次启动会出现这么长时间的黑屏,但看来我们的程序实在是太业余了,无法为用户创造这样的体验,所以必须想办法解决。

分析原因

一开始我把这个原因归结为Android Studio 2.0的bug。毕竟一次做了这么大的升级,有一点bug也是正常的。但是直到现在最新的Android Studio2.2版本,这个问题依然存在,看来谷歌没有修复的打算,不太对。

然后我开始实验,发现这个长期白屏问题与Android Studio的版本无关,而与我们使用的gradle插件版本有关。打开build.gradle文件查看一下,代码如下:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
    }
}

可以看到,我这里使用的gradle插件版本是2.1.2。在这个版本下,会出现长白屏的问题。

但是如果我把gradle插件的版本号调低,比如2.0.0,然后运行程序ipad太冷出现白屏,会弹出这样的提示:

提醒我2.0.0版本的gradle插件不支持Instant Run,让我升级到2.1.2。但同时,你会发现长时间白屏的问题没有了。

但是这里我要具体说明一下,并不是2.0.0版本的gradle插件不支持Instant Run,而是因为我目前使用的是2.1版本的Android Studio,在 Instnat Run 功能方面,它与 2.0.0 版本的 gradle 插件不兼容。如果您使用的是2.0 版本的Android Studio,那么您会发现2.0.0 版本的gradle 插件也支持Instant Run。

有兴趣的可以调低gradle插件的版本号,比如1.5.0,或者1.3.0,这两个插件版本不支持Instant Run功能现在,你会发现它们都不会造成长期白屏的问题。

这样,我们就基本确定了问题的原因。当支持 Instant Run 功能时,屏幕将长时间空白。当不支持 Instant Run 功能时,一切正常。看来罪魁祸首还是Instant Run。啊。

安卓冷启动白屏解析,带你一步步分析解决问题

这张图比较复杂。看不懂没关系,因为我也看不懂,但至少让我们可以直观的感受到Instant Run背后的工作是很繁重的。

这样的话,相信你也应该明白为什么第一次启动会是空白这么久了,因为为了让Instant Run正常工作,我们的程序需要做很多初始化工作。而这一次长期的白屏,换来的是后续开发效率的大幅提升,我觉得这笔交易还是很值得的。

安卓冷启动白屏解析,带你一步步分析解决问题

这和之前的程序完全一样。我没有修改任何代码。我刚刚输入了一个发布包。现在没有白屏了。

进一步优化

如果你观察的很敏锐,你应该会发现我们的程序其实会经过一个白屏阶段,但是很短,瞬间就跳过了。

这与 Instant Run 无关。这是因为程序在启动时要进行一些基本的初始化操作,所有的程序都要经过这个过程。

这个白屏时间虽然很短,影响不大,但是我们还是可以通过代码进一步优化的。修改styles.xml中与主题相关的代码如下:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ......
    <item name="android:windowIsTranslucent">trueitem>
    <item name="android:windowNoTitle">trueitem>
style>

我们添加了两个属性,windowIsTranslucent 和 windowNoTitle。将这两个属性设置为true可以使程序初始化时窗口透明,初始化结束后显示程序主界面。完全看不到白屏界面,如下图:

安卓冷启动白屏解析,带你一步步分析解决问题

这样虽然看不到白屏界面,但是在初始化过程中窗口是透明的ipad太冷出现白屏,这会让用户感觉程序启动的响应速度有点慢,但其实这个区别都是毫秒是的,不用再担心这个了。