aistra0528/Hail

[Report && Fix] 快捷方式没有权限问题分析及可能的解决方案

Closed this issue · 1 comments

首先向Hail及Shizuku开发组成员致以崇高敬意。

相似问题:#277

设备信息

  • 手机:1+Ace Pro
  • 系统:ColorOS 13.1 && Android版本 13
  • 授权方式:Shizuku (Wireless ADB)
  • Root:否
  • Hail版本:1.8.1(32)
  • Shizuku版本:13.5
  • Hail冻结方式:Shizuku-暂停

问题复现

点击桌面快捷方式尝试启动应用(非系统应用)均可能出现没有权限,如下图:

image

此时进入雹应用内点击应用图标却可以正常启动。且一旦通过此方式解冻后,在接下来一段时间内快捷方式变得可用。

没有权限问题没有预兆,在使用雹一段时间后就会在此手机上出现。控制变量情况下仍有可能复发。

没有权限问题下使用pm的表现

当出现没有权限问题后,尝试使用adb解冻应用时,会出现如下报错:

Exception occurred while executing 'enable":
java.lang.SecurityException: Shell.cannot change componentstate for null to 1

image

此时,无论是pm suspend还是pm disable-user/pm enable均出现类似错误。

这说明没有权限的问题出现在PackageManager层面。该问题在StackOverFlow上有人提问过类似问题,得到的回复是使用adb彻底卸载,尽管这确实起到了作用,但这显然与我目前使用情况不符。

具体原因因没有root无法继续调查。也恳请各位大佬提供更多资料。

问题修复

Activity启用

即使使用快捷方式启动失败,在应用内点击APP图标却正常工作。

此外,我尝试使用ActivityManager启动 无法在雹快捷方式启动 的应用时却意外地启用成功。

这说明,没有权限启动的应用在Activity层面上是没有冻结的。上面的截图可以看出,当我使用am start启用pm enable失败的应用时,直接启动成功。且启动成功后就不会出现没有权限问题,一切正常工作。

am start-n com.zmzx.college.search/.activity.init.InitActivity

Hail LaunchApp 逻辑修改

我的思路很简单,既然不需要解冻/解冻失败后直接启用Activity就可以恢复运行,那么跳过没有权限,直接用Activity唤起应用即可解决。

修改app/src/main/kotlin/com/aistra/hail/ui/api/ApiActivity.ktlaunchApp内容:

    private fun launchApp(pkg: String, tagId: Int? = null) {
        if (tagId != null) setListFrozen(false, HailData.checkedList.filter { it.tagId == tagId })
        try {
            if (AppManager.isAppFrozen(pkg)) {
                if (AppManager.setAppFrozen(pkg, false)) app.setAutoFreezeService()
                else throw IllegalStateException(getString(R.string.permission_denied))
            }
        }catch (e: Exception) {
            //println(e)
        }
        packageManager.getLaunchIntentForPackage(pkg)?.let {
            HShortcuts.addDynamicShortcut(pkg)
            startActivity(it)
        } ?: throw ActivityNotFoundException(getString(R.string.activity_not_found))
    }

当解冻失败时无视错误,直接尝试启动即可。

这在我的1+AP上工作正常:

8b6df5a9f8810193c3dc3fd1fbb632d9.mp4

此处提供一个基于1.9.0(33) 分支修改的debug测试包供大家测试Hail-v1.9.1-forcelaunch.zip

为什么不提PullRequest

如你所见,我没有在原先的代码基础上增加其他东西

对,只是一个catch而已。

此外,由于直接捕获了所有错误且没有进行有效处理,这很可能会导致更多意外的情况。

这并不符合Stable原则。

本issue更多的是提供了一个解决思路,而不是直接去在根本上解决问题

究竟为什么会出现应用伪冻结(标记为disable,无法enable,可以am启动),如何在根本上解决这个问题?

猜测:ColorOS可能会在system层面上单独disable应用的Activity,双重禁用下无法直接使用enable解冻。

希望有更多大佬给予帮助。

最后,
崇高敬意。

@aistra0528 开发者有空的话可以看看,这个 Bug 十分影响正常的使用