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最复杂的一块,管他呢,玩玩而已!
android启动时间慢的问题的更多相关文章
- Android启动时间测试方法
android apk启动时间可以通过下面的命令来完成测试,最终会生成一个mp4的视屏文件,通过播放录制好的视屏来统计app的启动时间精确到ms级别 例如:adb shell screenreco ...
- 性能adb命令
启动时间-冷启动启动App命令adb shell am start -W -n com.bit_health.android/.ui.common.activities.BitHealthMainAc ...
- 探究 | App Startup真的能减少启动耗时吗
前言 之前我们说了启动优化的一些常用方法,但是有的小伙伴就很不屑了: "这些方法很久之前就知道了,不知道说点新东西?比如App Startup?能对启动优化有帮助吗?" ok,既然 ...
- Android 中如何计算 App 的启动时间?
(转载) 已知的两种方法貌似可以获取,但是感觉结果不准确:一种是,adb shell am start -w packagename/activity,这个可以得到两个值,ThisTime和Total ...
- Android应用启动时间及启动日志获取方法
1. Android应用中,可以使用如下方式进行应用启动时间的查看 2. 启动日志获取方法:
- Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息
Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息 by:授客 QQ:1033553122 1. 查看内存信息 1)查看所有内存信息 命令: dumpsys mem ...
- Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息
1. 查看内存信息 1)查看所有内存信息 命令: dumpsys meminfo 例: C:\Users\laiyu>adb shell shell@android:/ $ dumpsys m ...
- 利用uiautomator实现Android移动app启动时间的测试
为了减少因手工测试的反应误差,这里介绍下如何利用Android自带的自动化测试工具uiautomator实现app启动时间的测试. 测试基本思路如下: 1.启动前记录当前的时间戳 2.启动app,直至 ...
- 利用统计学知识为android应用的启动时间做数据分析
[声明:如需转载本文,请注明来源] 一.数据说明 启动时间用同一台设备,同一个包进行启动时间的测试,其中三组样本数据(每组100份对比数据)如下: 设备pro-5-1 base_list_1 = [0 ...
随机推荐
- CPU中断的工作原理,从最底层讲起
前言 中断的概念属于硬件层.虽然我们在进行软件编程时不会直接使用中断,但理解它对我们来说依然重要. 我们在使用线程切换及状态管理.异常处理.硬件与处理器的交互.I/O操作等指令时,中断都在默默的为我们 ...
- js中a + 1 < a等于true,(a ==1 && a== 2 && a==3) 等于 true如何实现
先说a + 1 < a const a = { i: 1, valueOf: () => { if (a.i === 1) { return a.i++; } return a.i+2; ...
- CSS 分割线
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Salesforce Lightning开发学习(三)Component表单初解
初步了解了Lightning的组件开发流程后,我们来认识下lightning的表单 点击对象管理器,选择对象:电影(Movie__c),创建字段 标签 API 数据类型 票价 Number__c ...
- leetcode 111. 二叉树的最小深度
题目描述: 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null, ...
- go 优秀文档
go语言资料汇总 : https://blog.zhnytech.com/articles/2016/07/15/Golang%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99% ...
- 你真的了解java的lambda吗?- java lambda用法与源码分析
你真的了解java的lambda吗?- java lambda用法与源码分析 转载请注明来源:cmlanche.com 用法 示例:最普遍的一个例子,执行一个线程 new Thread(() -> ...
- .NET配置引用程序集的路径(分离exe和dll)
按照引用程序集路径的不同,程序集DLL分为两类: 1)全局DLL(在GAC中注册,GAC——全局程序集缓存),有关GAC的详细资料可以参考一下链接: http://dddspace.com/2011/ ...
- Spring Boot 2整合Redis做缓存
既然是要用Redis做缓存,自然少不了安装了.但是本文主要讲Spring Boot与Redis整合.安装教程请另行百度! 1.首先是我们的Redis配置类 package com.tyc; impor ...
- LeetCode 717. 1比特与2比特字符(1-bit and 2-bit Characters)
717. 1比特与2比特字符 LeetCode717. 1-bit and 2-bit Characters 题目描述 有两种特殊字符.第一种字符可以用一比特0来表示.第二种字符可以用两比特(10 或 ...