开机启动花了40多秒,正常开机只需要28秒就能开机起来。

  内核的启动我没有去分析,另一个同事分析的。我主要是分析从SystemServer启来到开机动画结束显示解锁界面的这段时间,也就是开机动画的第三个动画开始到结束这段时间,这是个比较耗时阶段,一般都在17秒左右(见过牛B的手机,只需5秒)。

  SystemServer分两步执行:init1和init2。init1主要是初始化native的服务,代码在system_init.cpp的system_init,初始化了SurfaceFlinger和SensorService这两个native的服务。init2启动的是java的服务,比如ActivityManagerService、WindowManagerService、PackageManagerService等,在这个过程中PackageManagerService用的时间最长,因为PackageManagerService会去扫描特定目录下的jar包和apk文件。

  在开机时间需要40多秒的时,从Log上可以看到,从SurfaceFlinger初始化到动画结束,要27秒左右的时间,即从SurfaceFlinger::init的LOGI("SurfaceFlinger is starting")这句Log到void SurfaceFlinger::bootFinished()的LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) ),需要27秒左右的时间,这显然是太长了,但到底是慢在哪了呢?应该在个中间的点,二分一下,于是想到了以启动服务前后作为分隔:是服务启动慢了,还是在服务启动后的这段时间慢?以ActivityManagerService的Slog.i(TAG, "System now ready")的这句Log为分割点,对比了一下,在从SurfaceFlinger is starting到System now ready多了7秒左右的时间,这说明SystemServer在init1和init2过程中启动慢了,通过排查,发现在init1启动的时候,花了7秒多的时间,也就是system_init的LOGI("Entered system_init()")到LOGI("System server: starting Android runtime.n")这段时间用了7秒多,而正常情况是400毫秒便可以初始化完,通过添加Log看到,在SensorService启动时,用了比较长的时间。

  不断的添加Log发现,在启动SensorService时候,关闭设备文件变慢了,每次关闭一个/dev/input/下的设备文件需要100ms左右,而SensorService有60~70次的关闭文件,大概有7s左右的时间。

  调用流程是:

  frameworks/base/cmds/system_server/library/system_init.cpp: system_init->SensorService::instantiate

  frameworks/native/services/sensorservice/SensorService.cpp: void SensorService::onFirstRef()->SensorDevice& dev(SensorDevice::getInstance())

  hardware/libsensors/SensorDevice.cpp: SensorDevice::SensorDevice()->sensors_open

  hardware/libsensors/sensors.cpp: open_sensors->sensors_poll_context_t

  sensors_poll_context_t执行打开每个传感器设备时,遍历/dev/input/目录下的设备文件,以匹配当前需要打开的设备,遍历文件是在

  hardware/libsensors/SensorBase.cpp的openInput下实现,如果打开的设备文件不是正在打开的设备文件,会执行下面语句的else部分:

  if (!strcmp(name, inputName)) {

  strcpy(input_name, filename);

  break;

  } else {

  close(fd);

  fd = -1;

  }

  close每次需要100ms左右,每次打开传感器部分都执行去这样的操作,导致了在这有大概7s左右的延迟。

  优化完这段时间后,系统启动变快了7秒,但还是慢,因为对比可以发现:

  开机28秒:

  04-16 16:14:22.205 140 343 I SurfaceFlinger: Using composer version 1.0

  04-16 16:14:34.167 527 542 I ActivityManager: System now ready

  04-16 16:14:39.089 140 605 I SurfaceFlinger: Boot is finished (16985 ms)

  开机34秒:

  04-18 15:32:55.565 I/SurfaceFlinger( 242): SurfaceFlinger is starting

  04-18 15:33:05.214 I/ActivityManager( 622): System now ready

  04-18 15:33:17.658 I/SurfaceFlinger( 242): Boot is finished (22091 ms)

  可见还是慢了6秒。但这6秒慢在了似乎是在服务启动后的时间,这个时候比较难分析了,原因是这是所有的服务起来了,而且发出了bootcomplete广播,应用也开始起来,但还没用解锁,开始以为是Launcher起来慢了,但换了一个Google原始的Launcher进去,并没有变快。

  我们用两个版本的手机,W制式的跟TD的,过来几天发现TD的手机比W的开机快,而且TD的28秒左右能起来,但W的却要34秒,问了一下驱动的同事,W跟TD的并没有什么区别,所以除了Modem不一样以外,其他的都一样。找了一天,依然毫无结果。从Log中看,都只这慢一点,那慢一点,只有在Packmanager在扫描包的过程中,W+GSM需要6秒左右的时间,而TD+GSM只需要3秒左右的时间,但也不至于花费6秒的时间。但软件版本是一样的,猜测是硬件的问题,但硬件都是一样的,除了Modem不一样以外,开始怀疑Modem,W+GSM是正常的开机模式,而TD+GSM却是在mbp模式下开机的,弄成一样的开机模式,依然没有改变两个开机时间。到最才发现W的手机用的是16G的EMMC,而TD的手机用的是32G的EMMC,而且32G的EMMC比16G的EMMC读写速度快,以为找到了原因,结果很失望,通过电子的同事,把EMMC对换了一下,开机速度还是没有变化,快的还是快,慢的还是这么慢,晕,白高兴了一场,但至少也发现了EMMC读写速度是不一样的,至少不是一无所获。折腾了一天,也就得到个这样的结果!!!

  过来一段时间以后,发现W的手机也变好了,28秒就能开机起来了,这是多么兴奋的是呀,不用解,问题就好了!可惜好景不长,没过多久,发现W的手机开机时间又变回33秒了,这还真让人郁闷,于是用抓Log看下,结果就诧异了,从SurfaceFlinger is starting到Boot is finished用是时间还是17秒左右,并没有变长呀!这是什么原因呢?同过实时的抓取LOG发现,28秒能开机起来的时候,Boot is finished这句LOG一打出,解到了解锁界面,但33秒是,却还等了一会才有解锁界面,难怪!一问,才知道他们在Boot is finished加了一句usleep(5*1000*1000),原因是不这样做,解锁在开机起来后滑不动或者会卡顿,所以加了5秒的延迟

