Android 从log中学习设备启动过程及代码执行流程

这段时间分析设备概率异常启动慢问题,特此记录。

补充log区分:

一般log里面有sys log、main log、events log、crash log、Rlog,而这些log是怎么实现这些区分?

sys log ---> android.util.Slog (hide类)

main log --> android.util.Log (常用的方式)

events log --> android.util.EventLog

crash log --> com.internal.os.RuntimeInit

radio log-->android.telephony.Rlog(hide类)

(特别注意:内部类LoggingHandler对Clog_e的调用)

进一步了解:

android.util.Log中有如下ID,这也就标明了log的类型:

/** @hide */ public static final int LOG_ID_MAIN = 0;//-- main log

    /** @hide */ public static final int LOG_ID_RADIO = 1;//-- radio log

    /** @hide */ public static final int LOG_ID_EVENTS = 2;//-- events log

    /** @hide */ public static final int LOG_ID_SYSTEM = 3;// -- sys log

    /** @hide */ public static final int LOG_ID_CRASH = 4;//--crash log

其实源头的调用就是:

/** @hide */ public static native int println_native(int bufID,

            int priority, String tag, String msg);

bufID--就是传入上面的ID值

快速解析adb抓log的方式:

adb logcat 默认是main的,所以要抓取log应该如下操作:

adb logcat -b main -b system -b radio -b events -v time



从log中了解开机时间

从events的log中了解开机启动时间:

图片发自简书App

解析注意点:

为什么boot_progress_start -->boot_progress_preload_start时间这么长?

关键字:"dex2oat"  "dex2oat : dex2oat took"

通过看main log如下:

03-06 10:42:58.283609  479  479 I zygote64: GenerateImage: /system/bin/dex2oat --image=/data/dalvik-cache/arm64/system@framework@boot.art --dex-file=/system/framework/core-oj.jar --dex-file=/system/framework/core-libart.jar --dex-file=/system/framework/conscrypt.jar --dex-file=/system/framework/okhttp.jar --dex-file=/system/framework/bouncycastle.jar --dex-file=/system/framework/apache-xml.jar --dex-file=/system/framework/ext.jar --dex-file=/system/framework/framework.jar --dex-file=/system/framework/telephony-common.jar --dex-file=/system/framework/voip-common.jar --dex-file=/system/framework/ims-common.jar --dex-file=/system/framework/android.hidl.base-V1.0-java.jar --dex-file=/system/framework/android.hidl.manager-V1.0-java.jar --dex-file=/system/framework/framework-oahl-backward-compatibility.jar --dex-file=/system/framework/android.test.base.jar --dex-file=/system/framework/mediatek-common.jar --dex-file=/system/framework/mediatek-framework.jar --dex-file=/system/framework/mediatek-telephony-common.jar --dex-file=/system/framework/mediatek-teleph

03-06 10:43:55.453963  672  672 I dex2oat : dex2oat took 56.741s (81.581s cpu) (threads: 4) arena alloc=16MB (17795744B) java alloc=5MB (6045464B) native alloc=66MB (70099304B) free=17MB (17981080B)

为什么boot_progress_pms_ready -->boot_progress_ams_ready 时间这么长?

关键字:SystemServerTiming 涉及内容在:sys_log

1,826: 03-06 10:44:26.582524  1005  1005 D SystemServerTiming: StartPackageManagerService took to complete: 3768ms

2,172: 03-06 10:45:02.356858  1005  1005 D SystemServerTiming: UpdatePackagesIfNeeded took to complete: 33570ms

补充说明:

1.android.server.SystemServer中对具体方法执行时间有跟踪

图片发自简书App


2.使用的是隐藏类

android.util.TimingsTraceLog

进一步解析:

这些信息也可以通过代码获取意义

boot_progress_start

系统进入用户空间,标志着kernel启动完成,本例中可以看出kernel启动耗时30s左右

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

开机动画结束,这一步用户能直观感受到开机结束

。可以用此来衡量是否开机完成--7.0以上出现

注意java层使用的是EventLog.java

EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,

参考学习:

http://www.mamicode.com/info-detail-1789654.html

https://blog.51cto.com/ticktick/1660996

https://blog.csdn.net/zhangbijun1230/article/details/80562616

https://blog.csdn.net/poolwater/article/details/51839402

https://blog.csdn.net/a04081122/article/details/52314709


从log中学习代码执行流程:

E SystemServiceRegistry: No service published for: dropbox

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry: android.os.ServiceManager$ServiceNotFoundException: No service published for: dropbox

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.os.ServiceManager.getServiceOrThrow(ServiceManager.java:143)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.app.SystemServiceRegistry$19.createService(SystemServiceRegistry.java:355)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.app.SystemServiceRegistry$19.createService(SystemServiceRegistry.java:352)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.app.SystemServiceRegistry$CachedServiceFetcher.getService(SystemServiceRegistry.java:1137)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.app.SystemServiceRegistry.getSystemService(SystemServiceRegistry.java:1053)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.app.ContextImpl.getSystemService(ContextImpl.java:1726)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at com.android.server.am.ActivityManagerService.logStrictModeViolationToDropBox(ActivityManagerService.java:15884)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at com.android.server.am.ActivityManagerService.handleApplicationStrictModeViolation(ActivityManagerService.java:15843)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.os.StrictMode.handleApplicationStrictModeViolation(StrictMode.java:1772)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.os.StrictMode.access$1400(StrictMode.java:141)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.os.StrictMode$AndroidBlockGuardPolicy.onThreadPolicyViolation(StrictMode.java:1702)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.os.StrictMode$AndroidBlockGuardPolicy.lambda$handleViolationWithTimingAttempt$0(StrictMode.java:1621)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.os.-$$Lambda$StrictMode$AndroidBlockGuardPolicy$9nBulCQKaMajrWr41SB7f7YRT1I.run(Unknown Source:6)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.os.Handler.handleCallback(Handler.java:873)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.os.Handler.dispatchMessage(Handler.java:99)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.os.Looper.loop(Looper.java:193)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at android.os.HandlerThread.run(HandlerThread.java:65)

03-01 10:00:48.942572  973  1039 E SystemServiceRegistry:  at com.android.server.ServiceThread.run(ServiceThread.java:44)

展示常规Context调用服务的流程--MTK 9.0系统

展示mContext.getSystemService(Context.DROPBOX_SERVICE)调用服务的流程:

一、

DropBoxManager dbox = (DropBoxManager)        mContext.getSystemService(Context.DROPBOX_SERVICE);

二、

android.app.ContextImpl.getSystemService(ContextImpl.java:1726)

三、

android.app.SystemServiceRegistry.getSystemService(SystemServiceRegistry.java:1053)

注:

这里面有一抽象类,运行的非常漂亮

public static abstract class CachedServiceFetcher<T> implements ServiceFetcher<T> {

}

四、

android.app.SystemServiceRegistry$CachedServiceFetcher.getService(SystemServiceRegistry.java:1137)

五、

android.app.SystemServiceRegistry$19.createService(SystemServiceRegistry.java:352)

六、

android.os.ServiceManager.getServiceOrThrow(ServiceManager.java:143)

Tips:

想了解某一个方法是怎么调用的,可以通过:

丢throw 异常来处理。

public static IBinder getServiceOrThrow(String name) throws ServiceNotFoundException {

        final IBinder binder = getService(name);

        if (binder != null) {

            return binder;

        } else {

            throw new ServiceNotFoundException(name);

        }

    }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容