花式折腾小米推送框架

「人生的坑爹遭遇有很大一部分来源于手贱」

自上个月写完了安卓短信/通讯录/流量信息备份相关的内容,然后我更新完了系统折腾掉所有坑以后,这台狗米 note7pro 可以稳定很久不用动了。然而话是这么说,人不作死就不会死。。。我手贱点开了 tg 的小米推送框架群,看到了新版本,push 和 framework 合在一起了,不过 comments 里面已经有老哥说更新以后会出现推送错误的问题。

管他呢!更新。结果更新完真的就提示注册异常,不过好消息是还能推送。另外新的二合一 app 和原来的 framework app 签名不一样,包名也不一样,原来的 framework app 打开即闪退。

好家伙,不能忍。删除装回原版,发现没有用了。。。注册还是失败。转了一圈尝试了各种方法,得出了一些结论:

  1. 某米服务器那边应该是改了验证机制,导致现在得用一些比较奇葩的方法才能保证应用能够注册上。原来已经注册上的就不受影响,所以如果我用原版没有问题就应该毛事没有。

  2. 奇特的方法包括:安装成为系统应用;使用旧版;安装 xposed 欺骗框架;安装 magisk 欺骗框架。

  3. 经过我的实验,装 2018 年的版本,无论怎么样应用都没法注册上,连推送出错都没有发生,直接就「使用小米推送,但尚未注册」;而安装最新的二合一版本,就算上了 xposed 欺骗框架 + magisk 欺骗框架 + 安装成系统应用,仍然会弹出推送错误的提示。

  4. 在 framework app 中,打开「应用注册时显示通知」 的开关,正常情况下打开支持小米推送的应用,应该会弹出注册推送的 toast。另外第一次注册的应用会在记录中留下四条注册推送成功的讯息(比如下图中的 tx 加速器),少一条都有可能是出了问题的征兆。

  5. 无论用什么手段。。。设置里全局伪装为小米设备的开关在关闭 framework apk 重新打开后都会发现被自动关上了。另外 Q&A 中提到的重装 framework app 和 push app 后需要重装注册过的应用才会摆脱「注册异常」的提示,我应用后并没有改善,后续解决该问题也不是靠的重装应用。可能是因为我这台设备本来就是小米,只不过刷了类原生而已。。。

  6. 伪装为小米设备有好多种方法。其中,旧版(2018 版)会自动在 xposed 里面装一个 push 模块;旧版的 magisk 里可以下到不需要 riru 的 xposed 欺骗模块;还可以用 magisk props config 手动修改 props 文件(具体修改步骤百度/在酷安搜索);比较新的两个方法是使用 riru 模块 MiPushFakeForRiru;或者是使用 edxposed 中可以在仓库中搜到的 MiPush Framework Enhancement。总而言之让相关应用能够识别出你在用 miui 就成功了。所以强烈推荐其中的 MiPush Framework Enhancement,就算没有生效它也能读出你被伪装成什么版本的 miui,伪装到了何种程度(另外这个软件要生效,不仅在 edxposed 中需要启动,打开软件后还要把工作模式设为黑名单,默认的已禁用模式软件也不生效)。

  7. 开启 selinux 的情况下也会出现注册异常的状况。但注册成功的应用即使在 selinux 开启的情况下仍然能够正常推送。

回到正题,在我这台类原生 pe 的红米 note7 pro 上,我具体做了这么几部:

  1. 关闭 selinux。可以用各种终端软件(比如 termux),获取 root 后输入 setenforce 0 即可。也可以用各种 kernel manager,开机自动运行该命令。
  2. 安装 200315 版本的 push 和 framework app。
  3. 使用 magisk 模块 App Systemizer 将两个应用全部移入 /system/priv-app 中。粗略步骤是安装模块后重启,在终端中获取 su 后输入 systemize,然后按提示操作。注意两个都要移进去,移一个的话我试过一次,照样出错。
  4. 安装上文提到的 MiPushFakeForRiru (如果没装过 riru 还得装 riru 模块,不过都装了 xposed,riru 我觉得大家都应该装了)和 MiPush Framework Enhancement,后者记得正确启用。(前者其实不一定有用,但后者一定要装)
  5. 打开软件,正确给予权限。
  6. 打开支持小米推送的应用,此时回到 framework app 会发现提示注册失败。稍安勿躁,等个几个钟头就会奇迹般的变成注册成功了(
  7. 相关的推送还要等半天到一天才会恢复正常。不要指望刚装上应用注册成功就会有推送来找你(

大概就是这样。还可以通过 MiPushTester 来验证推送是不是真的正常了。不过话说回来,第一次我按上面的大概步骤做了以后,正常了几天,后面推送是出来了,点击推送相关应用弹不出来。。。看日志是 intent 卡住了,后来我又重装试了一通新旧版本,再后来我又大概按上面的步骤做了一次,又正常了。。。这次正常使用了十来天,我觉得应该是彻底正常了。所以上面的步骤 1-5,也不用太严格遵守啦,毕竟我没有严格测试过那步放在后面就会 crash,我大概回忆了一下差不多是这样,再严格测试出什么幺蛾子那又麻烦了(

总之不要手贱,能用的就不要东搞西搞(