本文从以下六点分析开机时间

  1.软件环境2.开机时间测试方法3.开机各阶段重要的时间节点4.bootchart工具使用说明5.Android开机时间日志信息6.开机时间优化方案

一、软件环境

 平台:android10.0  qcom  sm6125场景:手机4+64时间:2020.08.04

二、开机时间测试方法

   测试方法:刷机user版本的软件,开机后,需要联网等待5分钟,然后重启机器5次后,再开始计时抓取log,同时手指触摸屏幕,感觉到振动开始用秒表计时,直到看到Launcher界面,停止秒表计时,这个阶段就是用户主观感受到的开机时间。

三、开机各阶段重要的时间节点

四、bootchart工具使用说明

bootchart是android原生自带的性能分析工具,可以收集android开机过程中的log。再利用jar包能够将开机时各个进程呈现在图表中。可以比较直观的看到开机时哪些比较耗时。

4.1有源码的情况下并且设备可以连接pc机,采用下述方法生成bootchart.png

4.1.1启用Bootchart

在pc机上安装bootchart工具,命令如下: sudo apt-get install bootchart pybootchartgui

android中的bootchart源码位于system/core/init目录下,bootchart.cpp中有个do_bootchart_start()函数

代码中时通过判断是否有/data/bootchart/enabled文件来启动bootchart的,所以创建一个这个文件即可启动

4.1.2设置收集数据时间

这个在源码中没有找到相应的说明

创建/data/bootchart/start文件存储bootchart采样时间(s)

adb shell ‘echo 120 > /data/bootchart/start’

4.1.3生成图表

启用bootchart并且设置好时间后,重启机器,会在/data/bootchart下生成log文件,从源码中可以看到当前会生成哪些日志文件。除了这个log文件之外还会生成一个header文件,也是必须的。

重启设备,init运行时将自动创建文件夹/data/bootchart/,并在其中保存采样数据,采样数据由5个文件组成:

然后利用bootchart工具把这些日志转成png图片

执行 /system/core/init/grab-bootchart.sh 自动生成png图片

4.2没有源码或者设备无法连接pc机的情况下采用下述方法生成bootchart.png

使用bootchart.jar处理日志压缩文件

从https://sourceforge.net/projects/bootchart/下载bootchart源码,放到ubuntu目录下,执行ant生成bootchart.jar

将手机 /data/bootchart/ 下文件 (header proc_diskstats.log proc_ps.log proc_stat.log) pull出来copy到服务器,执行下压缩命令生成bootchart.tgz

tar zcvf bootchart.tgz header proc_diskstats.log proc_ps.log proc_stat.log

使用jar转成png图

java -jar bootchart.jar bootchart/bootchart.tgz

4.3代码中新加功能Comparing two bootcharts,对比两个bootchart图.

通过compare-bootcharts.py脚本对比所选两个进程的开始结束时间点,从而得到对应进程之间的耗时差距. 当我们使用grab-bootchart.sh脚本获取对应的bootcahrt图时,会在PC的/tmp/android-bootchart目录下留下bootchart.tgz压缩包.然后将所要比较的两个bootchart的压缩包放在两个不同的目录base_bootchart_dir, exp_bootchart_dir.执行如下命令:

system/core/init/compare-bootcharts.py base_bootchart_dir exp_bootchart_dir

就可以得到如下信息:

可以看到开机动画一个结束时间为26.4s, 一个为29.6s,两者相差3.2s

五、Android开机时间日志信息

Android是基于Linux内核的系统,因此Android的启动过程是分为两个阶段:
1) 第一个阶段就是Linux内核的启动;
2) 第二个阶段就是Android框架的启动,包括核心服务+程序。

  Linux内核通过printk打印的log信息,这些log写入到了/dev/kmsg文件中,在Shell终端可以通过   dmesg命令查看这些log信息。 下面我们分别从两种log信息中找到如何统计系统启动时间的方法:

5.1 通过dmesg信息统计系统启动时间 首先,我们通过dmesg命令抓取Linux内核的log信息(部分系统可能需要先执行 adb root): adb shell cat /proc/bootmsg > bootmsg.txt $ adb shell dmesg > dmesg.txt

 log里面搜关键字"KPI" "first stage" "second stage"

