brevent / Brevent

Black prevent without Root
Do What The F*ck You Want To Public License
747 stars 181 forks source link

应用未在运行时,应用通知会被清除 #827

Open fei-ke opened 1 year ago

fei-ke commented 1 year ago

当一个应用被加入黑阈列表后,如果由其他应用发送了该应用的通知(通过 NotificationManager#notifyAsPackage 发送),即使该应用未在运行,但是黑阈仍然会触发 force-stop 导致应用通知被清除。

HMSPush 利用了类似的 notifyAsPackage 的方式,使用包名 android 发送通知,但是黑阈用户反馈通知会被自动清除。

StatusBarNotificationgetOpPkg 可以获取真正发送通知的应用,是否能依此来判断通知的归属,不对未在运行的应用执行 force-stop,从而保留通知,或者黑阈能否提供选项,停止应用时忽略有通知正在显示的应用。

vvb2060 commented 1 year ago

感觉可以算bug,应该用操作者而不是通知关联应用

fei-ke commented 1 year ago

另外发现如果应用被标记为了安全应用(缓存进程)时也是不会被执行停止的,未在运行的应用反而被执行了停止操作, 执行停止的策略上感觉也可以优化一下。

liudongmiao commented 1 year ago

复现,然后带上日志并描述。(日志可能包含其它信息,建议使用邮件。)

fei-ke commented 1 year ago

写了一个 Demo 演示这种情况:NotificationDelegateDemo

复现视频:https://github.com/brevent/Brevent/assets/2138570/aca06113-8fe3-4973-975b-b2c0264ce5d3 日志:bugreport-sdk_phone64_arm64-SE1A.220621.001-2023-08-26-00-02-18.zip

视频中步骤解释:

  1. App B 被加入黑阈列表,同时将通知权限代理给 App A
  2. 通过 App A 发送 App B 的通知,此时 App B 并未在后台运行
  3. 等待黑阈执行黑阈操作
  4. App B 的通知被清除

通知被清除时时的日志片段:

08-26 00:02:07.119 shell  2210  2210 I BreventServer: check and brevent
08-26 00:02:07.135  1000   576   869 I ActivityManager: Force stopping com.example.app_b appid=10118 user=0: from pid 2210
liudongmiao commented 1 year ago

请使用黑阈内的日志报告工具,里面会有详细的处理日志。

fei-ke commented 1 year ago

logs-v4.2.20.3-20230826.1537.zip 操作步骤和之前描述一致

liudongmiao commented 1 year ago

正常日志会有一个 server.xxx.txt,你上传的附件没有。系统里位于这个目录下:

/Android/data/me.piebridge.brevent/server.XXX.txt
liudongmiao commented 1 year ago

经过检查代码,如果应用没有运行,但是有通知,视为恶意通知,是直接清除的。

唯一的例外:

安全的应用,有通知,通知保留;没有运行的应用,有通知,直接清理(唯一例外是允许运行)。

黑阈引入之机,GMS 只会发送通知给运行过的应用;应用被黑阈之后,执行了强行停止,GMS 也不会发送通知。这是一脉相承的。

fei-ke commented 1 year ago

了解,经测试允许同步可以避免被清除。

notifyAsPackage 和 GMS 的通知还是有一些区别,GMS 需要拉起目标应用进行通知, notifyAsPackage 不需要拉起目标应用,甚至目标应用已停用也可进行通知。

如果应用没有运行,但是有通知,视为恶意通知,是直接清除的。

应用没有运行,也就不存在后台耗电的情况,是否可以看做安全的应用从而保留通知呢。

liudongmiao commented 1 year ago

通知确实需要好好考虑一下,有些人不喜欢,有些人喜欢。

而你这种,都已经到了通知是应用的,但是发出通知的应用不是应用本身...理论上,小米 push 也可能会有这种问题。GMS 是非常确定的,只会发送通知给没有强行停止的应用。

从另一方面讲,是否接收通知,确实需要与强行停止状态相关。GMS 是这样处理的,黑阈也是这样处理的(对于“允许同步”应用,即使其它用户调用了强行停止,黑阈还会把它设置为非“强行停止”状态)。