app应用启动时间检测

作者: 望月成三人 | 来源:发表于2016-06-14 15:48 被阅读1975次

    启动时间的测试方法

    • adb shell am start -W packagename/activity
    • ddms adb logcat监控

    ddms adb logcat

    • 创建过滤条件如下:
      • Fliter Name:Display
      • By Log Tag:ActivityManager
    Paste_Image.png
    • 启动应用,查看DDMS打印的Display消息,根据应用名称记录启动时间数据。计算从点击应用到应用显示主页的的时间差。如下图所示,红线对应的时间即为该次启动时间。(有些应用启动会经历2个阶段,如连接服务器和进入主页,启动时间为累加2个display打印的时间值)
      Log信息样例如截图:
    Paste_Image.png

    应用启动场景分析

    应用第一次启动-冷启动

    • 也就是我们常说的冷启动,这时候你的应用程序的进程是没有创建的. 这也是大部分应用的使用场景.用户在桌面上点击你应用的 icon 之后,首先要创建进程,然后才启动 MainActivity.
    • 这时候adb shell am start -W packagename/MainActivity 返回的结果,就是标准的应用程序的启动时间(注意 Android 5.0 之前的手机是没有 WaitTime 这个值的):
    adb shell am start -W com.media.painter/com.media.painter.PainterMainActivity
    Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.media.painter/.PainterMainActivity }
    Status: ok
    Activity: com.media.painter/.PainterMainActivity
    ThisTime: 355
    TotalTime: 355
    WaitTime: 365
    Complete
    
    • 如果只关心某个应用自身启动耗时,参考TotalTime;
    • 如果关心系统启动应用耗时,参考WaitTime;
    • 如果关心应用有界面Activity启动耗时,参考ThisTime。

    应用非第一次启动-热启动

    • 如果是你按Back键,并没有将应用进程杀掉的话,那么执行上述命令就会快一些,因为不用创建进程了,只需要启动一个Activity即可。这也就是我们说的应用热启动。

    参考更详细的资料

    相关文章

      网友评论

      • 张长长啊:这个是要root吗,为什么有的app打不开
        Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]
        cmp=com.dianping.v1/.activity.MainActivity }
        Error type 3
        Error: Activity class {com.dianping.v1/com.dianping.v1.activity.MainActivity} does not ex
        ist.
      • c013c7ed7e21:D:\sdk\platform-tools>adb shell am start -W com.kanguo.hdb/ com.kanguo.hdb.activ
        ity.MainActivity
        运行之后弹出了提示”选择要使用的应用“,正常吗?还是说哪个地方需要改(如下图)


        选择要使用的应用:
        --------------------------
        360助手
        百度地图
        超级相册
        ***********
        **********
        -------------------
        始终 | 仅此一次
      • fadc8bbc797d:|shell@htc_a52dtul:/ $ am start -W com.fengger/com.fengger.activity.MainActivit
        y
        m start -W com.fengger/com.fengger.activity.MainActivity <
        Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.L
        AUNCHER] cmp=com.fengger/.activity.MainActivity }
        java.lang.SecurityException: Permission Denial: starting Intent { act=android.in
        tent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.f
        engger/.activity.MainActivity } from null (pid=321, uid=2000) not exported from
        uid 10231
        at android.os.Parcel.readException(Parcel.java:1549)
        at android.os.Parcel.readException(Parcel.java:1502)
        at android.app.ActivityManagerProxy.startActivityAndWait(ActivityManager
        Native.java:2568)
        at com.android.commands.am.Am.runStart(Am.java:736)
        at com.android.commands.am.Am.onRun(Am.java:304)
        at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
        at com.android.commands.am.Am.main(Am.java:99)
        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:288)
      • fadc8bbc797d:shell@HWTAG-L6753:/ $ am start -W com.fengger/.activity.MainActivity
        am start -W com.fengger/.activity.MainActivity
        Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.
        AUNCHER] cmp=com.fengger/.activity.MainActivity }
        java.lang.SecurityException: Permission Denial: starting Intent { act=android.i
        tent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.
        engger/.activity.MainActivity } from null (pid=11208, uid=2000) not exported fr
        m uid 10271
        at android.os.Parcel.readException(Parcel.java:1546)
        at android.os.Parcel.readException(Parcel.java:1499)
        at android.app.ActivityManagerProxy.startActivityAndWait(ActivityManage
        Native.java:2632)
        at com.android.commands.am.Am.runStart(Am.java:762)
        at com.android.commands.am.Am.onRun(Am.java:305)
        at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
        at com.android.commands.am.Am.main(Am.java:97)
        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:250)
        1|shell@HWTAG-L6753:/ $
        fadc8bbc797d:@望月成三人 还是不行
        望月成三人:@cqschen
        am start -W com.fengger/ com.fengger.activity.MainActivity
      • fadc8bbc797d:那个main activity 是指的app 的首页还是那个splash activity 或是那个welcome activity?
        望月成三人:@cqschen activity请填绝对地址
      • fadc8bbc797d:我的也遇到了 ,怎么解决 :
        java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getType()' on a null object reference
        at com.android.commands.am.Am.runStart(Am.java:810)
        at com.android.commands.am.Am.onRun(Am.java:359)
        at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
        at com.android.commands.am.Am.main(Am.java:100)
        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:251)
        望月成三人:@cqschen w是大写
      • 景阳_jy:输入上述命令抛异常,错误如下:

        java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getType()' on a null object reference
        at com.android.commands.am.Am.runStart(Am.java:810)
        at com.android.commands.am.Am.onRun(Am.java:359)
        at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
        at com.android.commands.am.Am.main(Am.java:100)
        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:251)
        望月成三人:@faith_niuniu w改成大写

      本文标题:app应用启动时间检测

      本文链接:https://www.haomeiwen.com/subject/kcjudttx.html