5.2. 通过logcat统计系统的启动时间

Android的log系统是独立于Linux内核log系统的, Android系统把Log分为了四类,不同的类别记录不同的Log信息:

main - 主要的Log信息,大部分应用级别的Log信息都在这里
events - 系统事件相关的Log信息
radio - 无线/电话相关的Log信息
system - 低级别的系统调试Log信息
默认通过logcat抓取的是main信息

如果想抓取指定类别的log信息的方法,在logcat命令后加-b参数,例如:
$ adb logcat -d -v time -b “main” > main.txt $
adb logcat -d -v time -b “events” > events.txt $
adb logcat -d -v time -b “system” > system.txt $
adb logcat -d -v time -b “radio” > radio.txt
那么,如何统计Android系统的启动时间呢? 我们可以重点关注events类别的log信息,
通过如下命令: $ adb logcat -d -b events | grep “boot”
如图所示,这是我在高通的SM6125开发板上抓取的log信息

|boot_progress_start|代表着系统进入用户空间,标志着kernel启动完成,Android屏幕点亮,开始显示启动动画,即9.353s开始闪烁Android字样。
|boot_progress_preload_start|Zygote启动
|boot_progress_preload_end|Zygote结束
|boot_progress_system_run|SystemServer ready,开始启动Android系统服务,如PMS,APMS等 |boot_progress_pms_start|PMS开始扫描安装的应用
|boot_progress_pms_system_scan_start|PMS先行扫描/system目录下的安装包
|boot_progress_pms_data_scan_start|PMS扫描/data目录下的安装包
|boot_progress_pms_scan_end|PMS扫描结束
|boot_progress_pms_ready|PMS就绪
|boot_progress_ams_ready|AMS就绪
|boot_progress_enable_screen|AMS启动完成后开始激活屏幕,从此以后屏幕才能响应用户的触摸,它在WindowManagerService发出退出开机动画的时间节点之前,而真正退出开机动画还会花费少许时间,具体依赖animation zip 包中的desc.txt。wm_boot_animation_done才是用户感知到的动画结束时间节点
|sf_stop_bootanim|SF设置service.bootanim.exit属性值为1,标志系统要结束开机动画了,可以用来跟踪开机动画结尾部分消耗的时间 |wm_boot_animation_done|开机动画结束,这一步用户能直观感受到开机结束。

六、开机时间的优化方案

6.1bootloader阶段uart串口log关闭-------节省了 1.5 秒

6.1.1/ARM9/Nicobar/boot_images/QcomPkg/Library/UartQupv3Lib/UartXBLLoaderOs.c

6.1.2ARM9/Nicobar/boot_images/QcomPkg/XBLLoader/boot_uart.c

6.1.3 kernel/msm-4.14/arc/arm64/configs/vendor/trinket-perf_deconfig&trinket_deconfig

6.2 修改驱动log控制台输出等级-------节省了 1.5 秒

kernel-msm-4.14\kernel\printk\printk.c
Kerne-msm-4.14-include-linux-kern_levels.h
device/qcom/common/rootdir/etc/init.qcom.sh ++++++
buildvariant=getprop ro.build.type
case “$buildvariant” in
“userdebug” | “eng”)
#set default loglevel to KERN_INFO
echo “7 7 1 7” > /proc/sys/kernel/printk
;;
*)
#set default loglevel to KERN_WARNING
echo “3 3 1 4” > /proc/sys/kernel/printk
;;
esac
6.3 通过移除不使用的内核配置和减少驱动程序-------节省了 0.3 秒

kernel的优化先check一遍config的配置,kernel中config的配置种类繁多,就算是工作几年的kernel工程师也不一定能清楚每一个config值的作用。Android提供了一个基础配置表。
综合比较后的结果,本地一点点调试,查找资料。最终去掉了如下config:

