面试官问我:Android APP中如何测试FPS?看我如何分析京东,拼多多App的FPS

6,884 阅读4分钟

记得看文章三部曲,点赞,评论,转发。 微信搜索【程序员小安】关注还在移动开发领域苟活的大龄程序员,“面试系列”文章将在公众号同步发布。

1.前言

通过面试官问我:Andriod中子线程为什么不能更新UI?成功斩获offer的天才少年_逐渐膨胀,今天准备准备去大厂试一下。

2.正文

天才少年_来到一家大厂等待面试,上家公司萌妹子面试官让我久久不能忘记,不知道今天的面试官是什么样子。
一个眼睛更大更亮,超级可爱的小姐姐,站在我面前,竟然比昨天的面试官更蠢萌,今天看天才少年如何把她带回家,什么鬼,是把offer带回家。

在这里插入图片描述

小伙子,听说你是来面试的,我是今天的面试官,你先介绍一下你自己吧。

我叫【天才少年_】,男,30未婚,家里有车有房,我的优点是英俊潇洒,我的座右铭是:既往不纠结,纵情向前看,继续努力。

额,你这介绍,怎么感觉是来相亲的。

果然面试官已经被我英俊的外表深深吸引,不能自拔,嗯,萌萌的外表都是不太聪明的样子,今天面试有希望啦,我心中一阵暗喜。
卧槽,连开场语都是一模一样。(实际是我懒,直接从上篇抄过来的)

你好,跟我说下Android APP中如何测试FPS?

嘿嘿,还好我有准备,看我如何装逼。

在这里插入图片描述
1)硬件准备:
1.Android手机一部(我的是小米Redmi Note3)
2.待测试APP
3.安装有Android开发环境的电脑一台。

2)测试步骤:
1.Android手机通过USB连接电脑。
2.打开手机“设置”-“更多设置”-“开发者选项”-“GPU呈现模式分析”,选中“在adb shell dumpsys gfinfo”中,如图所示:
部分手机可能路径不同,下图为我的手机的路径截图。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.打开app到你需要测试的界面
4.在pc端,打开命令行界面,路径切换到本地Android SDK的platform-tools目录,如下图:
在这里插入图片描述
5.在命令行中继续输入“adb shell dumpsys gfxinfo 需要测试的app包名” >需要保存结果的文档路径,如图所示:
在这里插入图片描述
6.打开D:\test.text文档的内容,如图所示:

com.victor.intercitycarpool/com.victor.intercitycarpool.ui.account.RegisterOneActivity/android.view.ViewRootImpl@176c16e7 (visibility=0)
	Draw	Prepare	Process	Execute
	0.00	0.75	77.86	2.69
	0.00	0.61	4.52	1.65
	0.00	0.30	84.77	2.03
	0.00	0.18	3.52	2.98
	0.00	0.32	3.08	2.52
	0.00	0.46	3.05	2.22
	0.00	0.14	3.06	2.09
	0.00	0.14	3.28	2.32
	0.00	0.26	4.18	2.33
	0.00	0.15	8.69	14.54
	0.00	0.15	4.87	3.21
	0.00	0.21	9.58	6.59
	0.00	1.49	26.28	3.37
	0.00	0.21	6.55	4.59
	0.00	2.54	3.81	15.24
	0.00	0.20	5.22	2.00
	0.00	7.30	4.48	8.07
	0.00	0.79	11.45	6.47
	0.00	0.20	4.49	2.14
	0.00	0.72	3.29	2.78
	0.00	1.36	4.14	1.83
	0.00	0.38	2.83	2.17
	0.00	0.46	3.49	4.52
	0.00	0.61	3.68	2.25
	0.00	0.37	2.85	2.89
	0.00	0.63	3.92	2.37
	0.00	0.47	3.28	2.00
	0.00	0.42	3.33	2.10
	0.00	0.33	2.49	2.27
	0.00	0.14	2.79	2.35
	0.00	0.13	2.73	2.49
	0.00	0.21	3.11	2.26
	0.00	0.13	3.60	2.25
	0.00	0.13	2.61	2.33
	0.00	0.13	2.54	2.36
	0.00	0.22	4.20	2.59
	0.00	0.13	2.80	2.26
	0.00	0.14	2.72	2.27
	0.00	0.13	2.76	2.22
	0.00	0.22	3.47	2.27
	0.00	0.14	2.76	2.35
	0.00	0.11	2.28	2.09
	0.00	0.11	2.28	1.87
	0.00	0.21	2.62	2.37
	0.00	0.12	2.16	2.26
	0.00	0.11	2.05	1.89
	0.00	0.10	2.00	1.81
	0.00	0.16	1.89	2.72
	0.00	0.11	2.96	2.68
	0.00	0.27	5.19	1.86
	0.00	0.16	3.06	3.42
	0.00	0.38	3.16	4.50
	0.00	0.36	86.55	2.64
	0.00	0.22	4.75	4.48
	0.00	0.22	4.03	2.76
	0.00	0.16	4.36	3.84
	0.00	0.15	3.53	2.40
	0.00	0.15	3.44	3.42
	0.00	0.31	5.62	2.18
	0.00	0.16	37.08	2.01
	0.00	0.16	3.81	2.70
	0.00	0.21	3.49	2.51
	0.00	0.15	3.74	2.48
	0.00	0.15	3.39	2.26
	0.00	0.24	4.75	2.45
	0.00	0.15	3.50	2.31
	0.00	0.15	3.80	6.01
	0.00	0.31	3.81	2.15
	0.00	0.89	9.96	1.83
	0.00	0.18	19.71	2.27
	0.00	0.30	36.29	2.05
