Android开机时间分析
一、 关于本篇博文
该文档简单主要描述了如何找出开机各个阶段耗时情况,以及对开机各个阶段的分析方法和如何优化开机时间,减少耗时。便于读者可以通过此文档了解开机时间的各个阶段的耗时情况。
二、开机各阶段的耗时情况
具体开机时间的优化需要根据开机流程来分析: 找出各个阶段的耗时情况
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
相关字段解释:
- Process:进程名
- Status:进程状态,e.g如果进程处于活动状态值为L(alive),否则为D(dead)
- PID、TGID:进程ID和线程组ID
- CPU Time(ms):真正使用CPU的时间
- Elapsed(ms):生命周期内耗时
- User:用户模式时间
- 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开机时间分析相关推荐
- 【Android系统】Android开机时间分析
参看博客: https://www.jianshu.com/p/30fdf86c3462?from=singlemessage ...
- RK2908开机时间分析及优化
1 RK2908开机时间分析和优化文档背景概述 目前由于RK2908开机时间比较长(平均35s)可能对一体机项目的整体体验造成影响,所以需要对RK2908开机整个流程进行分析,是否有优 ...
- Android开机时间工具分析
背景 android 上面有很多的方法可以分析开机时间 比如打log,通过log 分析.android 的官网上面提供了下面的两种图形化的方式来分析开机时间,一些异常很明显的拖长整个开机时间的活动 可 ...
- ANDROID开机动画分析
开机动画文件:bootanimation.zip在system\media文件夹下 动画是由系列图片连续刷屏实现的.. bootanimation.zip文件是zip压缩文件,压缩方式要求是存储压缩, ...
- Android开机时间慢问题调试小技巧
adb shell cat /proc/bootprof 会把各部分用的时间打出来 然后根据时间看是慢在哪个地方,根据log逐步分析即可
- Android开机时间统计,android 开机时间检测
基于SPRD平台,根据关键字检查开机耗时 #coding=utf-8 __author__="ao.deng" import ctypes, sys,os import re ST ...
- 开机时间分析工具WPT Xperf使用
1.使用xbootmgr工具收集启动信息 xbootmgr.exe -trace boot 2.分析启动过程和性能 xperf -i "boot_BASE+CSWITCH_1.etl&quo ...
- 安卓系统开机时间优化分析
Android 开机时间分析工具-----perfboot 安卓10开机时间优化分析 Android开机阶段log分析
- 安卓10开机时间优化分析
本文从以下六点分析开机时间 1.软件环境2.开机时间测试方法3.开机各阶段重要的时间节点4.bootchart工具使用说明5.Android开机时间日志信息6.开机时间优化方案 一.软件环境 平台:a ...
最新文章
- 在织梦模板中不适用ajax,直接用标签也能调用当前会员的信息
- bo65连oracle报服务不响应,ORACLE常见问题一千问[1至100]
- printf 和sprintf
- Mybatis_映射文件配置
- 如何使用Spring和Velocity在Java中编写HTML电子邮件
- Latex 修改公式的的大小
- vue项目 :npm命令安装jquery
- c++ jna 数据类型_JNA实战笔记汇总一 简单认识JNA|成功调用JNA
- 【GDOI 2011 DAY2 T3】零什么的最讨厌了 (快速求阶乘、中国剩余定理)
- php 计算日期差几周,PHP计算两个时间之差的函数(年,月,周,日,小时,分钟,秒数)
- 剑指offer十八之二叉树的镜像
- Django:(02)项目配置
- MAC使用Charles,代理后,部分网页无法打开解决方法
- 程序自动化 linux_自动化Windows子系统Linux安装程序
- (深度学习快速入门)第三章第一节:多层感知器简介
- Quick BI 数据大屏快速入门
- 数据分析方法:非正态数据转化成正态数据
- 3 款强大的开源密码管理器
- 内网渗透之跨路由访问
- 谷粒商城-07-p102-p138
热门文章
- 【BI学习心得16-模型融合与供应链预测】
- leetcode#190 颠倒二进制位
- DSD(Dense-Sparse-Dense Training)算法详解
- 数字赋能 | 陕建数科与益企联科技签署合作伙伴协议
- (转)CPU 参数详解
- vscode+markdown+mpe+markdown pdf写markdown文档并生成pdf的解决方案和配置方法
- python执行sql查询脚本并填写到excel_用Python执行SQL、Excel常见任务?10个方法全搞定!...
- “高级感”的设计,从这20款精选Google网页字体开始【免费】
- vcsa6.7安装部署配置记录
- nRF52840低功耗蓝牙模块芯片