这里说下config的配置有y,n,m,m表示编译成模块,不编译进内核。不配置的话相当于n。
CONFIG_DEBUG_INFO 不能去掉, 会引起CTS不过。由于config的的各项值可能散落在kernel的不同文件中,我们可以单独编译下kernel,然后去out目录下查看obj/KERNEL_OBJ/.config 文件,这里面的配置项是完全的。

6.4 优化开机时间,去除PMS不需要的GC操作-------节省了 0.1 秒

优化开机时间,去除PMS不需要的GC操作

PMS.java构造方法,第五阶段pms.systemready最后调用的gc

阶段1:BOOT_PROGRESS_PMS_START

阶段2:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START

阶段3:BOOT_PROGRESS_PMS_DATA_SCAN_START

阶段4:BOOT_PROGRESS_PMS_SCAN_END

阶段5:BOOT_PROGRESS_PMS_READY

6.5 PMS开机扫描APK多线程处理方案-------节省了 0.3 秒

Android开机性能的优化是每个手机项目的必须点.针对开机性能,Apk的扫描安装耗时是大头,通常采用多线程方案,针对Dir或者Dir中的package进行多线程扫描.这里介绍我司项目中一种针对package进行优化扫描的方案(来源于高通)

相关代码:

PackageManagerService

private void scanDirLI(File dir, final int parseFlags, int scanFlags, long currentTime) {
final File[] files = dir.listFiles();
if (ArrayUtils.isEmpty(files)) {
Log.d(TAG, "No files in app dir " + dir);
return;
}

    if (DEBUG_PACKAGE_SCANNING) {Log.d(TAG, "Scanning app dir " + dir + " scanFlags=" + scanFlags+ " flags=0x" + Integer.toHexString(parseFlags));}Log.d(TAG, "start scanDirLI:"+dir);// use multi thread to speed up scanningint iMultitaskNum = SystemProperties.getInt("persist.pm.multitask", 6);Log.d(TAG, "max thread:" + iMultitaskNum);final MultiTaskDealer dealer = (iMultitaskNum > 1) ? MultiTaskDealer.startDealer(MultiTaskDealer.PACKAGEMANAGER_SCANER, iMultitaskNum) : null;for (File file : files) {final boolean isPackage = (isApkFile(file) || file.isDirectory())&& !PackageInstallerService.isStageName(file.getName());if (!isPackage) {// Ignore entries which are not packagescontinue;}if (RegionalizationEnvironment.isSupported()) {if (RegionalizationEnvironment.isExcludedApp(file.getName())) {Slog.d(TAG, "Regionalization Excluded:" + file.getName());continue;}}final File ref_file = file;final int ref_parseFlags = parseFlags;final int ref_scanFlags = scanFlags;final long ref_currentTime = currentTime;Runnable scanTask = new Runnable() {public void run() {try {scanPackageTracedLI(ref_file, ref_parseFlags | PackageParser.PARSE_MUST_BE_APK,ref_scanFlags, ref_currentTime, null);} catch (PackageManagerException e) {Slog.w(TAG, "Failed to parse " + ref_file + ": " + e.getMessage());// Delete invalid userdata appsif ((ref_parseFlags & PackageParser.PARSE_IS_SYSTEM) == 0 &&e.error == PackageManager.INSTALL_FAILED_INVALID_APK) {logCriticalInfo(Log.WARN, "Deleting invalid package at " + ref_file);removeCodePathLI(ref_file);}}}};if (dealer != null)dealer.addTask(scanTask);elsescanTask.run();}if (dealer != null)dealer.waitAll();Log.d(TAG, "end scanDirLI:"+dir);
}

MultiTaskDealer

package com.android.server.pm;

import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

import android.util.Log;

