Android Performance

知乎 救救你的 StartingWindow

字数统计: 2k阅读时长: 8 min
2018/05/20 Share

我们经常说 iOS 整机体验要比 Android 好,这里有第三方软件的功劳(iOS 版本质量要高于 Android 版本质量),当然也归功于苹果对 iOS 的封闭系统的管控。应用想上 App Store,就得先过审核,不合规就给你打回来。

今天我们要说的,就是 iOS 和 Android 系统差异化的一个重要体现:StartingWindow,通俗点说,就是应用启动页。iOS 和 Android 都有 StartingWindow,但是表现却完全不一样。iOS 开发要求应用必须要有一个 StartingWindow,且必须是一张图片(iOS 开发可以说说是否支持定制 Layout),用户点击桌面图标启动应用,不会有任何延迟,会立即显示这个图片;Android 系统的 StartingWindow 虽然也是系统提供的,但是由于开放性,Android 允许开发者自己定制 StartingWindow、disable StartingWindow、透明化 StartingWindow。

StartingWindow 对用户体验的影响

由于 StartingWindow 对用户体验非常重要,但是应用开发者对 StartingWindow 的滥用,导致了用户启动应用的时候,会获得非常不好的体验,我举个例子你们就明白了:

  1. 使用系统默认的 StartingWindow :用户点了应用图标启动应用,马上弹出系统默认的 StartingWindow(就是做动画的那个 Window) ,等应用加载好第一帧之后,StartingWindow 消失,显示应用第一帧,无缝衔接,体验还不错,这也是通常大部分 Android 应用的场景;比如大部分 Android 系统的自带应用,即刻、汽车之家等
  2. 自己定制简单的 StartingWindow :用户点了应用图标启动应用,弹出应用自己定制的StartingWindow,等应用加载好第一帧之后,定制的 StartingWindow 消失,显示应用主界面,由于 StartingWindow 是自己定制的,启动的时候 Decode Bitmap 或者 Inflate 自定义 Layout 会有一定的耗时,但是总的来说与系统默认的差别不大,用户体验优;这样的应用包括淘宝、京东、微博、今日头条、美团等
  3. 把 StartingWindow 禁掉或者设置透明 :用户点了应用图标启动应用,由于 StartingWindow 被禁掉或者被设置透明,所以会出现点击图标后,除了图标黑一下之外没有任何响应,过个 1-N 秒(取决于应用第一帧的加载速度),直接显示应用主界面。这样的毒瘤应用包括:微信、微信读书、UC 浏览器、支付宝、工商银行、米家等。

大家可以安装一下我上面说的那些个应用自己体验一下,我是真的没法体会为何会有那么多应用采用第三种方式,偏偏很多用户只有一台手机,不认为是应用的问题,反而觉得是系统比较慢,然后各种投诉到系统这边,还是四五星的 Bug,真的是欲哭无泪。

我建议采用了第三种方式的应用的开发者,面壁思过一下,你们的产品经理是不合格的,你们作为开发没有主动提出优化这个也是失职的。不用怀疑微信也是他们的一员,只不过微信作为超级 App,在很多系统里面不杀他而已,不信你 adb shell am force-stop com.tencent.mm 一下试试。

知乎用户体验 - 数据展示

不过我今天不想说微信,我想说说知乎,因为我本人是知乎的重度用户,所以最近被知乎的体验搞得心情极差,再加上 N 多用户投诉启动慢,我必须来说两句了。

最近知乎安卓版的版本(5.17.2),虽然没有采用第三种方式,采用的是第一种方式,但是用户体验极差,具体说就是:点击桌面图标启动应用 -> 显示白屏(取决于你手机的性能,在1-5s 之间)-> 显示知乎是广告页 -> 显示知乎首页。我们之前说,白屏是大部分系统的默认 StartingWindow ,之所以会出现这样的现象是因为知乎那令人发指的应用启动速度。

我并不想从代码级别去分析他都干了啥,因为很多人对这个不感兴趣,感兴趣的可以自己抓 MethodTrace 看一下就可以了,这里我们简单从 Systrace 来看一眼就可以了,修复 Bug 的事情,让知乎的程序员去干吧。

  1. 从 StartingWindow(白屏) 出现到应用显示第一帧(SurfaceFlinger 视角,数据来自 Mix2s)
    第一帧

  2. 从 StartingWindow(白屏) 出现到应用显示第一帧(应用进程视角,数据来自 Mix2S)
    知乎冷启动

  3. Log 视角(看 am_activity_launch_time :2684)(数据来自 Pro7,Mix2s 是1552)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
