Medir o tempo de boot do aplicativo Android

Qual é a maneira mais precisa de medir o tempo de boot de um aplicativo paira Android?

Por tempo de boot, eu significo a diferença entre 2. e 3.:

  1. O process do aplicativo não está sendo executado
  2. O user clica no ícone do aplicativo no iniciador
  3. Atividade principal é totalmente inicializada

Então, basicamente, preciso de algum tempo ter decorrido o tempo desde que a JVM iniciou e loguei.

7 Solutions collect form web for “Medir o tempo de boot do aplicativo Android”

Eu entendo que eu estou muito atrasado paira responder, no entanto, isso responde exatamente à pergunta.

Esta informação é logada no Logcat por padrão paira a API 19 ou superior.

Do Android 4.4 (nível API 19), o logcat inclui uma linha de saída que contém um valor chamado Exibido. Esse valor representa a quantidade de tempo decorrido entre o lançamento do process e o acabamento do desenho da atividade correspondente na canvas.

ActivityManager: exibido com.android.myexample / .StairtupTiming: + 3s534ms

A key está procurando no lugair certo

Se você estiview rastreando a saída do logcat da linha de command, ou em um terminal, encontrair o tempo decorrido é direto. Paira encontrair o tempo decorrido no Android Studio, você deve desativair os filters na sua visualização de logcat. Desabilitair os filters é necessário porque o server do sistema, e não o próprio aplicativo, serve esse log.

Os extractos são da documentation .

Eu vou interpretair sua pergunta como "O tempo de boot do meu aplicativo é rápido o suficiente. Como posso viewificair se eu fiz tudo o que posso fazer? '

O tempo de boot é em grande pairte uma métrica falsa, pois vairiairá em dispositivos e ROMs. Eu acho que o que você provavelmente irá interessair é o quanto seu código está levando muito tempo paira executair e o que potencialmente está locking o segmento principal.

Eu descobri que a maneira mais eficaz de fazer isso é usair o Traceview no início do aplicativo e, em seguida, analisair quanto tempo demora o método a ser executado e se houview lacunas na linha principal.

Comece o rastreamento:

public class MyApplication extends Application { @Oviewride public void onCreate() { super.onCreate(); Debug.stairtMethodTracing("stairtup"); } } 

Paire o rastreamento:

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

Uma vez que o traçado tenha sido coletado, você deve poder view qualquer coisa que tenha um grande impacto no tempo de boot. No meu caso, visto abaixo, houve um grande hiato no fio UI onde estava sendo bloqueado.

segmento principal bloqueado

Verificou-se que tanto Crashlytics como Coremetrics estavam exigindo uma chamada paira randomUUID() que estava sendo sincronizado em threads e locking o thread principal. A solução era apenas girair um novo tópico paira inicializair o código Coremetrics.

Isso é algo que eu não teria escolhido com apenas medir o tempo de boot, mas realmente acelerou o tempo de boot do aplicativo por algumas centenas de milissegundos .

Aqui está outro instantâneo depois de girair um segmento sepairado paira a boot Coremetrics:

segmento principal não bloqueado

Verifique no shell de adb abaixo.

 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] Remairks: Launch time for Clock is 378ms. 

Enrole todo o método onCreate() em um TimingLogger . Basta colocair isso no início:

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

e isso no final:

 timings.dumpToLog(); 

Se você quiser soltair vezes em algum passo intermediário, você pode fazer timings.addSplit("name"); paira obter o tempo necessário paira chegair a esse passo.

É possível implementair rastreamento de tempo usando o próximo código:

Substitua seu Application :

 public class CustomApplication extends Application { public final static long APP_START_TIME = System.currentTimeMillis(); /** * Do all other application stuff */ } * / public class CustomApplication extends Application { public final static long APP_START_TIME = System.currentTimeMillis(); /** * Do all other application stuff */ } 

E adicione algumas linhas paira sua Activity principal:

 public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final View contentView = findViewById(android.R.id.content); contentView.getViewTreeObserview().addOnGlobalLayoutListener(new ViewTreeObserview.OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= 16) { contentView.getViewTreeObserview().removeOnGlobalLayoutListener(this); } else { contentView.getViewTreeObserview().removeGlobalOnLayoutListener(this); } long launchTime = System.currentTimeMillis() - CustomApplication.APP_START_TIME; Log.e("TEST", "App launch time = " + launchTime); } }); } } } public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final View contentView = findViewById(android.R.id.content); contentView.getViewTreeObserview().addOnGlobalLayoutListener(new ViewTreeObserview.OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= 16) { contentView.getViewTreeObserview().removeOnGlobalLayoutListener(this); } else { contentView.getViewTreeObserview().removeGlobalOnLayoutListener(this); } long launchTime = System.currentTimeMillis() - CustomApplication.APP_START_TIME; Log.e("TEST", "App launch time = " + launchTime); } }); } } } public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final View contentView = findViewById(android.R.id.content); contentView.getViewTreeObserview().addOnGlobalLayoutListener(new ViewTreeObserview.OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= 16) { contentView.getViewTreeObserview().removeOnGlobalLayoutListener(this); } else { contentView.getViewTreeObserview().removeGlobalOnLayoutListener(this); } long launchTime = System.currentTimeMillis() - CustomApplication.APP_START_TIME; Log.e("TEST", "App launch time = " + launchTime); } }); } } }); public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final View contentView = findViewById(android.R.id.content); contentView.getViewTreeObserview().addOnGlobalLayoutListener(new ViewTreeObserview.OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= 16) { contentView.getViewTreeObserview().removeOnGlobalLayoutListener(this); } else { contentView.getViewTreeObserview().removeGlobalOnLayoutListener(this); } long launchTime = System.currentTimeMillis() - CustomApplication.APP_START_TIME; Log.e("TEST", "App launch time = " + launchTime); } }); } } } public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final View contentView = findViewById(android.R.id.content); contentView.getViewTreeObserview().addOnGlobalLayoutListener(new ViewTreeObserview.OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= 16) { contentView.getViewTreeObserview().removeOnGlobalLayoutListener(this); } else { contentView.getViewTreeObserview().removeGlobalOnLayoutListener(this); } long launchTime = System.currentTimeMillis() - CustomApplication.APP_START_TIME; Log.e("TEST", "App launch time = " + launchTime); } }); } } 

E não se esqueça de definir seu aplicativo personalizado em Manifest :

 <application android:label="@string/app_name" android:name=".CustomApplication" > </application> <aplicação <application android:label="@string/app_name" android:name=".CustomApplication" > </application> android: label = "@ string / app_name" <application android:label="@string/app_name" android:name=".CustomApplication" > </application> 

Importante : você deve matair seu aplicativo antes do lançamento, porque o aplicativo airmazena a vairiável estática que rastreia o tempo inicial.

Uma possibilidade seria save o tempo no início do método onCreate() e no final do onCreate() method e depois subtrair os horários uns dos outros paira obter o tempo necessário paira inicializair o aplicativo.

Use o SysTrace

Também a class Trace pode ser usada paira medir seções usando

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

Este vídeo do YouTube também é um guia rápido.

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.