public class MultiTaskDealer {

public static final String TAG = "MultiTaskDealer";
public static final String PACKAGEMANAGER_SCANER = "packagescan";
private static final boolean DEBUG_TASK = false;private static HashMap<String, WeakReference<MultiTaskDealer>> map = new HashMap<String, WeakReference<MultiTaskDealer>>();public static MultiTaskDealer getDealer(String name) {WeakReference<MultiTaskDealer> ref = map.get(name);MultiTaskDealer dealer = ref!=null?ref.get():null;return dealer;
}public static MultiTaskDealer startDealer(String name,int taskCount) {MultiTaskDealer dealer = getDealer(name);if(dealer==null) {dealer = new MultiTaskDealer(name,taskCount);WeakReference<MultiTaskDealer> ref = new WeakReference<MultiTaskDealer>(dealer);map.put(name,ref);}return dealer;
}public void startLock() {mLock.lock();
}public void endLock() {mLock.unlock();
}private ThreadPoolExecutor mExecutor;
private int mTaskCount = 0;
private boolean mNeedNotifyEnd = false;
private Object mObjWaitAll = new Object();
private ReentrantLock mLock = new ReentrantLock();public MultiTaskDealer(String name,int taskCount) {final String taskName = name;ThreadFactory factory = new ThreadFactory(){private final AtomicInteger mCount = new AtomicInteger(1);public Thread newThread(final Runnable r) {if (DEBUG_TASK) Log.d(TAG, "create a new thread:" + taskName);return new Thread(r, taskName + "-" + mCount.getAndIncrement());}};mExecutor = new ThreadPoolExecutor(taskCount, taskCount, 5, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(), factory){protected void afterExecute(Runnable r, Throwable t) {if(t!=null) {t.printStackTrace();}MultiTaskDealer.this.TaskCompleteNotify(r);if (DEBUG_TASK) Log.d(TAG, "end task");super.afterExecute(r,t);}protected void beforeExecute(Thread t, Runnable r) {if (DEBUG_TASK) Log.d(TAG, "start task");super.beforeExecute(t,r);}};
}public void addTask(Runnable task) {synchronized (mObjWaitAll) {mTaskCount+=1;}mExecutor.execute(task);if (DEBUG_TASK) Log.d(TAG, "addTask");
}private void TaskCompleteNotify(Runnable task) {synchronized (mObjWaitAll) {mTaskCount-=1;if(mTaskCount<=0 && mNeedNotifyEnd) {if (DEBUG_TASK) Log.d(TAG, "complete notify");mObjWaitAll.notify();}}
}public void waitAll() {if (DEBUG_TASK) Log.d(TAG, "start wait all");synchronized (mObjWaitAll) {if(mTaskCount>0) {mNeedNotifyEnd = true;try {mObjWaitAll.wait();} catch (Exception e) {}mNeedNotifyEnd = false;}if (DEBUG_TASK) Log.d(TAG, "wait finish");return;}
}

}
简要分析

  1. iMultitaskNum
    int iMultitaskNum = SystemProperties.getInt(“persist.pm.multitask”, 6);
    iMultitaskNum代表是task数量,即线程数量.一般来说,线程数量一般等于CPU数量,让CPU资源获得最大的利用.
    2.MultiTaskDealer.startDealer
    调用MultiTaskDealer.startDealer方法,建立线程池.
    3.dealer.addTask
    for循环中建立Runnable,调用scanPackageTracedLI搜索安装apk,dealer.addTask方法把该任务提交给线程池处理.
  2. dealer.waitAll()
    主线程等待方法,同步锁是mObjWaitAll.只有当mTaskCount>0,即当仍然存在任务的时候,主线程进入线程等待.
  3. afterExecute(Runnable r, Throwable t)
    afterExecute方法会在线程任务执行后发生,这里最后会调用mObjWaitAll.notify()方法,去唤醒处于等待的主线程,当然他的判断条件显示是mTaskCount<=0,即是任务全部执行完成后.
    简单总结
    addTask针对每一个apkfile的scanpackage任务提交到线程池处理,并且mTaskCount+=1做任务的计数.
    TaskCompleteNotify在每个任务执行后进行, mTaskCount-=1做任务的计数,并且判断是否需要唤醒等待的主线程.(通过mTaskCount判断任务是否全部完成 )
    waitAll,添加所有任务到线程池后,主线程做等待,等待任务全部完成后的唤醒,然后继续执行

6.6 调整开机动画调度,优化开机时间-------节省了 0.3 秒

