一、 关于本篇博文

该文档简单主要描述了如何找出开机各个阶段耗时情况,以及对开机各个阶段的分析方法和如何优化开机时间,减少耗时。便于读者可以通过此文档了解开机时间的各个阶段的耗时情况。

二、开机各阶段的耗时情况

具体开机时间的优化需要根据开机流程来分析: 找出各个阶段的耗时情况 
2.1、zygote阶段 
一般有两个耗时点: 
a). 预加载class/resource的时间。需要确认是否有添加很多系统资源 
b). 这期间是否有很多GC动作 
2.2、SystemServer阶段: 
Check各个service开机初始化过程的耗时情况 
通常耗时点: 
a). pms scan package阶段: 
b). pms dexopt阶段: 
c).其他service初始化过程问题。 
2.3、AMS Ready阶段: 
Check耗时情况,通常耗时点:prebootcompleted动作;启动service/persistent进程;如果没有客制化动作,基本上无优化空间 
2.4、动画包过大问题

如果动画包过大,播放的图片过多,分辨率过高也会影响开机时间
2.5、StopBootAnimation: 
WMS需要在keyguard, wallpaper, launcher都初始化好的前提下,才会停止开机动画。 
需要check keyguard是否有做完、Check wallpaper是否有异常、Check launcher 初始化时间。

三、开机时间分析

3.1 cat/proc/bootprof[单位:ms(毫秒)]

从下面的log中我们可以看到内核启动时间标志字段:BOOT_Animation:END

3.1.1 Preloader&lk time

Preload和lk启动时间如下:

3.1.2 Kernel Init

Kernel初始化时间 如下:

3.1.3 Mount partition

分区挂载时间如下:

3.1.4 Android Boot

3.1.4.1 Pre-load classes

预加载类所消耗的时间

3.1.4.2 Package scanning

包扫描时间

3.1.4.3 App initializations

AP初始化时间

3.2 通过添加log得到Package扫描耗时情况

源码位于:frameworks/base/service/java/com/android/server/PackageManagerService.java中的scanDirLi()方法中

