一、现象
当一个 app 有两个入口 Activity
(标记了 main、launcher 的 Activity,如集成了 LeakCanary 的 app),安装后,桌面上会出现两个图标。
当在 androidManifest 中删除一个 activity
或将其 disable
,再覆盖安装,桌面上的两个图标都会消失(有些机器会这样,如 mix2;在模拟器上只有被删除或者 disable 的那个没了)。
通过代码设置 Activity disable,也会让图标都消失(mix2 上,大约 13s 后)。
二、恢复
(测试机型:mix2)
2.1 通过代码
大约十几秒后生效
val componentName = ComponentName(context, "com.gdeer.gdtesthub.MyActivity")
val packageManager = context?.packageManager
packageManager?.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP)
2.2 通过 adb
即时生效
debug 版:
// 恢复 MyActivity
adb shell pm enable com.gdeer.gdtesthub/.MyActivity
// 恢复所有入口 Activity,先 disable 再 enable
adb shell pm disable com.gdeer.gdtesthub
adb shell pm enable com.gdeer.gdtesthub
release 版:
// 恢复所有入口 Activity,先 disable-user 再 enable
adb shell pm disable-user com.gdeer.gdtesthub
adb shell pm enable com.gdeer.gdtesthub
release 版使用 disable,会报 Security exception: Shell cannot change component state,要用 disable-user
。
disable-user 也不能改变单个 Activity,只能针对包名使用。