frameworks/base/cmds/bootanimation/bootanim.rc
writepid /dev/cpuset/background/tasks /dev/stune/background/tasks

涉及到CGroup 中background system-background foreground top-app CPU调度

6.7 打开WITH_DEXPREOPT宏后首次开机仍慢

 说明开机之后又去提取预置apk的odex文件(原本应该是在预编译阶段就生成的); 主要原因是预置apk的Android.mk对32bit和64bit的配置不准确导致。

[SOLUTION] 搜索main log关键字:dex2oat : /system/bin/dex2oat
这条log打印出就代表这个apk有在做dex2oat且是32还是64的指令集

I dex2oat : /system/bin/dex2oat --zip-fd=11 --zip-location=/system/app/.apk --oat-fd=12 --oat-location=/data/dalvik-cache/arm or arm64/system@app@@*.apk@classes.dex --instruction-set=arm or arm64 --instruction-set-features=default --runtime-arg -Xms64m --runtime-arg -Xmx512m --swap-fd=13

oat-location表示odex文件存储位置

Instruction-set表示此apk的primaryCpuAbi对应的指令集(arm对应32bit / arm64对应64bit)

请严格遵守:

1、对于64bit的芯片,若apk只32bit的lib或者只能作为32bit运行,请在预置apk时在android.mk中添加下边的TAG标记此apk为32bit:LOCAL_MULTILIB :=32 (比如出现上述做dex2oat arm的log,则需这样设定)

2、而对于有源码无lib库的apk,请注释掉LOCAL_MULTILIB :=32 (比如出现上述做dex2oat arm64的log,则需这样注释掉)

3、开机之后既提取arm又提取arm64的apk,请设定LOCAL_MULTILIB :=both (比如出现上述做dex2oat arm以及arm64的log,则需这样设定)

总之,对32bit 和 64bit 的apk做不同处理

6.8 系统APP精简

开机各阶段的耗时情况 具体开机时间的优化需要根据开机流程来分析: 找出各个阶段的耗时情况

6.9 检查期间是否有selinux avc问题导致wait耗时

1.观察events.log 发现boot_progress_enable_screen到wm_boot_animation_done 存在avc error

