【转】对于Android的性能这方面评估,大部分都是有超级兔子去比跑分的,还是不能反映全面的问题。就我知道的而言,应用启动时间是很影响用户体验的一个性能方面问题。
最近的一个项目,别人都说应用启动慢,我师傅看我没什么事,叫我看一下。以前也看过一次,但那次是当学习,只是看看整流程是怎么走的,这次确不一样了。开始的一天,按以前的方式再看了一下,感觉没有什么异常的地方,不过时间确实比对比机慢了很多,但不知道是时间是发哪块了。从InputReader到ViewRootImpl,从ViewRootImpl到Lanucher startActivity,从Launcher到ActivityManagerService把Activity显示出来,整个流程走了一遍,没有发现异常的地方,小郁闷了一下。
第二天想了一下,觉得不对,自己对比的方式有问题,没有把慢的手机跟对比机都进行相同的操作,导致知道时间慢了,也不知道慢在什么地方了,于是,两款手机我都只进电话界面,并且在两个手机上都打了LOG,发现慢的那款手机怎么都比好的那款手机慢200~300ms,我对比了一下整个时间,发现在AMS的scheduler到displayed  Activity 时间特别长,确定那段时间是那这段了。
其实这段流程还有好多步骤,要把原来的Activity OnPause掉,压入Activity Stack,然后在新的Activity显示出来,整个Activity的生命周期都走了一遍,这让群我情何以堪呀!没招,只好采用分的方式,继续打LOG。
历经了千难万险,最后终于发现在ActivityThread.java的 mInstrumentation.callActivityOnPause(r.activity)耗时最长,正常那款机型是不要时间的,而慢的那个手机,确要200~300ms,刚好是整个周期所慢下来的时间,是Lanucher在OnPause的时候慢下来了,在负责Lanucher同事问了下,最近Launcher改什么了,才发现,Launcher在OnPause的时候,做动态壁纸的同事,添加了截屏的代码,要截屏Lancher的Item,以便显示出来。
折腾了两三天,就得到了个这样的结果,幸亏把问题找出来了。做性能的都说,环境一定要一样,我也知道,可惜做起来未必会实行的,要不然第一天就不会白忙乎了!还有一点是重要的,原来二分法真的是那么的神,以前重来没发现过,这次自己是用了一下,效果相当不错呀!把有O(n)的问题变成O(lon)的,看来效率真的会提升很大!
最近对Android GUI很来劲,希望自己好好的学习,能弄明白,听说是Android最复杂的一块,管他呢,玩玩而已! 
 
onCreate  onStart onPause  需要去分析到底是在哪个生命周期中花掉了最多的时间

android启动时间慢的问题的更多相关文章

  1. Android启动时间测试方法

    android apk启动时间可以通过下面的命令来完成测试,最终会生成一个mp4的视屏文件,通过播放录制好的视屏来统计app的启动时间精确到ms级别   例如:adb shell screenreco ...

  2. 性能adb命令

    启动时间-冷启动启动App命令adb shell am start -W -n com.bit_health.android/.ui.common.activities.BitHealthMainAc ...

  3. 探究 | App Startup真的能减少启动耗时吗

    前言 之前我们说了启动优化的一些常用方法,但是有的小伙伴就很不屑了: "这些方法很久之前就知道了,不知道说点新东西?比如App Startup?能对启动优化有帮助吗?" ok,既然 ...

  4. Android 中如何计算 App 的启动时间?

    (转载) 已知的两种方法貌似可以获取,但是感觉结果不准确:一种是,adb shell am start -w packagename/activity,这个可以得到两个值,ThisTime和Total ...

  5. Android应用启动时间及启动日志获取方法

    1. Android应用中,可以使用如下方式进行应用启动时间的查看 2. 启动日志获取方法:

  6. Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息

    Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息   by:授客 QQ:1033553122 1.  查看内存信息 1)查看所有内存信息 命令: dumpsys mem ...

  7. Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息

    1.  查看内存信息 1)查看所有内存信息 命令: dumpsys meminfo 例: C:\Users\laiyu>adb shell shell@android:/ $ dumpsys m ...

  8. 利用uiautomator实现Android移动app启动时间的测试

    为了减少因手工测试的反应误差,这里介绍下如何利用Android自带的自动化测试工具uiautomator实现app启动时间的测试. 测试基本思路如下: 1.启动前记录当前的时间戳 2.启动app,直至 ...

  9. 利用统计学知识为android应用的启动时间做数据分析

    [声明:如需转载本文,请注明来源] 一.数据说明 启动时间用同一台设备,同一个包进行启动时间的测试,其中三组样本数据(每组100份对比数据)如下: 设备pro-5-1 base_list_1 = [0 ...

随机推荐

  1. Python基础A(执行方式---注释)

    执行Python程序的两种方式 交互式(jupyter) 优点:运行一句,执行一句 缺点:关闭即消失 命令行式(pycharm) 优点:可以一直保存下去 缺点:全部写完才能调试bug 虽然txt问价可 ...

  2. USACO Superprime Rib

    洛谷 P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib 洛谷传送门 JDOJ 1673: Superprime Rib JDOJ传送门 题目描述 农民约翰的母牛总是产生最好 ...

  3. pointnet

    无序性:虽然输入的点云是有顺序的,但是显然这个顺序不应当影响结果.点之间的交互:每个点不是独立的,而是与其周围的一些点共同蕴含了一些信息,因而模型应当能够抓住局部的结构和局部之间的交互.变换不变性:比 ...

  4. java读取HDFS压缩文件乱码

    java通过调用HDFS系统的FileSystem等API 直接读取HDFS的压缩文件会产生乱码 解决方法: 1.调用解码的API,解码后通过IO流处理. public static void mai ...

  5. ABP .net framework版 的发布

    先正常的发布流程走 特别的如下图

  6. 字符串的方法slice、substr、substring对比

    三个方法的参数1都代表子串开始位置,参数2在slice和substring中表示结束位置,而在substr中代表的则是子串长度: 对于负数态度,当出现在参数1的位置时,slice和substr从末尾开 ...

  7. TensorFlow分布式训练MNIST分类器

    http://c.biancheng.net/view/2004.html 本节以分布式方式训练完整的 MNIST 分类器. 该案例受到下面博客文章的启发:http://ischlag.github. ...

  8. Qt 实现超时锁屏

    最近使用Qt实现超时锁屏的功能(工控机触摸屏),当手长时间不触摸屏幕的时候,程序超时会显示锁屏窗口. 一.效果 主窗口超时显示锁屏窗口: 系统窗口超时显示锁屏窗口: 二.实现思路 首先开启一个线程用于 ...

  9. JavaScript核心知识点

    一.JavaScript 简介 一.JavaScript语言的介绍:JavaScript是基于对象和原型的一种动态.弱类型的脚本语言 二.JavaScript语言的组成:JavaScript是由核心语 ...

  10. C# 读取配置指定Config文件--亲测通过

    直接上代码: public class ConfigUtils { public static String GetKey(String configPath,String key) { Config ...