Sobes.tech
Middle+

Kde by ste hľadali príčiny pomalého studeného štartu aplikácie?

sobes.tech AI

Odpoveď od AI

  1. Inicializácia objektov: Nákladné operácie v Application.onCreate() alebo prvom Activity, ako je načítanie dát, inicializácia knižníc.
  2. Čítanie súborov: Čítanie veľkého množstva dát zo súborov pri štarte.
  3. Operácie s databázou: Pomalé dopyty alebo veľký počet operácií s databázou pri štarte.
  4. Načítanie zdrojov: Nadmerné alebo neoptimalizované načítanie zdrojov (obrázky, XML rozloženia).
  5. Sieť: Synchronné sieťové požiadavky v hlavnom vlákne počas štartu.
  6. JIT kompilácia: Čas, ktorý ART venuje JIT kompilácii kódu pri prvom spustení po inštalácii/aktualizácii.
  7. Inflácia rozloženia: Zložitá alebo hlboká hierarchia View v prvom Activity, ktorá vyžaduje dlhý čas na infláciu.
  8. Blokovanie hlavného vlákna: Akékoľvek dlhé operácie vykonávané v hlavnom vlákne počas štartu.

Nástroje:

  • Android Profiler (CPU Profiler, System Trace).
  • Startup Profiler (špeciálny nástroj na meranie času inicializácie triedy).
  • Traceview/Systrace (pre detailnú analýzu volaní funkcií).
  • logcat (pre hľadanie podozrivých logov alebo chýb počas štartu).
  • adb shell am start -W <plné_meno_balíka>/<plné_meno_aktivity> (pre meranie celkového času štartu).
// Príklad merania času v kóde
class MyApplication : Application() {
    override fun onCreate() {
        val startTime = System.currentTimeMillis()
        super.onCreate()

        // Inicializácia, ktorá môže byť dlhá:
        // 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é operácie súvisiace s UI alebo dátami
        // setupRecyclerView()
        // loadContentFromNetwork()

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

Zameranie na Application.onCreate() a prvé metódy životného cyklu prvého Activity (onCreate, onStart, onResume).