07-20 05:12:34.423 1577 1577 I boot_progress_ams_ready: 15555
07-20 05:12:34.504 1577 1577 I thermal_changed: [CPU0,0,43.500004,0,-2147483648]
07-20 05:12:34.504 1577 1577 I thermal_changed: [CPU1,0,43.500004,0,-2147483648]
07-20 05:12:34.504 1577 1577 I thermal_changed: [CPU2,0,43.500004,0,-2147483648]
07-20 05:12:34.504 1577 1577 I thermal_changed: [CPU3,0,43.500004,0,-2147483648]
07-20 05:12:34.504 1577 1577 I thermal_changed: [CPU4,0,46.400002,0,-2147483648]
07-20 05:12:34.504 1577 1577 I thermal_changed: [CPU5,0,50.600002,0,-2147483648]
07-20 05:12:34.504 1577 1577 I thermal_changed: [CPU6,0,44.800003,0,-2147483648]
07-20 05:12:34.504 1577 1577 I thermal_changed: [CPU7,0,48.000004,0,-2147483648]
07-20 05:12:34.504 1577 1577 I thermal_changed: [GPU,1,40.900002,0,-2147483648]
07-20 05:12:34.504 1577 1577 I thermal_changed: [battery,2,31.900002,0,-2147483648]
07-20 05:12:34.504 1577 1577 I thermal_changed: [skin,3,35.260002,0,-2147483648]
07-20 05:12:34.505 1577 1577 I battery_status: [2,2,1,1,Li-ion]
07-20 05:12:34.505 1577 1577 I battery_level: [17,3815,319]
07-20 05:12:34.579 1577 1577 I am_uid_running: 10135
07-20 05:12:34.617 1577 1940 I commit_sys_config_file: [settings-0-0,7]
07-20 05:12:34.637 1577 1691 I am_proc_start: [0,2005,10135,com.android.systemui,service,{com.android.systemui/com.android.systemui.ImageWallpaper}]
07-20 05:12:34.639 1577 1620 I am_proc_bound: [0,2005,com.android.systemui]
07-20 05:12:34.644 1577 1620 I am_uid_active: 10135
07-20 05:12:34.648 1577 1944 I am_uid_running: 1037
07-20 05:12:34.672 1577 1954 I commit_sys_config_file: [net-policy,11]
07-20 05:12:34.713 1577 1691 I am_proc_start: [0,2039,1037,WebViewLoader-armeabi-v7a,NULL,]
07-20 05:12:34.753 1577 1577 I am_uid_running: 1073
07-20 05:12:34.754 1577 1691 I am_proc_start: [0,2053,1037,WebViewLoader-arm64-v8a,NULL,]
07-20 05:12:34.755 1577 2036 I am_proc_bound: [0,2039,WebViewLoader-armeabi-v7a]
07-20 05:12:34.756 1577 2036 I am_uid_active: 1037
07-20 05:12:34.778 1577 1691 I am_proc_start: [0,2086,1073,com.android.networkstack.process,service,{com.google.android.networkstack/com.android.server.NetworkStackService}]
07-20 05:12:34.785 1577 2036 I am_proc_bound: [0,2053,WebViewLoader-arm64-v8a]
07-20 05:12:34.804 1577 2036 I am_proc_bound: [0,2086,com.android.networkstack.process]
07-20 05:12:34.806 731 731 I auditd : type=1400 audit(0.0:169): avc: denied { read } for comm=“Loc_hal_worker” name=“u:object_r:vendor_pd_locater_dbg_prop:s0” dev=“tmpfs” ino=3384 scontext=u:r:hal_gnss_qti:s0 tcontext=u:object_r:vendor_pd_locater_dbg_prop:s0 tclass=file permissive=0
07-20 05:12:34.806 1577 2036 I am_uid_active: 1073
07-20 05:12:34.837 1577 1577 I am_wtf : [0,1577,system_server,-1,ActivityManager,Sending non-protected broadcast com.android.intent.START_SWITCH_USER from system 1577:system/1000 pkg android]
07-20 05:12:34.853 1577 1577 I am_uid_running: 1001
07-20 05:12:34.858 1577 1577 I am_uid_running: 10106
07-20 05:12:34.951 1577 1940 I commit_sys_config_file: [settings-0-0,10]
07-20 05:12:35.061 1577 1577 I wm_task_created: [1,0]
07-20 05:12:35.062 1577 1577 I wm_task_moved: [1,0,2147483647]
07-20 05:12:35.062 1577 1577 I am_create_task: [0,1]
07-20 05:12:35.062 1577 1577 I am_create_activity: [0,230018530,1,com.android.settings/.FallbackHome,android.intent.action.MAIN,NULL,NULL,276824320]
07-20 05:12:35.063 1577 1577 I wm_task_moved: [1,0,2147483647]
07-20 05:12:35.069 1577 1940 I commit_sys_config_file: [settings-2-0,57]
07-20 05:12:35.127 1577 1691 I am_proc_start: [0,2127,1001,.dataservices,added application,.dataservices]
07-20 05:12:35.131 1577 1577 I sysui_multi_action: [757,804,799,boot_system_server_ready,801,16263,802,1]
07-20 05:12:35.136 1577 2032 I am_proc_bound: [0,2127,.dataservices]
07-20 05:12:35.141 1577 2032 I am_uid_active: 1001
07-20 05:12:35.143 1577 2158 I am_proc_died: [0,2039,WebViewLoader-armeabi-v7a,-700,0]
07-20 05:12:35.145 1577 2158 I am_mem_factor: [3,0]
07-20 05:12:35.147 1577 2158 I am_low_memory: 9
07-20 05:12:35.163 1577 2157 I am_proc_died: [0,2053,WebViewLoader-arm64-v8a,-700,0]
07-20 05:12:35.163 1577 2157 I am_uid_stopped: 1037
07-20 05:12:35.164 1577 2157 I am_low_memory: 8
07-20 05:12:35.169 1577 1691 I am_proc_start: [0,2187,1001,.qtidataservices,added application,.qtidataservices]
07-20 05:12:35.176 1577 1577 I notification_cancel_all: [1000,1577,android,0,0,0,17,NULL]
07-20 05:12:35.209 1577 1691 I am_proc_start: [0,2204,1001,com.qualcomm.qti.telephonyservice,added application,com.qualcomm.qti.telephonyservice]
07-20 05:12:35.238 1577 1691 I am_proc_start: [0,2226,10106,com.qualcomm.qtil.aptxals,added application,com.qualcomm.qtil.aptxals]
07-20 05:12:35.247 1577 1620 I am_proc_bound: [0,2187,.qtidataservices]
07-20 05:12:35.261 1577 1620 I am_proc_bound: [0,2204,com.qualcomm.qti.telephonyservice]
07-20 05:12:35.271 1577 1691 I am_proc_start: [0,2249,1001,com.android.phone,added application,com.android.phone]
07-20 05:12:35.297 1577 2036 I am_proc_bound: [0,2226,com.qualcomm.qtil.aptxals]
07-20 05:12:35.301 1577 2036 I am_uid_active: 10106
07-20 05:12:35.307 1577 1691 I am_proc_start: [0,2274,1000,com.android.settings,activity,{com.android.settings/com.android.settings.FallbackHome}]
07-20 05:12:35.322 1577 2036 I am_proc_bound: [0,2249,com.android.phone]
07-20 05:12:35.354 1577 1663 I commit_sys_config_file: [notification-policy,15]
07-20 05:12:35.376 2274 2274 I service_manager_slow: [11,activity]
07-20 05:12:35.380 1577 2036 I am_proc_bound: [0,2274,com.android.settings]
07-20 05:12:35.390 1577 2036 I am_restart_activity: [0,230018530,1,com.android.settings/.FallbackHome]
07-20 05:12:35.391 1577 2036 I am_set_resumed_activity: [0,com.android.settings/.FallbackHome,minimalResumeActivityLocked]
07-20 05:12:35.478 1577 1940 I commit_sys_config_file: [settings-2-0,59]
07-20 05:12:35.512 1577 2036 I am_uid_running: 10120
07-20 05:12:35.546 1577 1691 I am_proc_start: [0,2373,10120,com.android.launcher3,service,{com.android.launcher3/com.android.quickstep.TouchInteractionService}]
07-20 05:12:35.606 1577 1577 I am_uid_running: 10061
07-20 05:12:35.641 1577 1621 I am_proc_bound: [0,2373,com.android.launcher3]
07-20 05:12:35.644 1577 1621 I am_uid_active: 10120
07-20 05:12:35.646 1577 1691 I am_proc_start: [0,2408,10061,com.google.android.ext.services,service,{com.google.android.ext.services/android.ext.services.watchdog.ExplicitHealthCheckServiceImpl}]
07-20 05:12:35.669 2274 2274 I am_on_create_called: [0,com.android.settings.FallbackHome,performCreate]
07-20 05:12:35.674 2274 2274 I am_on_start_called: [0,com.android.settings.FallbackHome,handleStartActivity]
07-20 05:12:35.675 2274 2274 I am_on_resume_called: [0,com.android.settings.FallbackHome,RESUME_ACTIVITY]
07-20 05:12:35.690 1577 2036 I am_proc_bound: [0,2408,com.google.android.ext.services]
07-20 05:12:35.696 2274 2274 I am_on_top_resumed_gained_called: [0,com.android.settings.FallbackHome,topStateChangedWhenResumed]
07-20 05:12:35.697 1577 2036 I am_uid_active: 10061
07-20 05:12:35.791 1577 2032 I am_uid_running: 10163
07-20 05:12:35.823 1577 1664 I boot_progress_enable_screen: 16955
07-20 05:12:35.824 1577 1664 I screen_toggled: 1
07-20 05:12:35.829 1577 1691 I am_proc_start: [0,2484,10163,com.google.android.inputmethod.latin,service,{com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME}]
07-20 05:12:35.864 1577 2157 I am_proc_bound: [0,2484,com.google.android.inputmethod.latin]
07-20 05:12:35.869 1577 2157 I am_uid_active: 10163
07-20 05:12:35.936 2249 2249 I auditd : type=1400 audit(0.0:170): avc: denied { read } for comm=“m.android.phone” name=“tp_info” dev=“proc” ino=4026532524 scontext=u:r

