基于开源的 AppOpsX 写了 (应该是改了,滑稽) 一个修改 IFW 文件的图形界面程序,可以达到类似于 My Android Tools (简称 MAT、写轮眼) 的效果。
特点:
- 运行时不需要 root 或者 adb (但第一次安装时需要 root,后面会说明),适合手机已经解锁但不想 root 的强迫症用户。
- IFW 修改使用了系统的 API,可以实时生效,不用重启。
下载地址:
https://github.com/linusyang92/AppOpsX/releases
更新内容:
更新说明: 之前的旧版都删掉了,发布页上只有最新版,checksum.txt 里面有当前版本的编译日期和校验码。刷了旧版的老铁直接下最新的 apk 安装就行了,不用再刷了。
- 2018-04-15: 支持禁用(冻结)程序,在右上角三个点里面 (千万不要乱禁用系统程序,变砖了自己负责)
- 2018-01-25: 增加选项:短按显示服务;首页显示有运行后台服务的程序。(重要提示:升级到此版本设置里的某些选项可能会被关掉,记得重新开启!)
- 2018-01-20: 解决 Android 8.0 以上显示正在运行服务的问题。
- 2017-12-09: 支持 ifw 文件导入导出 (可以在设置里找到);如果给了存储权限,卸载后重新安装也会自动还原上次ifw配置 (以前不会,要手动)
- 2017-12-08: 添加帮助提示;添加存储权限,ifw 另外备份在
/sdcard/Android/ifw_backup.xml
- 2017-12-07: 支持直接用 root 权限安装为系统程序
- 2017-12-06: 新增服务搜索功能,正在运行的服务判断更准确
- 2017-12-05: 支持显示已被 MAT 禁用的服务 (显示为红色),和正在运行的服务 (显示为蓝色,
不支持 Android 8)。
- 2017-12-04: 支持屏蔽活动。
安装:
第一次安装:
- 使用 Root 权限: 如果你已经 root,可以先安装 apk 文件,打开 app 后点右上角的齿轮,点“安装为系统程序”选项,选择安装,点确定,然后重启。
- 恢复模式刷入: 如果你的手机没有 root,但已经解锁而且刷了第三方 recovery (比如 TWRP),可以在 Github 页面下载 appopsx.zip,然后刷入即可。
以后升级:
Github 页面直接下载 AppOpsX.apk,然后跟普通程序一样手动安装即可。
卸载:
Github 页面下载 uninstaller.zip 后刷入。或者也可以在 app 的设置里面用 root 权限卸载,重启后再卸载 app 本身即可。
用法:
长按应用列表可以显示服务列表,点击开关即可实时开启和禁用服务 (正在运行的 App 要在完全关闭后台才能生效)。点右上角齿轮可以切换成广播/活动,三个点里面有选项可以显示全称。
权限管理和 AppOpsX 一样,短按应用列表即可管理应用权限。这里的权限管理是独立的,跟系统自带的不同,就算系统那里允许了权限,这里如果禁用的话,应用也拿不到权限,专治毒瘤。
注意,权限管理是默认启用的,安装新的 app 会自动屏蔽一些权限。如果不需要这个功能,请在设置里关闭。
备份还原:
程序实时备份 ifw 文件到下面的目录:
/sdcard/Android/data/com.zzzmode.appopsx.sys/files/backup/ifw_backup.xml
如果要还原的话,把你自己的 ifw 文件覆盖上面的文件,然后重新打开程序一次即可;也可以使用设置里的导入功能。
注意:
- 如果程序被不慎清空数据或卸载,这个备份文件也会消失。
- 如果授予了存储权限,ifw 文件还会自动备份到
/sdcard/Android/ifw_backup.xml
。就算不小心卸载或者清空了数据,只要再打开程序会自动还原这个备份。
- 导入功能会覆盖以上两个的备份文件。
- 系统目录下的
/data/system/ifw/ifw.xml
会被程序覆盖,如果你要用自定义的 ifw 文件,需要改成其他名字。
IFW 免 root 更新原理:
这部分主要是给开发者看的,普通用户可以滑稽地跳过。
Android 系统提供了一个 API 可以更新 ifw.xml,system 进程有个 IntentFirewallInstallReceiver 接受 IFW 更新请求。请求的格式可以参见源代码。另外,要发送请求,需要有 UPDATE_CONFIG 权限,这个权限需要是系统应用,所以要安装到 priv-app 目录下。
但是这个 API 还有个限制,每次更新的版本号必须要比之前的大,当前的版本号存储在 /data/system/ifw/metadata 目录下面。为了绕过这个限制,我把这个原本要是目录的 metadata 给强制改成了文件,并且把权限设成了只能 root 修改,这样 system 进程就存不了版本号,默认版本号都是 0。我只要在用 API 的时候把版本号设为 1 就可以每次顺利更新 ifw 文件了。
所以 Logcat 里面可以看到一些 ConfigUpdateInstallReceiver 发出的 "Failed to atomically rename ..." 错误警告。这是因为系统只能更新 ifw 文件但更新不了版本号文件,所以发出了警告,完全可以忽略。