Android - 记录启动延迟的问题
Android - Problems with logging the start up latency
我正在尝试记录我的应用程序的启动延迟。我这样做的方式是在 Application.onCreate
上设置应用程序的开始时间,并提供 returns 时间的 public 方法。
MyApplication extends Application {
Date startUpTime;
//Declare variables
@Override
public void onCreate() {
super.onCreate();
setStartupTime();
//other initializations
}
private void setStartUpTime() {
startUpTime = new Date();
}
public Date getStartUpTime() {
return startUpTime;
}
}
MyActivity extends Activity {
.
.
.
@Override
public void onStart(){
logStartUpLatency();
//other onStart stuff
}
private void logStartUpLatency() {
Date currentTime = new Date();
Date startTime = (MyApplication)getApplicationContext().getStartUpTime();
long latency = currentTime.getTime() - startTIme.getTime();
Log.d("Start up Latency is ", Long.toString(latency)):
}
这就是我测试启动延迟的方式:
- adb 安装 myapk
- 运行 应用获得首次启动延迟。我可以看到记录的延迟对于第一次启动是正确的
- 运行 应用程序再次测试启动延迟。记录的延迟对于启动(或任意数量的后续启动)是正确的
- 现在我将应用程序的版本代码和名称增加 1。为了模拟升级,我使用了命令 adb install -r myapk。
- 现在我再次 运行 应用程序来测试升级后的首次启动延迟,即使需要 3 秒,记录的延迟也超出了图表。
有人知道为什么会发生这种情况吗?
更新
因此,如果我使用 "adb install -r myapk" 安装 apk,应用程序不会通过 Myapplication.onCreate()
。
您计算的延迟时间以毫秒为单位。 Date#getTime() returns 自格林威治标准时间 1970 年 1 月 1 日午夜以来的 毫秒 数。
观察到的 3 秒时间是因为卸载旧应用程序构建和安装新应用程序构建的开销。
我建议使用TimingLogger
class。根据文档,您可以轻松跟踪经过的时间,甚至可以在过程中添加拆分。
这个
TimingLogger timings = new TimingLogger(TAG, "methodA");
// ... do some work A ...
timings.addSplit("work A");
// ... do some work B ...
timings.addSplit("work B");
// ... do some work C ...
timings.addSplit("work C");
timings.dumpToLog();
产生
D/TAG (3459): methodA: begin
D/TAG (3459): methodA: 9 ms, work A
D/TAG (3459): methodA: 1 ms, work B
D/TAG (3459): methodA: 6 ms, work C
D/TAG (3459): methodA: end, 16 ms
因此,如果我使用 "adb install -r myapk" 安装 apk,应用程序不会通过 Myapplication.onCreate()。所以这回答了这个问题。我会问一个单独的问题,为什么使用 "adb install -r myapk" 安装应用程序然后启动 myapk 不会通过 MyApplication.onCreate()
我正在尝试记录我的应用程序的启动延迟。我这样做的方式是在 Application.onCreate
上设置应用程序的开始时间,并提供 returns 时间的 public 方法。
MyApplication extends Application {
Date startUpTime;
//Declare variables
@Override
public void onCreate() {
super.onCreate();
setStartupTime();
//other initializations
}
private void setStartUpTime() {
startUpTime = new Date();
}
public Date getStartUpTime() {
return startUpTime;
}
}
MyActivity extends Activity {
.
.
.
@Override
public void onStart(){
logStartUpLatency();
//other onStart stuff
}
private void logStartUpLatency() {
Date currentTime = new Date();
Date startTime = (MyApplication)getApplicationContext().getStartUpTime();
long latency = currentTime.getTime() - startTIme.getTime();
Log.d("Start up Latency is ", Long.toString(latency)):
}
这就是我测试启动延迟的方式:
- adb 安装 myapk
- 运行 应用获得首次启动延迟。我可以看到记录的延迟对于第一次启动是正确的
- 运行 应用程序再次测试启动延迟。记录的延迟对于启动(或任意数量的后续启动)是正确的
- 现在我将应用程序的版本代码和名称增加 1。为了模拟升级,我使用了命令 adb install -r myapk。
- 现在我再次 运行 应用程序来测试升级后的首次启动延迟,即使需要 3 秒,记录的延迟也超出了图表。
有人知道为什么会发生这种情况吗?
更新
因此,如果我使用 "adb install -r myapk" 安装 apk,应用程序不会通过 Myapplication.onCreate()
。
您计算的延迟时间以毫秒为单位。 Date#getTime() returns 自格林威治标准时间 1970 年 1 月 1 日午夜以来的 毫秒 数。
观察到的 3 秒时间是因为卸载旧应用程序构建和安装新应用程序构建的开销。
我建议使用TimingLogger
class。根据文档,您可以轻松跟踪经过的时间,甚至可以在过程中添加拆分。
这个
TimingLogger timings = new TimingLogger(TAG, "methodA");
// ... do some work A ...
timings.addSplit("work A");
// ... do some work B ...
timings.addSplit("work B");
// ... do some work C ...
timings.addSplit("work C");
timings.dumpToLog();
产生
D/TAG (3459): methodA: begin
D/TAG (3459): methodA: 9 ms, work A
D/TAG (3459): methodA: 1 ms, work B
D/TAG (3459): methodA: 6 ms, work C
D/TAG (3459): methodA: end, 16 ms
因此,如果我使用 "adb install -r myapk" 安装 apk,应用程序不会通过 Myapplication.onCreate()。所以这回答了这个问题。我会问一个单独的问题,为什么使用 "adb install -r myapk" 安装应用程序然后启动 myapk 不会通过 MyApplication.onCreate()