安卓10开机时间优化分析相关推荐

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

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

  2. android 性能优化---(2) MTK 平台开机时间优化

    一.在工程模式开启MTKLogger, 开机后取日志bootprof  adb pull /storage/emulated/0/mtklog/mobilelog/APLog_2018_0309_10 ...

  3. Android开机时间工具分析

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

  4. Android 系统性能优化(58)---开机时间优化

    优化启动时间 启动时间是系统性能的重要组成部分,因为用户必须等待启动完成后才能使用设备.对于较常进行冷启动的汽车等设备而言,较短的启动时间至关重要(没有人喜欢在等待几十秒后才能输入导航目的地). An ...

  5. 三星android版本能升级吗,三星安卓10升级时间 三星系统什么时候开始升级

    1.三星公布了"Android 10.0(Q OS)系统升级计划".该计划显示,新系统将搭载基于Android 10的One UI 2.0,不同的手机也将在相对应的时间进行升级. ...

  6. Android开机时间分析

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

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

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

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

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

  9. 安卓开机画面_iPad拜拜!虎贲芯片+安卓10全局手势触控,quot;国产之光quot;台电P20HD...

    近日,台电全新推出了平板电脑P20HD.这款平板电脑在拥有AI加速.立体声效.7小时续航.双频WiFi等一流配置的基础上,还搭载了国产芯片虎贲SC9863A.正式基于这些优点,台电P20HD受到了网友 ...

