zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    108. Convert Sorted Array to Binary Search Tree
    How to check if one path is a child of another path?
    Why there is two completely different version of Reverse for List and IEnumerable?
    在Jenkins中集成Sonarqube
    如何查看sonarqube的版本 how to check the version of sonarqube
    Queue
    BFS广度优先 vs DFS深度优先 for Binary Tree
    Depth-first search and Breadth-first search 深度优先搜索和广度优先搜索
    102. Binary Tree Level Order Traversal 广度优先遍历
    How do I check if a type is a subtype OR the type of an object?
  • 原文地址:https://www.cnblogs.com/deman/p/7711959.html
Copyright © 2011-2022 走看看