衡量Android應用啓動時間的最精確方法是什麼?衡量Android應用啓動時間
通過啓動時間,我的意思是2和3之間的區別:
- 的應用程序未在發射
- 主要活動是完全初始化 上運行的應用程序圖標
- 用戶點擊
所以我基本上需要以某種方式獲得經過時間自JVM啓動,並記錄它。
衡量Android應用啓動時間的最精確方法是什麼?衡量Android應用啓動時間
通過啓動時間,我的意思是2和3之間的區別:
所以我基本上需要以某種方式獲得經過時間自JVM啓動,並記錄它。
我明白我已經太遲迴答了,但是,這正好回答了這個問題。
默認情況下,此信息在Logcat中記錄爲API版本19或更高版本。
從Android 4.4(API級別19)開始,logcat包含一個包含名爲Displayed的值的輸出行。此值表示啓動過程和完成在屏幕上繪製相應活動之間所經過的時間量。
ActivityManager:顯示com.android.myexample/.StartupTiming:+ 3s534ms
關鍵是尋找它在正確的地方 -
如果你正在跟蹤logcat的輸出從命令行或在終端中,查找已用時間很簡單。要在Android Studio中查找已用時間,您必須在logcat視圖中禁用篩選器。禁用過濾器是必要的,因爲系統服務器(而不是應用程序本身)爲此日誌提供服務。
提取物來自documentation。
謝謝,標記爲正確的答案。 – fhucho
一種可能性是將時間保存在onCreate()
方法的開始處和onCreate() method
的末尾,然後相互減去這些時間以獲得初始化應用程序所用的時間。
不幸的是,這並不會衡量應用程序由用戶啓動和調用onCreate()之間的時間。 – fhucho
裹整個onCreate()
方法在TimingLogger
。只要把這個開頭:
TimingLogger timings = new TimingLogger(TAG, "methodA");
這結尾:
timings.dumpToLog();
如果你想在一些中間步驟下降時間,你可以做timings.addSplit("name");
讓它走上獲取時間到那一步。
我不知道TimingLogger,感謝您的提示。但是,這並不能衡量應用程序由用戶啓動和調用onCreate()之間的時間。 – fhucho
我要解釋你的問題爲「是我的應用程序啓動時速度不夠快。我怎麼能檢查我做了我能做的一切?'
啓動時間在很大程度上是一種虛假的指標,因爲它會跨設備和ROM的變化。我猜你最有可能感興趣的是你的代碼需要很長時間才能執行,並且可能會阻塞主線程。
我發現這樣做的最有效方法是在應用程序啓動時使用Traceview,然後查看執行方法需要多長時間,以及主線程是否有空隙。
開始跟蹤:
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的初始化後另一個快照:
這是可以實現的時間使用下面的代碼追蹤:
覆蓋您Application
:
public class CustomApplication extends Application {
public final static long APP_START_TIME = System.currentTimeMillis();
/**
* Do all other application stuff
*/
}
並添加幾行到您的主Activity
:
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);
}
});
}
}
而且不要忘記在Manifest
來定義您的自定義應用程序:
<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.
在較新的設備上,ActivityManager記錄這個有點不同,所以使用這個:「adb logcat -s ActivityManager:I | grep Displayed」。結果將類似於「I/ActivityManager(288):顯示com.foo.bar/.main.MainActivity:+ 1s313ms」。 –
使用SysTrace
而且Trace類可用於使用
Trace.beginSection("name");
Trace.endSection();
這YouTube video是一個快速入門,以及測量部分。
「通過啓動時間我的意思是2和3之間的差異。」那將是1.或者可能是-1。 :-)更嚴重的是,您是在構建自己的固件,還是試圖從股票環境中獲取?此外,這是一個開發時間的事情,還是生產運行時查詢? – CommonsWare
我希望在開發過程中跟蹤不同設備和Android版本的啓動時間。另一個原因是,一些用戶抱怨說,自上次更新以來,應用程序啓動速度變慢,所以很高興看到數字。當然,我可以簡單地測量自從onCreate()被調用後的時間...但知道真正的啓動時間只是感覺更好:)它還允許我說「這會減慢啓動時間僅5%」,所以它不是大不了。 – fhucho