安卓10开机时间优化分析

2023-11-20

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

  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 scanning
    int 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 packages
            continue;
        }
       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 apps
                    if ((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);
        else
            scanTask.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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓10开机时间优化分析 的相关文章

随机推荐

  • draw.io---一款免费、开源的流程图绘制工具

    draw io 是一款非常强大实用的免费 开源流程图绘制工具 功能众多 例如通过流程图来可视化您的工作流程 创建组织结构图来来显示人员结构 创建网络图来可视化网络等等 适用于商务 工程 电气 网络设计 软件设计等诸多领域 同时还内置了相当丰
  • ddos攻击怎么防?防御ddos的几种方法

    现在的互联网行业大多数企业基本上都依靠网络来获取流量和订单或者服务 但是却对网络的利弊知之甚少 特别是网站的较大威胁DDOS攻击 很多互联网企业基本都遭遇过DDOS攻击的勒索和恶性竞争 大部分企业网站一旦被DDOS攻击就立马挂了 从而影响了
  • Linux下printk输出

    由于Linux内核的级别控制 导致printk打印的内容不一定都能从控制台正常输出 可以使用dmesg命令来输出所有级别的信息 输入 sudo dmesg n 8 可以把所有日志信息输出来 Linux命令 dmesg 功能说明 显示开机信息
  • Tips系列之飞书日历

    最近收到很多小伙伴的问题 咨询飞书日历如何使用 今天就给大家呈上几个小Tips 让你更全面的了解飞书日历 免费使用 飞书官网 1 订阅日历 你可以订阅同事的日历 查看对方的忙闲状态 省去反复沟通的麻烦 快速找到空闲时间并邀约会议 如何订阅日
  • 卷积神经网络之-VGGNet

    更多内容请关注 机器视觉 CV 公众号 原文地址 VGGNet 是由牛津大学视觉几何小组 Visual Geometry Group VGG 提出的一种深层卷积网络结构 他们以7 32 的错误率赢得了2014年ILSVRC分类任务的亚军 冠
  • Alpha多样性之箱线图绘制

    Alpha多样性 通常用Richness Chao1 Shannon Simpson Dominance和Equitability等指数来评估样本的物种多样性 所以这个节学习主要分两个部分 1 计算 生物多样性指数 软件 R软件中vegan
  • 副业是刚需?分享几个程序员接外包私活的网站

    经常看到某某程序员接了个项目开发 工作之余轻轻松松赚了钱还顺带提升了技术 或者看到某大佬又发表了一篇程序员技术提升稿件 阅读点赞收藏三连发 这个月的零花钱又不愁了 但自己只是一名普普通通的程序员 能找到这样的副业吗 这些项目又在哪里接的呢
  • 网站为什么建议用https协议

    HTTPS 全称 Hyper Text Transfer Protocol over SecureSocket Layer 是以安全为目标的 HTTP 通道 在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 HTTPS 在HT
  • STM32f103增加ESP8266模块,通过Wifi用手机TCP服务端远程与STM32通信

    STM32f103增加ESP8266模块 通过Wifi用手机TCP服务端远程与STM32通信 提示 esp8266开启透传模式 连上路由器Wifi 电脑热点 接入STM32串口引脚 另外手机TCP服务端是手机IP地址 串口号 大于8000滴
  • 仅需三步就可以把代码块完美插入到word中

    还在为在word中呈现代码而烦恼吗 如何在word中插入c 代码 如何在word中插入代码块 如何在word中完美的呈现代码 如何在word中对代码进行排版 来开始表演了 1 打开网站 http word wd1x com 支持c c ja
  • keil提示找不到芯片库

    keil提示找不到芯片库 有几种可能 一种是没安装芯片软件包 下载相应芯片包即可 还有一种可能是工程本身是用keil4创建的 而你用的是keil5打开的 此种情况将后缀名uvproj改成uvprojx即可 图1
  • java获取method_从Method中获取完整类名和方法名

    需求假设 假设在包com zhoutao controller下有方法getKey 方法 在JavaEE中 通过AOP获得该方法的的对象method 现在通过该对象的getName方法 仅仅只能获得getKey的结果 现在我需要的是com
  • 性别年龄识别器

    心情 最近比较郁闷 自己的小论文已经投了快8个月了 从去年的AAAI CVPR 到现在在审的TCSVT AAAI由于页数超限被拒 CVPR因为一个正面和2个负面评价被拒 TCSVT还前途未卜 真的很郁闷 心情不好 论文也不太想看 撸撸代码放
  • Idea快速开发SpringBoot项目的方法

    一 常用插件 1 Free Mybatis plugins 针对Mybatis框架提供的插件 自动完成Mapper接口和Mapper xml之间的跳转 2 RestfulTool 自动显示工程中的所有URL接口 进行测试 并且提供检索功能
  • Elasticsearch(十三) ElasticSearch搜索附近的人

    需求 通过指定点搜索附近的人 要求可以过滤年龄 结果按照距离进行排序 并且展示她 他距离你多远 本文参考 es官网文档 https www elastic co guide cn elasticsearch guide current so
  • 面试题:StringBuilder 和 StringBuffer 区别(通俗易懂易背)

    StringBuffer是同步的 线程安全 StringBuilder不是 什么时候用哪一个 StringBuilder 当您需要一个可以修改的字符串 并且只有一个线程正在访问和修改它时 StringBuffer 当你需要一个可以修改的字符
  • sql: Compare Tables

    使用 UNION INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式 select from BookInfoList 存在不同的 select BookInfoID BookInfoBarCod
  • VMware安装OpenEuler

    VMware安装OpenEuler 需要考虑的因素 安装系统的用途 桌面开发 服务器 Linux学习使用 磁盘分区规划 最小120G 划分 boot swap 根分区等 网络 是否对外提供服务 NAT模式 桥接模式 仅主机模式 1 下载镜像
  • 前端大屏常用的适配方案

    假设我们正在开发一个可视化拖拽的搭建平台 可以拖拽生成工作台或可视化大屏 或者直接就是开发一个大屏 首先必须要考虑的一个问题就是页面如何适应屏幕 因为我们在搭建或开发时一般都会基于一个固定的宽高 但是实际的屏幕可能大小不一 接下来我们就尝试
  • 安卓10开机时间优化分析

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