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,提问作者Владислав Гладкий
相关产品推荐
相关产品推荐

