You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hilt Activity绑定@HiltAndroidApp异常排查求助

Hilt初始化崩溃的排查分析

问题背景

应用已发布并被数千用户使用,但有3台设备共出现14次崩溃,涉及设备如下:

  • HONOR HNNTN(HONOR 50 Lite,Android 11,SDK 30)
  • SAMSUNG M23XQ(GALAXY F23 5G,Android 13,SDK 33)
  • SAMSUNG R8S(Android 13,SDK 33)

奇怪的是,该崩溃仅在Play Market的崩溃报告中可见,Crashlytics无相关记录。我们已为应用添加@HiltAndroidApp注解,所有Activity也添加了@AndroidEntryPoint注解,且应用在多数设备上运行正常。尝试在Samsung A22S和Poco X3 Pro上复现崩溃,但未成功。

崩溃堆栈信息

Exception java.lang.RuntimeException:
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:4078)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:4286)
at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:93)
at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2524)
at android.os.Handler.dispatchMessage (Handler.java:109)
at android.os.Looper.loop (Looper.java:228)
at android.app.ActivityThread.main (ActivityThread.java:8689)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:613)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1085)
Caused by java.lang.IllegalStateException: Hilt Activity must be attached to an @HiltAndroidApp Application. Did you forget to specify your Application's class name in your manifest's <application />'s android:name attribute?
at dagger.hilt.android.internal.managers.ActivityComponentManager.createComponent (ActivityComponentManager.java:76)
at dagger.hilt.android.internal.managers.ActivityComponentManager.generatedComponent (ActivityComponentManager.java:66)
at ru.scid.ui.Hilt_MainActivity.generatedComponent (Hilt_MainActivity.java:45)
at ru.scid.ui.Hilt_MainActivity.inject (Hilt_MainActivity.java:67)
at ru.scid.ui.Hilt_MainActivity$1.onContextAvailable (Hilt_MainActivity.java:38)
at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable (ContextAwareHelper.java:99)
at androidx.activity.ComponentActivity.onCreate (ComponentActivity.java:352)
at androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java:217)
at ru.scid.ui.MainActivity.onCreate (MainActivity.kt:50)
at android.app.Activity.performCreate (Activity.java:8327)
at android.app.Activity.performCreate (Activity.java:8310)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1323)
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:4049)

现有配置与代码

Manifest文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="my.package">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

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

        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="@string/default_notification_channel_id"/>

        <service
            android:name="my.package.core.util.AppFirebaseMessagingService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

        <receiver
            android:name="my.package.core.util.AlarmBroadcastReceiver"
            android:enabled="true"
            android:exported="false" >
            <intent-filter>
                <action android:name="${applicationId}.SOME_NOTIFICATION" />
            </intent-filter>
        </receiver>

        <activity
            android:name=".ui.MainActivity"
            android:exported="true"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan"
            android:launchMode="singleInstance">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter
                android:autoVerify="true">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:host="@string/app_host" android:scheme="http" />
                <data android:host="@string/app_host" android:scheme="https" />
            </intent-filter>
        </activity>

        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            tools:node="remove">
        </provider>
    </application>

</manifest>

App类代码

@HiltAndroidApp
class App : Application(), Configuration.Provider {

    companion object {
        private lateinit var _instance: App

        fun getInstance(): App {
            return _instance
        }

    }

    init {
        _instance = this

        MapKitFactory.setApiKey(Constants.MAPKIT_API_KEY)
    }

    override fun onCreate() {
        super.onCreate()
        createTimber()
    }

    private fun createTimber() {
        if (BuildConfig.DEBUG) {
            Timber.plant(Timber.DebugTree())
        }
    }

    @Inject
    lateinit var hiltWorkerFactory: HiltWorkerFactory

    override fun getWorkManagerConfiguration(): Configuration {
        return Configuration.Builder()
            .setWorkerFactory(hiltWorkerFactory)
            .build()
    }

}

可能的原因分析

  • 进程异常重启导致Application未初始化:当应用因低内存被系统杀死后,若通过Deep Link、PendingIntent等方式直接启动Activity,系统可能跳过Application的初始化流程,直接拉起Activity。此时Hilt的全局组件尚未初始化,就会触发该异常。singleInstance的启动模式可能增加这种场景的发生概率。
  • 厂商ROM的特殊启动逻辑:涉及的Honor和Samsung设备可能有定制化的进程管理策略,在某些场景下绕过了标准的Application初始化步骤,导致Hilt无法完成组件注入的准备工作。
  • Hilt与Android版本的兼容性问题:部分Android 11/13设备与当前使用的Hilt版本可能存在边缘兼容性问题,生成的代理类(如Hilt_MainActivity)无法正确获取@HiltAndroidApp标记的Application实例。
  • WorkManager初始化的竞争问题:App类实现了Configuration.Provider并注入HiltWorkerFactory,虽然移除了InitializationProvider,但在部分设备上,WorkManager的初始化时机可能与Hilt的全局组件初始化存在竞争,导致Activity启动时Application的注入尚未完成。
  • Crashlytics未捕获日志的原因:崩溃可能发生在Crashlytics初始化之前,或者设备网络问题导致日志无法上传,而Play Market直接收集设备本地的崩溃日志,因此能看到记录。

内容的提问来源于stack exchange,提问作者Владислав Гладкий

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:45:56