private void scanDirLI(File dir, int flags, int scanMode, long currentTime) {

......

if (DEBUG_PACKAGE_SCANNING) {

Log.d(TAG, "Scanning app dir " + dir + " scanMode=" + scanMode

+ " flags=0x" + Integer.toHexString(flags));

}

long startScan,endScan;

int i;

for (i=0; i<files.length; i++) {

File file = new File(dir, files[i]);

if (!isPackageFilename(files[i])) {

// Ignore entries which are not apk's

continue;

}

......

startScan = SystemClock.uptimeMillis();

Log.d(TAG,"scan package: " + file.toString() + " , start at: " + startScan + "ms.");

PackageParser.Package pkg = scanPackageLI(file,

flags|PackageParser.PARSE_MUST_BE_APK, scanMode, currentTime, null);

endScan = SystemClock.uptimeMillis();

Log.d(TAG,"scan package: " + file.toString() + " , end at: " + endScan + "ms. elapsed time = " + (endScan - startScan) + "ms.");

......

}

我们可以通过DDMS通过搜索关键字scan package,TAG为PackageManager进行查看。

四、开机时间优化

4.1 cat /proc/mtprof/cputime

相关字段解释:

  1. Process:进程名
  2. Status:进程状态,e.g如果进程处于活动状态值为L(alive),否则为D(dead)
  3. PID、TGID:进程ID和线程组ID
  4. CPU Time(ms):真正使用CPU的时间
  5. Elapsed(ms):生命周期内耗时
  6. User:用户模式时间
  7. Kernel:Kernel模式时间

4.2 Application init

我们需要防止无关AP在启动期间进行初始化操作,因为Android在安装新的apk后可能会启动一些额外的应用。我们需要找出哪些在系统启动完成前启动了哪些应用程序,来进一步确认是否有启动了一些不需要的AP。

3.2.1在系统启动期间对应用初始化是因为在Apk的AndroidManifest.xml中application节点android:persistent的值为true。这个属性从字面上来说可以理解为可持久,也就是常驻的应用。被该属性修饰的应用会在系统启动之后被AM启动起来。例如PhoneApp在AndroidManifest.xml中注册了常驻app:

<application android:name=”PhoneApp”

android:persisitent=”true”

android:label=”@string/dialerIconLabel”

android:persisitent=”@drawable/ic_launcher_phone”>

4.2.2一些应用程序的启动是被其他AndroidAP唤起的如:

  • Services request
  • Content Provider
  • BroadCast Recievier

4.3 启动动画

系统安装了过多的应用很容易影响启动时间,主要在package scanning和application init。那么此时Boot animation也会随着这种影响而进一步影响启动时间。原因如下:

E.g:如果android启动动画占用10%的CPU,那么如果系统启动时间为20sec,那么动画占用的时间就是2s(动画耗时:20*10%=2),那么也就是说我们安装的应用越多,动画对整个开机过程的影响也就越大。

Android开机时间分析相关推荐

  1. 【Android系统】Android开机时间分析

    参看博客: https://www.jianshu.com/p/30fdf86c3462?from=singlemessage                                      ...

  2. RK2908开机时间分析及优化

    1    RK2908开机时间分析和优化文档背景概述      目前由于RK2908开机时间比较长(平均35s)可能对一体机项目的整体体验造成影响,所以需要对RK2908开机整个流程进行分析,是否有优 ...

  3. Android开机时间工具分析

    背景 android 上面有很多的方法可以分析开机时间 比如打log,通过log 分析.android 的官网上面提供了下面的两种图形化的方式来分析开机时间,一些异常很明显的拖长整个开机时间的活动 可 ...

  4. ANDROID开机动画分析

    开机动画文件:bootanimation.zip在system\media文件夹下 动画是由系列图片连续刷屏实现的.. bootanimation.zip文件是zip压缩文件,压缩方式要求是存储压缩, ...

  5. Android开机时间慢问题调试小技巧

    adb shell cat /proc/bootprof 会把各部分用的时间打出来 然后根据时间看是慢在哪个地方,根据log逐步分析即可

  6. Android开机时间统计,android 开机时间检测

    基于SPRD平台,根据关键字检查开机耗时 #coding=utf-8 __author__="ao.deng" import ctypes, sys,os import re ST ...

  7. 开机时间分析工具WPT Xperf使用

    1.使用xbootmgr工具收集启动信息 xbootmgr.exe -trace boot 2.分析启动过程和性能 xperf -i "boot_BASE+CSWITCH_1.etl&quo ...

  8. 安卓系统开机时间优化分析

    Android 开机时间分析工具-----perfboot 安卓10开机时间优化分析 Android开机阶段log分析

  9. 安卓10开机时间优化分析

    本文从以下六点分析开机时间 1.软件环境2.开机时间测试方法3.开机各阶段重要的时间节点4.bootchart工具使用说明5.Android开机时间日志信息6.开机时间优化方案 一.软件环境 平台:a ...

最新文章

  1. 在织梦模板中不适用ajax,直接用标签也能调用当前会员的信息
  2. bo65连oracle报服务不响应,ORACLE常见问题一千问[1至100]
  3. printf 和sprintf
  4. Mybatis_映射文件配置
  5. 如何使用Spring和Velocity在Java中编写HTML电子邮件
  6. Latex 修改公式的的大小
  7. vue项目 :npm命令安装jquery
  8. c++ jna 数据类型_JNA实战笔记汇总一 简单认识JNA|成功调用JNA
  9. 【GDOI 2011 DAY2 T3】零什么的最讨厌了 (快速求阶乘、中国剩余定理)
  10. php 计算日期差几周,PHP计算两个时间之差的函数(年,月,周,日,小时,分钟,秒数)
  11. 剑指offer十八之二叉树的镜像
  12. Django:(02)项目配置
  13. MAC使用Charles,代理后,部分网页无法打开解决方法
  14. 程序自动化 linux_自动化Windows子系统Linux安装程序
  15. (深度学习快速入门)第三章第一节:多层感知器简介
  16. Quick BI 数据大屏快速入门
  17. 数据分析方法:非正态数据转化成正态数据
  18. 3 款强大的开源密码管理器
  19. 内网渗透之跨路由访问
  20. 谷粒商城-07-p102-p138

热门文章

  1. 【BI学习心得16-模型融合与供应链预测】
  2. leetcode#190 颠倒二进制位
  3. DSD(Dense-Sparse-Dense Training)算法详解
  4. 数字赋能 | 陕建数科与益企联科技签署合作伙伴协议
  5. (转)CPU 参数详解
  6. vscode+markdown+mpe+markdown pdf写markdown文档并生成pdf的解决方案和配置方法
  7. python执行sql查询脚本并填写到excel_用Python执行SQL、Excel常见任务?10个方法全搞定!...
  8. “高级感”的设计,从这20款精选Google网页字体开始【免费】
  9. vcsa6.7安装部署配置记录
  10. nRF52840低功耗蓝牙模块芯片