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

Hilt集成Proto DataStore报错:InjectProcessingStep无法处理CacheRepositoryImpl

解决Proto DataStore与Hilt集成时的Settings类解析问题

问题根源

Proto DataStore的Settings类属于编译时生成的代码,Hilt的注解处理器执行顺序可能早于Proto类的生成,导致处理器找不到该类,进而引发注入失败。


具体解决方案

  1. 校验Proto文件配置

    • 确保.proto文件放在src/main/proto目录下(默认Proto文件存放路径)
    • 在Module级别的build.gradle中配置正确的Proto生成规则,必须启用Lite版本:
      android {
          sourceSets {
              main {
                  proto {
                      srcDir "src/main/proto"
                  }
              }
          }
      
          protobuf {
              protoc {
                  artifact = "com.google.protobuf:protoc:3.24.4"
              }
              generateProtoTasks {
                  all().each { task ->
                      task.builtins {
                          java {
                              option "lite"
                          }
                      }
                  }
              }
          }
      }
      
  2. 调整注解处理器执行顺序
    强制让Protobuf处理器先于Hilt处理器执行,避免Hilt找不到生成的Settings类:

    dependencies {
        implementation "androidx.datastore:datastore-core:1.0.0"
        implementation "androidx.datastore:datastore-proto:1.0.0"
        implementation "com.google.protobuf:protobuf-javalite:3.24.4"
        kapt "com.google.dagger:hilt-compiler:2.48"
    }
    
    kapt {
        correctErrorTypes = true
        processors = ["com.google.protobuf.javap.JavaLiteProtoProcessor", "dagger.hilt.android.processor.internal.androidentrypoint.InjectProcessingStep"]
    }
    
  3. 清理并重建项目

    • 执行命令清理缓存:./gradlew clean
    • 重新构建项目:./gradlew assembleDebug,确保Settings类被正确生成并被Hilt识别
  4. 检查DataStore注入代码
    确认DataStore<Settings>的提供者配置正确,示例代码如下:

    @Module
    @InstallIn(SingletonComponent::class)
    object DataStoreModule {
        @Provides
        fun provideSettingsDataStore(@ApplicationContext context: Context): DataStore<Settings> {
            return context.createDataStore(
                fileName = "settings.pb",
                serializer = SettingsSerializer
            )
        }
    }
    
    object SettingsSerializer : Serializer<Settings> {
        override val defaultValue: Settings = Settings.getDefaultInstance()
        override suspend fun readFrom(input: InputStream): Settings {
            try {
                return Settings.parseFrom(input)
            } catch (e: InvalidProtocolBufferException) {
                throw CorruptionException("Cannot read proto.", e)
            }
        }
        override suspend fun writeTo(t: Settings, output: OutputStream) {
            t.writeTo(output)
        }
    }
    
  5. 清除IDE缓存
    若上述操作后仍报错,执行IDE的Invalidate Caches / Restart操作,确保生成的Settings类被正确索引

内容的提问来源于stack exchange,提问作者Oluwatosin Solarin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 01:39:52