升级到 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
这些规则让我解决了问题:
-keep class my.pkg.name.di.** { *;}
-keepclassmembers my.pkg.name.di.** { *; }
-keep class my.pkg.name.MyService* { *; }
其中 my.pkg.name.di 是我保存匕首模块的包
请注意,仅保留服务是行不通的,我必须在末尾添加一个星号以确保保留一些刀柄生成的类。事实上,这是让它发挥作用的关键。
我可能是错的,但我的感觉是 dagger 需要更新他们的规则以适应新版本的 AGP。