[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-暂停
问题复现
在点击桌面快捷方式尝试启动应用(非系统应用)均可能出现没有权限
,如下图:
此时进入雹应用内点击应用图标却可以正常启动。且一旦通过此方式解冻后,在接下来一段时间内快捷方式变得可用。
没有权限
问题没有预兆,在使用雹一段时间后就会在此手机上出现。控制变量情况下仍有可能复发。
在没有权限
问题下使用pm
的表现
当出现没有权限
问题后,尝试使用adb解冻应用时,会出现如下报错:
Exception occurred while executing 'enable":
java.lang.SecurityException: Shell.cannot change componentstate for null to 1
此时,无论是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.kt
的launchApp
内容:
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 十分影响正常的使用