衡量Android应用启动时间

fhu*_*cho 24 android

测量Android应用启动时间的最精确方法是什么?

启动时间我的意思是2和3之间的差异:

  1. 应用程序进程未运行
  2. 用户点击启动器中的应用图标
  3. 主要活动已完全初始化

因此,我基本上需要以某种方式从JVM启动并记录它以后的时间.

Ben*_*son 9

我将把你的问题解释为'我的应用启动时间是否足够快.我如何检查我做了我能做的一切?

启动时间在很大程度上是错误的指标,因为它会因设备和ROM而异.我猜你最感兴趣的是你的代码需要花费很长时间才能执行,以及什么可能会阻塞主线程.

我发现最有效的方法是在应用程序启动时使用Traceview,然后查看执行方法所需的时间以及主线程是否存在任何间隙.

开始跟踪:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Debug.startMethodTracing("startup");
    }
}
Run Code Online (Sandbox Code Playgroud)

停止追踪:

@Override
public void onViewCreated(final View view, final Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Debug.stopMethodTracing();
}
Run Code Online (Sandbox Code Playgroud)

收集跟踪后,您应该能够看到对启动时间有重大影响的任何内容.在我的情况下,如下所示,UI线程中存在一个很大的差距,即被阻止.

主线被阻止了

结果发现,Crashlytics和Coremetrics都要求调用randomUUID(),然后跨线程同步并阻塞主线程.解决方案只是启动一个新线程来初始化Coremetrics代码.

这是我不会仅仅通过测量启动时间来获取的东西,但它实际上加快了应用程序的"启动时间"几百毫秒.

在为Coremetrics初始化分离一个单独的线程后,这是另一个快照:

主线程未被阻止


use*_*215 9

我知道我来不及回答,尽管如此,这恰好回答了这个问题.

对于API版本19或更高版本,此信息默认记录在Logcat上.

从Android 4.4(API级别19)开始,logcat包含一个包含名为Displayed的值的输出行.此值表示启动过程和完成在屏幕上绘制相应活动之间所经过的时间量.

ActivityManager:显示com.android.myexample/.StartupTiming:+ 3s534ms

关键是在正确的地方寻找它 -

如果您正在从命令行或终端中跟踪logcat输出,则查找已用时间非常简单.要在Android Studio中查找已用时间,必须在logcat视图中禁用过滤器.禁用过滤器是必要的,因为系统服务器而不是应用程序本身为此日志提供服务.

摘录来自文档.

  • 这如何使您以编程方式报告启动时间? (2认同)

小智 6

以下面的方式检查adb shell.

adb shell
adb logcat -b events | grep am_activity_launch_time

[Output]
01-01 12:32:53.469 1236 1262 I am_activity_launch_time: 
    [0,205360373,com.sec.android.app.clockpackage/.ClockPackage,378,**378**,0]

Remarks:
Launch time for Clock is 378ms.
Run Code Online (Sandbox Code Playgroud)

  • 在较新的设备上,ActivityManager以不同的方式记录它,因此请使用:"adb logcat -s ActivityManager:I | grep Displayed".结果将类似于"I/ActivityManager(288):显示的com.foo.bar/.main.MainActivity:+ 1s313ms". (2认同)

小智 5

将整个onCreate()方法包装在一个TimingLogger. 把这个放在开头:

TimingLogger timings = new TimingLogger(TAG, "methodA");
Run Code Online (Sandbox Code Playgroud)

最后是:

timings.dumpToLog();
Run Code Online (Sandbox Code Playgroud)

如果您想在某个中间步骤减少时间,您可以timings.addSplit("name");获取到达该步骤所需的时间。