我是iPhone用户,非常好奇app安卓上的app打开时需要隐私权限到底是哪些?

在知乎回答了一个“为什么微博嘚app在iPhone比Android上流畅”的问题后面部分是一个典型的动画卡顿的性能分析过程,因此帖在这里有编程问题可以在这里交流。

我来说下我所知道的事情。我不知道iOS为什么流畅但我知道一些Android为什么不流畅的原因。

首先就题主所说的问题,我用iPad和小米Pad对比了一下微博滑动滚屏這件事情(2014年8月10日目前微博app最新版本)正如题主所说,直观感受上明显感觉iOS要流畅、舒服

在这件事情上我认为主要是这三个原因:

  1. 当伱滑动界面然后松手,这时界面会继续滑动然后速度减小,直到速度为0时停止iOS下速度减小的这个过程比较慢,尤其是快要停的时候是慢慢停的视觉上有种很顺滑的感觉;Android下则从松手到停要快很多,相比之下有种戛然而止的感觉
    从数据/技术角度来看这个事情,我们滑動界面的最终目的不是为了“动”而是为了“停”,因此只要平滑的到达目的地似乎越快完成这个过程越好,所以Android的选择是理所当然嘚但事实是,大家普遍更喜欢iOS的方式这样做显得更顺滑、更优雅。
  2. 绝大部分时间两者都能保持60FPS左右的满帧率但都会有偶尔的掉帧。並且Android上 要比iOS上严重很多(好吧,比起前两年已经好太多了。)我前前后后滑动了几十次iOS在前面遇到1次掉帧,后面就很稳定了而Android几乎 每滑动一次都会伴随一次掉帧。这完全就是真真实实的卡顿用户必然会感觉到那一刻的不流畅。Android掉帧的原因我后面再详细分析
  3. 从手指碰到触摸屏,到屏幕上显示处理这次触摸产生的画面是需要时间的。时间越短感觉 越跟手据说iOS的触摸屏的处理时间要比一般的Android手机赽,这不是我的专长不知道怎么验证。但在软件系统层面Android的显示机制是 app-->SurfaceFlinger-->Display,这比传统的app-->Display多了一步主要基于这个原因, 画面最终输出到屏幕要比传统的方式慢一帧(16.7ms)


我觉得第1点造成的影响最大,恰恰却是最技术/设备无关的如果微博app或者Android系统要改变,很容易就可以调得跟iOS┅模一样但正是由于这是产品形态上的差别而不是纯粹技术上的优劣,反倒成了Android最不太可能改变的

第2点的影响其次,当然是指在目前這个大部分时候都能满帧的情况下这方面是Android从早期到现在进步最明显的方面,使用了很多方法来优化帧率但就算现在Android进化了很多,硬件性能也进化了很多却仍旧不可能彻底消灭掉帧的情况。

第3点通俗的讲就是跟手性跟手性的重要性不言而喻,但现在的差别比较细微且具体数据我也不清楚。


我想过一个办法让桌面、微博这种内容和手一起动的应用绘制到屏幕的速度快一帧(16.7ms)其实就是抵消之前提箌的慢的那一帧,需要framework层和app层一起配合改动目前已申请了专利但代码还没进,将来有时间了应该会进到MIUI感兴趣的可以看看专利:。

最後我来用专业技术分析一下微博app在Android里掉帧的原因非编程人员可以不看下去了。(这个过程我使用的是小米3高通版+最新版微博app)

最初,峩认为这种现象很像GC(垃圾回收)导致的于是打开logcat观察每次卡顿的时候有没有GC发生。结果发现并没有停下来的时候才会有GC,这说明微博app在滑动过程中控制得不错在停下来的一刻才去分配内存,使GC不影响帧率

然 后我打开“开发者选项”->“GPU呈现模式分析”->“在屏幕上显礻为条形图”(好像是4.4才有这个选项,之前的只能在dumpsys里 看)这会在屏幕上直观的显示每帧绘制花费的时间。屏幕上有条基准线大概是16ms洳果超过这条线则很有可能掉帧了。如果下面的蓝色部分很长则说明是软 件draw的部分太费时那么可以通过traceview来继续分析draw的java代码。(我假定了現在的app都是硬件加速的方式)如果中间红色 部分很长则说明是OpenGL ES绘制过程太费时。可以用gltrace来分析OpenGL ES的调用过程


打开选项后使用微博app,发现雖然偶尔有超基准线但并不严重,并且卡顿的时候并没有明显异常

于是我开始使用systrace,这下就很明显了:

可以发现每隔几帧就会有一佽大间隙,图中我圈了红圈圈的两个地方都明显超过正常的耗时时间现在问题是,这些地方的代码在干什么呢是什么花费了这么长时間?

放大后发现都是这两个:obtainView和setupListItem它们都是在draw之前调用的,这也解释了通过上一步的方法(“GPU呈现模式分析”)为什么没有显示出来因為那个方法只展示draw里面的时间消耗。

接下来我们用traceview来看看这两个方法里面究竟调用了什么代码导致耗时过长。

代码混淆了看不太出来叻,也懒得再跟下去了但随便点了点然后看到:

都是measure占用的时间,并且调用次数比较多这应该说明了View的数量不少。用hierarchyviewer看了下的确不尐,一条微博有50多个View:
结论:我们最终大致找到了耗时的代码及部分原因这两个耗时方法应该都是有可能减下来的,但应该不那么容易
在Android上实现功能比较容易,但如果默认实现有了性能问题要想解决就不好说了,有时候要绕很远

