2013-01-02 24 views
16

Jaki jest najdokładniejszy sposób mierzenia czasu uruchamiania aplikacji na Androida?Zmierz czas uruchamiania aplikacji na Androida

Przez starcie mam na myśli różnicę pomiędzy 2. i 3.:

  1. Proces aplikacji nie jest uruchomiony
  2. użytkownik kliknie na ikonie aplikacji w wyrzutni
  3. główną działalnością jest w pełni zainicjowany

Więc w zasadzie potrzebuję jakoś uzyskać czas, jaki upłynął od uruchomienia JVM i zalogować go.

+0

"Przez czas uruchamiania mam na myśli różnicę między 2. a 3." To byłby 1. Albo może -1. :-) Czy poważnie, czy budujesz swoje własne oprogramowanie, czy też próbujesz je zdobyć ze sklepu? Czy jest to rzecz rozwojowa lub zapytanie o środowisko produkcyjne? – CommonsWare

+0

Chcę to śledzić czas uruchamiania na różnych urządzeniach i wersjach Androida podczas rozwoju. Innym powodem jest to, że niektórzy użytkownicy skarżyli się, że uruchomienie aplikacji stało się powolne od czasu ostatniej aktualizacji, więc byłoby miło zobaczyć liczby. Oczywiście mógłbym po prostu zmierzyć czas, od kiedy nazwa onCreate() została wywołana ... ale znając rzeczywisty czas startowy po prostu czuje się lepiej :) Pozwala mi to również powiedzieć "spowalnia to czas uruchamiania tylko o 5%", więc nie jest to Wielka rzecz. – fhucho

Odpowiedz

1

Rozumiem, że jestem już za późno, aby odpowiedzieć, jednak to właśnie odpowiada na pytanie.

Ta informacja jest logowana domyślnie na Logcat domyślnie dla wersji API 19 lub wyższej.

Z Androida 4.4 (poziom API 19), logcat zawiera wiersz wyjściowy zawierający wartość o nazwie Wyświetlany. Ta wartość reprezentuje czas, jaki upłynął od rozpoczęcia procesu i zakończenia rysowania odpowiedniego działania na ekranie.

ActivityManager: Wyświetlane com.android.myexample/.StartupTiming: + 3s534ms

Kluczem jest patrząc na nią w odpowiednim miejscu -

Jeśli śledzisz wyjście logcat z wiersza poleceń lub w terminalu znalezienie czasu, który upłynął, jest proste. Aby znaleźć czas, który upłynął w Android Studio, musisz wyłączyć filtry w widoku logcat. Wyłączenie filtrów jest konieczne, ponieważ serwer systemowy, a nie sama aplikacja, obsługuje ten dziennik.

Ekstrakty pochodzą z documentation.

+0

Dzięki, oznaczenie jako poprawna odpowiedź. – fhucho

0

Jedną z możliwości jest zaoszczędzenie czasu na początku metody onCreate() i na końcu onCreate() method, a następnie odjęcie tych czasów od siebie, aby uzyskać czas potrzebny na zainicjowanie aplikacji.

+0

To niestety nie mierzy czasu między momentem uruchomienia aplikacji przez użytkownika a momentem wywołania metody onCreate(). – fhucho

4

Owiń całą metodę onCreate() w postaci TimingLogger. Wystarczy umieścić to na początku:

TimingLogger timings = new TimingLogger(TAG, "methodA"); 

a to w końcu:

timings.dumpToLog(); 

Jeśli chcesz usunąć razy na pewnym etapie pośrednim, można zrobić timings.addSplit("name"); uzyskać czasu zajęło, aby uzyskać do tego kroku.

+0

Nie wiedziałem o TimingLogger, dzięki za napiwek. Nie mierzy to jednak czasu między momentem uruchomienia aplikacji przez użytkownika a wywołaniem funkcji onCreate(). – fhucho

9

Zamierzam zinterpretować pytanie jako "Czy czas uruchamiania mojej aplikacji jest wystarczająco szybki. Jak mogę sprawdzić, czy zrobiłem wszystko, co mogłem zrobić?

Czas uruchamiania jest w dużej mierze fałszywym wskaźnikiem, ponieważ różni się on w zależności od urządzenia i pamięci ROM. Domyślam się, że najprawdopodobniej jesteś zainteresowany tym, ile czasu zajmuje twój kod i co potencjalnie blokuje główny wątek.

Znalazłem najbardziej skuteczny sposób na to, aby użyć Traceview na początku aplikacji, a następnie sprawdzanie, jak długo trwa metoda do wykonania i czy są jakieś przerwy w głównym wątku.

Rozpocznij śledzenie:

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

Zatrzymaj śledzenie:

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

Po ślad zostały zebrane, powinieneś być w stanie zobaczyć niczego, co wywiera znaczący wpływ na czas uruchamiania. W moim przypadku, widzianym poniżej, istniała duża luka w wątku UI, w którym jest blokowana.

main thread blocked

Okazało się, że zarówno Crashlytics i Coremetrics były wymagające wywołania randomUUID() które następnie są zsynchronizowane i nici blokujące główny gwint. Rozwiązaniem było jedynie zakręcenie nowego wątku w celu zainicjowania kodu Coremetrics.

Jest to coś, czego bym nie zauważył w inny sposób, mierząc tylko czas uruchamiania, ale faktycznie przyspieszył "czas startowy" aplikacji o kilkaset milisekund.

Oto kolejny snapshot po wydzielenia oddzielnego wątku dla Coremetrics inicjalizacji:

main thread not blocked

0

Jest to możliwe do wykonania śledzenie czasu korzystania następny kod:

nadpisało Application:

public class CustomApplication extends Application { 
    public final static long APP_START_TIME = System.currentTimeMillis(); 

    /** 
    * Do all other application stuff 
    */ 
} 

I dodaj kilka wierszy do głównej 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); 
      } 
     }); 
    } 
} 

I nie zapomnij, aby zdefiniować aplikację niestandardową w Manifest:

<application 
    android:label="@string/app_name" 
    android:name=".CustomApplication" > 

</application> 

Ważne: Musisz zabić swoją aplikację przed startem, ponieważ przechowuje aplikacji zmienna statyczna, która śledzi początkowy czas.

5

Sprawdź w powłoce adb w poniższy sposób.

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. 
+2

Na nowszych urządzeniach ActivityManager rejestruje to nieco inaczej, więc użyj tego: "adb logcat -s ActivityManager: I | grep Displayed". Wynik będzie podobny do "I/ActivityManager (288): Wyświetlany com.foo.bar/.main.MainActivity: + 1s313ms". –

0

Zastosowanie SysTrace

Również klasa nazwiska mogą być stosowane do pomiaru odcinków używając

Trace.beginSection("name"); 
Trace.endSection(); 

Ten YouTube video to szybkie podkładu, jak również.

Powiązane problemy