Назад к вопросам
Middle
69
questionbank

Как отследить самую раннюю точку входа в приложение?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Можно создать свойство в классе Application, которое будет хранить время инициализации.

class MyApplication : Application() {

    companion object {
        private var _startTime: Long = 0L
        val START_TIME: Long
            get() = _startTime
    }

    override fun onCreate() {
        super.onCreate()
        _startTime = System.currentTimeMillis() // Записываем время старта application
    }
}

Или использовать библиотеку с кастомным ContentProvider для более точного измерения до старта Application.onCreate.

package com.example.myapp

import android.app.Application
import android.content.ContentProvider
import android.content.ContentValues
import android.database.Cursor
import android.net.Uri
import android.util.Log

class StartupTimeProvider : ContentProvider() {

    companion object {
        init {
            // Этот блок выполняется до Application.onCreate
            Log.d("StartupTimeProvider", "Trace start: ${System.currentTimeMillis()}")
        }
    }

    override fun onCreate(): Boolean {
        return true // ContentProvider всегда должен возвращать true в onCreate
    }

    // Остальные методы ContentProvider должны быть реализованы,
    // но не используются в этом случае.
    override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor? {
        return null
    }

    override fun getType(uri: Uri): String? {
        return null
    }

    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        return null
    }

    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int {
        return 0
    }

    override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<out String>?): Int {
        return 0
    }
}

Необходимо зарегистрировать ContentProvider в AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApp">

        <!-- Регистрируем провайдер для отслеживания старта -->
        <provider
            android:name=".StartupTimeProvider"
            android:authorities="${applicationId}.startup"
            android:exported="false"
            android:initOrder="1" />

        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Параметр android:initOrder="1" гарантирует, что этот провайдер инициализируется первым среди всех провайдеров приложения.