Android AGP 8.4 和 hilt 注入服务

问题描述 投票:0回答:1

升级到 Android Studio Jellyfish 并更新 Android Gradle 插件 8.4.0 后,在多模块项目上,当启用 minify 时,我似乎无法再注入到我的服务中。

升级后,我花了相当多的时间向非应用程序模块(它们是aar模块)添加新规则。我现在已经运行了该应用程序,并且大多数功能再次运行。但我无法让服务正常工作。它注入了很多东西。由于它适用于以前版本的 AGP,并且适用于调试版本,我认为这是由于新版本的 AGP 缺少一些规则所致。它确实表现得看不到注释。我在这个模块中使用与在其他模块中相同的规则来保留注释,并且它们正在获取注入。

我已将服务减少至:

@AndroidEntryPoint
open class MyService : Service() {
    @Inject
    lateinit var test: DTest

    override fun onCreate() {
        super.onCreate()

        Timber.d("onCreate, ${test.test}")
    }

    override fun onBind(intent: Intent?): IBinder? {
        return null
    }
}

DTest 位于同一模块中,并且只是:

@InstallIn(SingletonComponent::class)
@Module
object TestModule {
    @Provides
    @Singleton
    fun providesDTestModule(): DTest {
        return DTest("TestModule")
    }
}

data class DTest(val test: String)

服务启动后,结果是这样的:

E  java.lang.RuntimeException: Unable to create service my.package.MyService: kotlin.UninitializedPropertyAccessException: lateinit property test has not been initialized
E      at android.app.ActivityThread.handleCreateService(ActivityThread.java:4664)
E      at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0)
E      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2264)
E      at android.os.Handler.dispatchMessage(Handler.java:106)
E      at android.os.Looper.loopOnce(Looper.java:205)
E      at android.os.Looper.loop(Looper.java:294)
E      at android.app.ActivityThread.main(ActivityThread.java:8177)
E      at java.lang.reflect.Method.invoke(Native Method)
E      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
E      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
E  Caused by: kotlin.UninitializedPropertyAccessException: lateinit property test has not been initialized
E      at my.package.MyService.onCreate(SourceFile:8)
E      at android.app.ActivityThread.handleCreateService(ActivityThread.java:4651)
E      ... 9 more
android dagger-hilt android-r8
1个回答
0
投票

这些规则让我解决了问题:

-keep class my.pkg.name.di.** { *;}
-keepclassmembers my.pkg.name.di.** { *; }
-keep class my.pkg.name.MyService* { *; }

其中 my.pkg.name.di 是我保存匕首模块的包

请注意,仅保留服务是行不通的,我必须在末尾添加一个星号以确保保留一些刀柄生成的类。事实上,这是让它发挥作用的关键。

我可能是错的,但我的感觉是 dagger 需要更新他们的规则以适应新版本的 AGP。

© www.soinside.com 2019 - 2024. All rights reserved.