05-21 22:40:58.033  1252  3371 I am_create_activity: [0,128018471,73,com.zhihu.android/.app.ui.activity.LauncherActivity,android.intent.action.MAIN,NULL,NULL,270532608]
05-21 22:40:58.037 1252 3371 I am_focused_activity: [0,com.zhihu.android/.app.ui.activity.LauncherActivity,startedActivity]
05-21 22:40:58.042 1252 3371 I sysui_action: [323,com.zhihu.android/.app.ui.activity.LauncherActivity]
05-21 22:40:58.092 1252 1293 I am_proc_start: [0,20985,10111,com.zhihu.android,activity,com.zhihu.android/.app.ui.activity.LauncherActivity]
05-21 22:40:58.133 1252 2857 I am_proc_bound: [0,20985,com.zhihu.android]
05-21 22:40:58.140 1252 2857 I am_restart_activity: [0,128018471,73,com.zhihu.android/.app.ui.activity.LauncherActivity]
05-21 22:40:59.564 1252 3109 I am_create_activity: [0,123681068,73,com.zhihu.android/.app.ui.activity.MainActivity,android.intent.action.MAIN,NULL,NULL,270532608]
05-21 22:40:59.566 1252 3109 I am_focused_activity: [0,com.zhihu.android/.app.ui.activity.MainActivity,startedActivity]
05-21 22:40:59.567 1252 3109 I am_pause_activity: [0,128018471,com.zhihu.android/.app.ui.activity.LauncherActivity]
05-21 22:40:59.570 1252 3109 I sysui_action: [323,com.zhihu.android/.app.ui.activity.LauncherActivity]
05-21 22:40:59.571 1252 3126 I am_finish_activity: [0,128018471,73,com.zhihu.android/.app.ui.activity.LauncherActivity,app-request]
05-21 22:40:59.661 1252 3094 I am_restart_activity: [0,123681068,73,com.zhihu.android/.app.ui.activity.MainActivity]
05-21 22:41:00.222 20985 20985 I am_on_resume_called: [0,com.zhihu.android.app.ui.activity.MainActivity,LAUNCH_ACTIVITY]
05-21 22:41:00.736 1252 1305 I am_activity_launch_time: [0,123681068,com.zhihu.android/.app.ui.activity.MainActivity,1078,2684]
05-21 22:41:01.269 1252 2906 I am_destroy_activity: [0,128018471,73,com.zhihu.android/.app.ui.activity.LauncherActivity,finish-imm]
05-21 22:41:01.859 1252 3072 I am_proc_start: [0,21229,10111,com.zhihu.android:pushservice,service,com.zhihu.android/.push.getui.GetuiPushService]
05-21 22:41:01.882 1252 2857 I am_proc_bound: [0,21229,com.zhihu.android:pushservice]

这长达 1.9s 的时间,用户看到的都是白屏,更不用说后面还有 3s 的广告页,然后才到主界面,说好的用户体验呢。。。而且我用的机器是小米 Mix2S,高通845加持,那些低端机器就更不用说了,时间只会多不会少。

知乎用户体验 - 用户感受

用户看到的就是下面三个步骤(截图来自 Pro7)

  1. 首先点击桌面后,显示 StartingWindow(白屏页面)
    S80521-222728
  1. 2s 后,白屏页面跳转广告页面:
    S80521-222748

  2. 3S 后跳转知乎主界面
    S80521-222753

我建议知乎还是采用大多数 Android 应用目前采用的第二种方法,即定制简单的 StartingWindow,用户体验好不说,也能拉近 iOS 和 Android 版本的体验差距,比如下图(截取自知乎 iOS 版本)
Image-1

写在最后

很大程度上来说,Android 系统的用户体验取决于第三方应用,各个厂商定制的系统能提升一部分,但是一旦进入了应用的界面,体验就完全取决于应用了。

StartingWindow 是一个很小的点,但毕竟是应用的入口,入口做的都不好的话,怎么能吸引用户每次都去访问你呢?知乎只是我举的一个小例子,毕竟还有非常恶劣的采用第三种方式的应用垫底,希望通过这个例子,各位应用开发者能体验到应用启动速度对用户的直接影响,俗话说,天下武功,唯快不破,不是没有道理的。应用优化的好,系统自然也会沾光,最终受益的还是用户。

最后还是挂一下那些非常影响用户体验的应用(采用了第三种方法),也希望读者可以反馈,我会持续更新,他们是

  1. 微信
  2. 微信读书
  3. UC 浏览器
  4. 支付宝
  5. 工商银行
  6. 米家
  7. ……
CATALOG
  1. 1. StartingWindow 对用户体验的影响
  2. 2. 知乎用户体验 - 数据展示
  3. 3. 知乎用户体验 - 用户感受
  4. 4. 写在最后