• android 统计启动时长,标准


    一.启动的类型

    冷启 动,application没有被创建,需要先创建进程,然后启动MainActivity。由于这个过程需要fork一个新进程,所以耗时。

    热启动,同上面对照,已经启动过application,并驻留在系统内存内,只是需要唤醒该进程,并启动MainActivity。

    二:统计启动时间

    1.物理统计

    通过高速相机,从点击launcher上面的图标开始,到MainActivity的第一个可见帧,算作启动时间。

    2.adb 统计

    adb shell am start -w pageage/activityname  通过这条命令启动,可以获得启动时间。

    $ adb shell am start -W com.abc.test/com.abc.test.MainActivity
    Starting: Intent { act=android.intent.action.MAIN cat=
    Status: ok
    Activity: com.speed.test/.HomeActivity
    ThisTime: 496
    TotalTime: 496
    WaitTime: 503
    Complete

    3.线上版本统计

    如果是在线上版本,无法使用命令统计,我们分析下,所谓冷启动,就是创建applicaiton开始,一直到MainActivity第一个可视画面。

    applicaiton 创建,可以从attachBaseContext()开始,得到startTime。MainActivity的第一个可视画面,onResume其实还没有看到画面,最合适的回调是onWindowFocusChanged,也就是获得焦点。

    但是这个回调需要做适当的过滤,就能获得endTime。

    所以冷启动就是两个时间差。热启动的startTime 就是MainActivity的onRestart。

    如果获取onWindowFocusChanged 的时间,需要结合MainActivity的整个生命周期。

    这里有2个关键点,activity的启动流程 & applicaiton到activity的生命周期。

    activity启动流程:

    从launcher点击应用图标,launcher调用startactivity,

    通过binder机制可以理解,所有的服务最终都会通过AMS。

    AMS首先会通过zygote fork出进程。进程启动后准备好looper & 消息队列。然后调用 attach 方法将应用进程绑定到 ActivityManagerService,然后进入 loop 循环,不断地读取消息队列里的消息,并分发消息。

    AMS保存进程的代理对象,然后AMS通过该进程,创建activity的实例& 执行各生命周期。

    所以整个冷启动的流程如下:

    -> Application 构造函数
    -> Application.attachBaseContext()
    -> Application.onCreate()
    -> Activity 构造函数
    -> Activity.setTheme()
    -> Activity.onCreate()
    -> Activity.onStart
    -> Activity.onResume
    -> Activity.onAttachedToWindow
    -> Activity.onWindowFocusChanged
  • 相关阅读:
    React性能优化记录(不定期更新)
    JSX设置CSS样式详解
    org.tinygroup.htmlparser-Html解析器
    org.tinygroup.application-应用启动框架
    org.tinygroup.beancontainer-IOC、AOP框架
    org.tinygroup.vfs-虚拟文件系统
    org.tinygroup.templateengine-模板引擎
    org.tinygroup.dbfilter
    org.tinygroup.templateweb-模板文件处理器
    org.tinygroup.flow-流程引擎
  • 原文地址:https://www.cnblogs.com/deman/p/7711959.html
Copyright © 2020-2023  润新知