View hierarchy:

 com.victor.intercitycarpool/com.victor.intercitycarpool.ui.account.RegisterOneActivity/android.view.ViewRootImpl@176c16e7
  24 views, 31.83 kB of display lists

赠送一个知识点:
Draw: 创建显示列表(display lists,记录所有view对象的绘制指令)的时间开销。
Process: 执行显示列表中绘制指令的时间。UI视窗中的View数量越多,需要执行的绘画命令就越多。
Execute : 将一帧图像交给合成器compostior的时间。这部分占用的时间通常比较少 而prepare在一些旧adb版本中是算在process上,就是指从创建显示列表到执行显示列表的这一段准备时间的开销
Draw + Prepare+Process + Execute = 完整显示一帧 ,这个时间要小于16ms才能保证每秒60帧,即fps为60,才不会出现卡顿。

7.纯数字看着不直观,上才艺
把数据导入到excel表格中,生成折线图:

在这里插入图片描述
额,上错图了,应该是下面这张:
在这里插入图片描述
上面说到,完整显示一帧 ,这个时间要小于16ms才能保证fps为60。
显示一帧的时间<16ms,则显示流畅
16ms<显示一帧的时间<20ms,则会有轻微不流畅
显示一帧的时间>20ms,则会出现明显的卡顿,需要优化。

可见,我测试的APP的显示一帧的时间基本都是小于10,暂时不需要优化,天才写的代码果然没有问题。

那有看过主流APP的fps是多少吗?比如淘宝,京东,拼多多

当然看过啊,大厂主app是我学习的方向标。

在这里插入图片描述
京东商品详情页(ProductDetailActivity):显示一帧的时间基本都在16ms以下,偶尔会有一些超过16ms,整体上看页面还是比较流畅的。
在这里插入图片描述
拼多多商品详情页(com.xunmeng.pinduoduo.activity.NewPageActivity):显示一帧的时间都在16ms以下,可以看出拼多多对性能把控得非常不错,据说他们对包体积也扣得非常细,由于面试官没有问,这边不展开讨论,不然把我留到天黑,面试官可能有危险,嘿嘿。(后面会介绍缩包的方法)
在这里插入图片描述
淘宝:比较尴尬,安装不上:(手机型号:Redmi Note3 Android系统版本:5.0.2)应用市场是说明支持Android 4.0.2及以上;所以这边暂时不分析了。
在这里插入图片描述

小伙子分析得很不错,只是今天有点晚了,TraceView的使用我还没有来得及问,咱们明天继续。

其实我不介意晚上单独面试的,嘿嘿。 未完待续~~

在这里插入图片描述


微信搜索【程序员小安】“面试系列(java&andriod)”文章将在公众号同步发布。

在这里插入图片描述