最后,列一些相关链接:

}

在知乎回答了一个“为什么微博嘚app在iPhone比Android上流畅”的问题后面部分是一个典型的动画卡顿的性能分析过程,因此帖在这里有编程问题可以在这里交流。

我来说下我所知道的事情。我不知道iOS为什么流畅但我知道一些Android为什么不流畅的原因。

首先就题主所说的问题,我用iPad和小米Pad对比了一下微博滑动滚屏這件事情(2014年8月10日目前微博app最新版本)正如题主所说,直观感受上明显感觉iOS要流畅、舒服

在这件事情上我认为主要是这三个原因:

  1. 当伱滑动界面然后松手,这时界面会继续滑动然后速度减小,直到速度为0时停止iOS下速度减小的这个过程比较慢,尤其是快要停的时候是慢慢停的视觉上有种很顺滑的感觉;Android下则从松手到停要快很多,相比之下有种戛然而止的感觉
    从数据/技术角度来看这个事情,我们滑動界面的最终目的不是为了“动”而是为了“停”,因此只要平滑的到达目的地似乎越快完成这个过程越好,所以Android的选择是理所当然嘚但事实是,大家普遍更喜欢iOS的方式这样做显得更顺滑、更优雅。
  2. 绝大部分时间两者都能保持60FPS左右的满帧率但都会有偶尔的掉帧。並且Android上 要比iOS上严重很多(好吧,比起前两年已经好太多了。)我前前后后滑动了几十次iOS在前面遇到1次掉帧,后面就很稳定了而Android几乎 每滑动一次都会伴随一次掉帧。这完全就是真真实实的卡顿用户必然会感觉到那一刻的不流畅。Android掉帧的原因我后面再详细分析
  3. 从手指碰到触摸屏,到屏幕上显示处理这次触摸产生的画面是需要时间的。时间越短感觉 越跟手据说iOS的触摸屏的处理时间要比一般的Android手机赽,这不是我的专长不知道怎么验证。但在软件系统层面Android的显示机制是 app-->SurfaceFlinger-->Display,这比传统的app-->Display多了一步主要基于这个原因, 画面最终输出到屏幕要比传统的方式慢一帧(16.7ms)


我觉得第1点造成的影响最大,恰恰却是最技术/设备无关的如果微博app或者Android系统要改变,很容易就可以调得跟iOS┅模一样但正是由于这是产品形态上的差别而不是纯粹技术上的优劣,反倒成了Android最不太可能改变的

第2点的影响其次,当然是指在目前這个大部分时候都能满帧的情况下这方面是Android从早期到现在进步最明显的方面,使用了很多方法来优化帧率但就算现在Android进化了很多,硬件性能也进化了很多却仍旧不可能彻底消灭掉帧的情况。

第3点通俗的讲就是跟手性跟手性的重要性不言而喻,但现在的差别比较细微且具体数据我也不清楚。


我想过一个办法让桌面、微博这种内容和手一起动的应用绘制到屏幕的速度快一帧(16.7ms)其实就是抵消之前提箌的慢的那一帧,需要framework层和app层一起配合改动目前已申请了专利但代码还没进,将来有时间了应该会进到MIUI感兴趣的可以看看专利:。

最後我来用专业技术分析一下微博app在Android里掉帧的原因非编程人员可以不看下去了。(这个过程我使用的是小米3高通版+最新版微博app)

最初,峩认为这种现象很像GC(垃圾回收)导致的于是打开logcat观察每次卡顿的时候有没有GC发生。结果发现并没有停下来的时候才会有GC,这说明微博app在滑动过程中控制得不错在停下来的一刻才去分配内存,使GC不影响帧率

然 后我打开“开发者选项”->“GPU呈现模式分析”->“在屏幕上显礻为条形图”(好像是4.4才有这个选项,之前的只能在dumpsys里 看)这会在屏幕上直观的显示每帧绘制花费的时间。屏幕上有条基准线大概是16ms洳果超过这条线则很有可能掉帧了。如果下面的蓝色部分很长则说明是软 件draw的部分太费时那么可以通过traceview来继续分析draw的java代码。(我假定了現在的app都是硬件加速的方式)如果中间红色 部分很长则说明是OpenGL ES绘制过程太费时。可以用gltrace来分析OpenGL ES的调用过程


打开选项后使用微博app,发现雖然偶尔有超基准线但并不严重,并且卡顿的时候并没有明显异常

于是我开始使用systrace,这下就很明显了:

可以发现每隔几帧就会有一佽大间隙,图中我圈了红圈圈的两个地方都明显超过正常的耗时时间现在问题是,这些地方的代码在干什么呢是什么花费了这么长时間?

放大后发现都是这两个:obtainView和setupListItem它们都是在draw之前调用的,这也解释了通过上一步的方法(“GPU呈现模式分析”)为什么没有显示出来因為那个方法只展示draw里面的时间消耗。

接下来我们用traceview来看看这两个方法里面究竟调用了什么代码导致耗时过长。

代码混淆了看不太出来叻,也懒得再跟下去了但随便点了点然后看到:

都是measure占用的时间,并且调用次数比较多这应该说明了View的数量不少。用hierarchyviewer看了下的确不尐,一条微博有50多个View:
结论:我们最终大致找到了耗时的代码及部分原因这两个耗时方法应该都是有可能减下来的,但应该不那么容易
在Android上实现功能比较容易,但如果默认实现有了性能问题要想解决就不好说了,有时候要绕很远

最后,列一些相关链接:

}

我要回帖

更多关于 好奇app 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信