启用代码混淆后Wear OS Tile崩溃:LifecycleRegistry的LifecycleOwner已被回收
Wear OS Tile启用混淆后启动Activity崩溃问题
我开发了一款简单的Wear OS应用,包含一个Tile,点击Tile可打开自定义应用列表。Tile使用androidx.glance:glance-wear-tiles:1.0.0-alpha05,应用其余部分基于androidx.wear.compose开发。禁用代码混淆时一切功能正常,但启用代码混淆后,通过Tile启动Activity会导致应用崩溃,从系统应用启动器启动Activity则无此问题。
Tile相关代码
package nodomain.pacjo.wear.anotherapplist.tile import android.content.ComponentName import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.glance.Button import androidx.glance.ButtonColors import androidx.glance.GlanceComposable import androidx.glance.GlanceModifier import androidx.glance.LocalContext import androidx.glance.action.actionStartActivity import androidx.glance.action.clickable import androidx.glance.layout.Alignment import androidx.glance.layout.Box import androidx.glance.layout.Column import androidx.glance.layout.Spacer import androidx.glance.layout.fillMaxSize import androidx.glance.layout.fillMaxWidth import androidx.glance.layout.height import androidx.glance.text.Text import androidx.glance.unit.ColorProvider import androidx.glance.wear.tiles.GlanceTileService import androidx.wear.compose.material.Icon import com.google.accompanist.drawablepainter.rememberDrawablePainter import nodomain.pacjo.wear.anotherapplist.presentation.MainActivity import nodomain.pacjo.wear.anotherapplist.utils.AppInfo import nodomain.pacjo.wear.anotherapplist.utils.getLaunchableApps class LauncherTileService : GlanceTileService() { @Composable @GlanceComposable override fun Content() { Column( modifier = GlanceModifier .fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalAlignment = Alignment.CenterVertically ) { Button( text = "Open\napp list", onClick = actionStartActivity(MainActivity::class.java), modifier = GlanceModifier .height(64.dp) .fillMaxWidth(), colors = ButtonColors( contentColor = ColorProvider(Color.White), backgroundColor = ColorProvider(Color.Black) ) ) } } }
崩溃错误日志
Process: nodomain.pacjo.wear.anotherapplist, PID: 23213 java.lang.RuntimeException: Unable to stop service nodomain.pacjo.wear.anotherapplist.tile.LauncherTileService@e31f21a: java.lang.IllegalStateException: LifecycleOwner of this LifecycleRegistry is already garbage collected. It is too late to change lifecycle state. at android.app.ActivityThread.handleStopService(ActivityThread.java:3718) at android.app.ActivityThread.access$1700(ActivityThread.java:200) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1687) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6680) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.IllegalStateException: LifecycleOwner of this LifecycleRegistry is already garbage collected. It is too late to change lifecycle state. at androidx.lifecycle.v.g(Unknown Source:385) at androidx.lifecycle.v.f(Unknown Source:68) at androidx.lifecycle.v.e(Unknown Source:14) at androidx.lifecycle.M.run(Unknown Source:8) at q0.k.b(Unknown Source:6) at Q0.m.onDestroy(Unknown Source:9) at android.app.ActivityThread.handleStopService(ActivityThread.java:3698) at android.app.ActivityThread.access$1700(ActivityThread.java:200) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1687) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6680) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
解决方案
这个问题是代码混淆导致Glance Tile相关的Lifecycle类被错误混淆,进而引发生命周期管理异常。需要在混淆规则文件(proguard-rules.pro)中添加以下规则,保护Glance和相关Lifecycle组件不被混淆:
# 保护Glance Wear Tile相关类 -keep class androidx.glance.** { *; } -keep class androidx.glance.wear.tiles.** { *; } # 保护Lifecycle相关组件,避免生命周期所有者被混淆 -keep class androidx.lifecycle.** { *; } -keep class androidx.lifecycle.LifecycleOwner { *; } -keep class androidx.lifecycle.LifecycleRegistry { *; } # 保护你的Tile服务类和Activity不被混淆 -keep class nodomain.pacjo.wear.anotherapplist.tile.LauncherTileService { *; } -keep class nodomain.pacjo.wear.anotherapplist.presentation.MainActivity { *; }
补充说明
- 混淆时Glance框架依赖的反射和生命周期相关类被重命名或移除,导致Tile服务在停止时无法正确处理生命周期状态,最终触发崩溃。
- 保留Tile服务和目标Activity的完整类名,确保
actionStartActivity能正确找到对应的组件。
内容的提问来源于stack exchange,提问作者pacjo
相关产品推荐
相关产品推荐