来自 原文地址“http://blog.csdn.net/oujunli/article/details/8866613”

Android 开机启动慢的原因分析相关推荐

  1. Android中app卡顿原因分析示例

    http://www.cnblogs.com/zhucai/p/weibo-graphics-performance-analyse.html 朱才 专注于Android图形动画 MIUI工程师 博客 ...

  2. Android开机启动流程简析

    Android开机启动流程简析 (一) 文章目录 Android开机启动流程简析 (一) 前言 一.开机启动的流程概述 二.Android的启动过程分析 (1).总体流程 init简述 Zygote简 ...

  3. php7应用程序无法启动,window_win7系统打开软件提示应用程序无法启动的故障原因分析及2种解决方法,      nbs - phpStudy...

    win7系统打开软件提示应用程序无法启动的故障原因分析及2种解决方法 win7系统打开软件提示应用程序无法启动,因为应用程序的并行配置不正确,具体问题现象如下图所示: 故障原因分析: 一个可能是Win ...

  4. Android开机启动Activity或者Service方法

    这段时间在做Android的基础开发,现在有一需求是开机启动,按照网上某些博文教程做了下,始终不成功,一开机总是提示所启动的应用程序意外终止,于是参考了Android SDK doc,终于解决问题,下 ...

  5. Android开机启动流程

    Android开机启动流程 一.APPS PBL(Application primary boot loader:主引导加载程序) 二.XBL(Extensible boot loader:可扩展引导 ...

  6. Android开机启动性能优化

    Android 开机启动速度优化 一 在开机启动中,可以借助bootchart 工具分析android的启动过程.bootchart是一个用于linux启动过程性能分析的开源软件工具,在系统启动过程自 ...

  7. Android 开机启动shell脚本

    接到一个集成功能的需求,然后看了一下是由上层应用 + linux进程实现的功能,需要增加开机自动启动linux进程,没弄过有点懵. 这个不怎么正确,仅供参考,在权限那块需要更改,放到system下 环 ...

  8. Android开机启动的那些事

    以前知道AMS.PMS这些概念及其功能,开发的过程中也会用到,就是不知道其来源,好奇心害死猫,扒着扒着扒到系统开机启动这个知识层面上来了,好吧,那今天就说说这个吧! 系统开机启动过程 Android系 ...

  9. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 后续分析 | Application 替换位置 )

    文章目录 一.ActivityThread 后续分析 二.ActivityThread 相关源码 三.Application 替换位置 dex 解密时 , 需要将 代理 Application 替换为 ...

最新文章

  1. 【廖雪峰Python学习笔记】面向对象高级编程
  2. 英特尔是个可以讲理的地儿
  3. 初步认识Volatile-总结可见性的本质
  4. web安全---SSRF漏洞
  5. 大型动态应用系统平台系统架构?这些大家并不陌生
  6. 计算机网络 HTTP工作机制 TCP三次握手四次挥手 TCP滑动窗口
  7. thinkphp mysql 密码加密_thinkphp微信开发(消息加密解密)
  8. 赣榆高中2021高考成绩查询,2020年连云港赣榆高考续写辉煌,各大高中“喜报”新鲜出炉...
  9. 操作系统—死锁的预防
  10. 爬虫5_python2_使用 Beautiful Soup 解析数据
  11. I8700手机使用感受
  12. ByPass UAC
  13. saas平台相关内容
  14. Xshell重启服务器
  15. 烟雨江湖小米鸿蒙,烟雨江湖小米时装怎么拿? 小米衣服获取方法详解[多图]
  16. java用什么测试工具_10款常用的JAVA测试工具
  17. java程序获取时区不对,linux时区不正确解决整理
  18. 分享67个PHP源码,总有一款适合您
  19. jquery防止重复提交表单
  20. Ant Design Pro使用之--EditableProTable 可编辑表格

热门文章

  1. 深入jQuery Mobile
  2. 小丸工具箱组件更新 下载
  3. 快速提高网站流量的办法
  4. sentinel 热点限流
  5. pytorch单卡训练多卡训练
  6. getchar与putchar
  7. quote mysql_【原创】11. MYSQL++ 之 Quoting 与 Escaping
  8. 共识算法论文——Paxos Made Simple
  9. #039;pan java_每个'循环的Java'如何工作?
  10. 最大质因数 最大回文数乘积 字符串String类用法_Java每日练习题及题解(11月16日)