Назад к вопросам
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" гарантирует, что этот провайдер инициализируется первым среди всех провайдеров приложения.