Sobes.tech
Middle+

Kde byste hledali příčiny pomalého studeného spuštění aplikace?

sobes.tech AI

Odpověď od AI

  1. Inicializace objektů: Nákladné operace v Application.onCreate() nebo v prvním Activity, jako je načítání dat, inicializace knihoven.
  2. Čtení souborů: Čtení velkého množství dat ze souborů při spuštění.
  3. Operace s databází: Pomalé dotazy nebo velké množství operací s databází při startu.
  4. Načítání zdrojů: Nadměrné nebo neoptimalizované načítání zdrojů (obrázky, XML rozvržení).
  5. Síť: Synchronní síťové požadavky na hlavním vlákně během spuštění.
  6. JIT kompilace: Čas, který ART věnuje JIT kompilaci kódu při prvním spuštění po instalaci/aktualizaci.
  7. Vytváření rozvržení: Složitá nebo hluboká hierarchie View při prvním Activity, která vyžaduje dlouhou dobu na inflaci.
  8. Zablokování hlavního vlákna: Jakékoli dlouhé operace prováděné na hlavním vlákně během spuštění.

Nástroje:

  • Android Profiler (CPU Profiler, System Trace).
  • Startup Profiler (speciální nástroj pro měření času inicializace třídy).
  • Traceview/Systrace (pro detailní analýzu volání funkcí).
  • logcat (pro hledání podezřelých logů nebo chyb během spuštění).
  • adb shell am start -W <celé_jméno_balíčku>/<celé_jméno_aktivity> (pro měření celkového času spuštění).
// Příklad měření času v kódu
class MyApplication : Application() {
    override fun onCreate() {
        val startTime = System.currentTimeMillis()
        super.onCreate()

        // Inicializace, která může být dlouhá:
        // MyDatabase.initialize(this)
        // SomeLibrary.setup()
        // LoadInitialData.execute()

        val endTime = System.currentTimeMillis()
        Log.d("StartupTime", "Application onCreate trvalo ${endTime - startTime} ms")
    }
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        val startTime = System.currentTimeMillis()
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Nákladné operace související s UI nebo daty
        // setupRecyclerView()
        // loadContentFromNetwork()

        val endTime = System.currentTimeMillis()
        Log.d("StartupTime", "MainActivity onCreate trvalo ${endTime - startTime} ms")
    }
}

Zaměření na Application.onCreate() a první metody životního cyklu prvního Activity (onCreate, onStart, onResume).