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

启用代码混淆后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:59:59