最新文章

  1. 查看mongodb数据路径_【数据库】mongodb数据库安装
  2. mysql 查询rowno_C# Mysql 查询 Rownum的解决方法
  3. 关于 early Z 与 z-prepass
  4. 列Readonly的问题
  5. 31省份开学时间一览表
  6. ssas对数据仓库_SSAS中的多对多关系简介
  7. vscode之npm不是内部活外部命令
  8. 经典代码d359f1d82912ef1b1cd784bd28829325
  9. 有线与无线网络配置相关工具
  10. java adt教程_用Eclipse安装ADT插件搭建Android环境(图文)
  11. 5种设计有效按钮的最佳做法
  12. linux 远程 mox,MOX 文件扩展名: 它是什么以及如何打开它?
  13. iwconfig 安装_iwconfig工具使用
  14. 计算机无法安装cad怎么办,电脑安装AutoCAD提示未正常卸载无法安装如何解决
  15. 姜小白的python日记Day4 列表和元组
  16. 邮件撤回怎么操作?个人邮箱Outlook登录入口在哪?
  17. matlab 更换坐标轴_科学网—【Matlab】坐标轴的设置 - 叶瑞杰的博文
  18. 使用Linux Deploy在android手机上部署Ubuntu
  19. centos路由查看命令_centos查看ip
  20. 红队笔记之go语言远控初探

热门文章

  1. 代码从svn到工作空间,Myeclipse中java项目转成Web项目
  2. 【深入vue3+Typescript技术栈】2021 coderwhy大神新课高清百度网盘持续更新 王红元老师 腾讯课堂
  3. 2020-12-20|西瓜更新Cookies ttwid获取方法
  4. Linuxer公众号更名为quot;Linux阅码场quot;公告
  5. 好的设计的10个原则
  6. 六年级下学期计算机课教学进度,六年级下册信息技术教学计划
  7. 电脑屏幕下方任务栏不显示了怎么处理 ?
  8. Excel应用-使用VBA自动绘制所有适用类型的Excel图表(代码及效果图)
  9. 永恒之蓝(MS17-010)漏洞复现及msf常用渗透命令
  10. xbox控制台小助手服务器连接已阻止,win10系统xbox控制台小帮手无法登录,提示目前您无法登录怎么办...