测量Android应用程序启动时间
衡量Android应用程序启动时间最精确的方法是什么测量Android应用程序启动时间,android,Android,衡量Android应用程序启动时间最精确的方法是什么 我所说的启动时间是指2之间的差异。和3.: 应用程序进程未运行 用户单击启动器中的应用程序图标 主活动已完全初始化 因此,我基本上需要以某种方式获得JVM启动后经过的时间并记录下来。一种可能是在onCreate()方法开始时和onCreate()方法结束时节省时间,然后将这些时间相互减去,以获得初始化应用程序所需的时间 将整个onCreate()方法包装在计时记录器中。请把这句话放在开头: TimingLogger timings = new
我所说的启动时间是指2之间的差异。和3.:
因此,我基本上需要以某种方式获得JVM启动后经过的时间并记录下来。一种可能是在
onCreate()
方法开始时和onCreate()方法结束时节省时间,然后将这些时间相互减去,以获得初始化应用程序所需的时间 将整个onCreate()
方法包装在计时记录器中。请把这句话放在开头:
TimingLogger timings = new TimingLogger(TAG, "methodA");
最后:
timings.dumpToLog();
如果您想在某个中间步骤中删除时间,可以执行timings.addSplit(“name”)代码>以获取进入该步骤所需的时间。我将您的问题解释为“我的应用程序启动时间是否足够快?”。我怎样才能确认我已经做了我能做的一切?”
启动时间在很大程度上是一个错误的指标,因为它会因设备和ROM而异。我猜您最感兴趣的是,有多少代码需要很长时间才能执行,以及什么可能会阻塞主线程
我发现最有效的方法是在应用程序启动时使用,然后检查方法执行所需的时间,以及主线程上是否有任何间隙
开始跟踪:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Debug.startMethodTracing("startup");
}
}
停止跟踪:
@Override
public void onViewCreated(final View view, final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Debug.stopMethodTracing();
}
一旦收集到跟踪,您应该能够看到对启动时间有重大影响的任何内容。在我的例子中,如下图所示,在被阻止的UI线程上有一个很大的缺口
结果显示Crashlytics和Coremetrics都需要调用randomUUID()
,然后跨线程同步并阻塞主线程。解决方案只是启动一个新线程来初始化Coremetrics代码
这是我不可能仅仅通过测量启动时间就发现的,但它实际上将应用程序的“启动时间”加快了几百毫秒
在为Coremetrics初始化分离出一个单独的线程之后,这里是另一个快照:
可以使用下一个代码执行时间跟踪:
覆盖您的应用程序
:
public class CustomApplication extends Application {
public final static long APP_START_TIME = System.currentTimeMillis();
/**
* Do all other application stuff
*/
}
并在主活动中添加几行:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View contentView = findViewById(android.R.id.content);
contentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT >= 16) {
contentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
contentView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
long launchTime = System.currentTimeMillis() - CustomApplication.APP_START_TIME;
Log.e("TEST", "App launch time = " + launchTime);
}
});
}
}
不要忘记在清单中定义自定义应用程序:
<application
android:label="@string/app_name"
android:name=".CustomApplication" >
</application>
重要信息:您必须在启动应用程序之前终止应用程序,因为应用程序存储跟踪初始时间的静态变量。按以下方式检入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.
使用
此外,Trace类还可以用于使用
Trace.beginSection("name");
Trace.endSection();
这也是一个快速入门。我知道我来不及回答,尽管如此,这恰恰回答了这个问题
默认情况下,API版本19或更高版本会将此信息记录在Logcat上
从Android 4.4(API级别19)开始,logcat包含一个输出行,其中包含一个名为Displayed的值。此值表示启动流程和在屏幕上完成绘制相应活动之间经过的时间量
ActivityManager:Displayed com.android.myexample/.StartupTiming:+3s534ms
关键是要在正确的地方找到它-
如果您正在从命令行或终端跟踪logcat输出,那么查找经过的时间很简单。要在Android Studio中查找经过的时间,必须在logcat视图中禁用过滤器。禁用过滤器是必要的,因为服务此日志的是系统服务器,而不是应用程序本身
摘录来自。我认为这已经内置到Firebase控制台中,现在性能良好
在android中显示启动时间的简单方法
有时,logcat输出中显示的行包含一个额外的总时间字段。例如:
ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms (total +1m22s643ms)
在这种情况下,第一次测量仅适用于第一次绘制的活动
来源:“我指的是启动时间2和3之间的差异。”即1。或者可能是-1.:-)更严重的是,您是在构建自己的固件,还是在尝试从库存环境中获取固件?另外,这是一个开发时间问题,还是一个生产运行时查询?我希望它能够在开发过程中跟踪不同设备和Android版本上的启动时间。另一个原因是,一些用户抱怨自上次更新以来,应用程序启动速度变慢,所以如果能看到数字就好了。当然,我只能简单地测量调用onCreate()以来的时间。。。但是知道真正的启动时间感觉更好:)这也让我可以说“这只会让启动时间慢5%”,所以这没什么大不了的。我不知道TimingLogger,谢谢你的提示。但是,这并不能测量用户启动应用程序到调用onCreate()之间的时间。不幸的是,这并不能测量用户启动应用程序到调用onCreate()之间的时间。在较新的设备上,ActivityManager的日志记录方式略有不同,因此请使用以下方法:“adb logcat-s ActivityManager:I|grep Displayed”结果类似于“I/ActivityManager(288):Displayed com.foo.bar/.main.main活动:+1s313ms”。这如何使您能够以编程方式报告启动时间?不适用于API 22(5.1.1),至少对于三星SM-G800FDo,您知道如何在另一个线程中而不是在主线程中初始化第三方库以减少应用程序启动时间吗?从冷启动到另一个应用程序的启动时间是否有任何影响。在onGlobalLayout
上报告实际上是正确的措施。感谢分享。您有什么想法吗第三方图书馆如何运作