允许安卓应用访问 /proc/stat

 

背景

Android 8.0更新后,/proc/stat的访问被限制,因此带来很多不便。对我来说,主要是以下两点:

  1. AccuBattery等监测CPU各核心使用情况的软件无法(完全)正常工作
  2. Termux中的Python中的psutil尝试访问/proc/stat,导致终端产生如下的大段警告信息(严格来讲,是不影响主程序的报错)
Traceback (most recent call last):
  File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/psutil/_common.py", line 399, in wrapper
    return cache[key]
KeyError: (('/proc',), frozenset())

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/psutil/_pslinux.py", line 285, in <module>
    set_scputimes_ntuple("/proc")
  File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/psutil/_common.py", line 401, in wrapper
    ret = cache[key] = fun(*args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/psutil/_pslinux.py", line 268, in set_scputimes_ntuple
    with open_binary('%s/stat' % procfs_path) as f:
  File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/psutil/_common.py", line 728, in open_binary
    return open(fname, "rb", buffering=FILE_READ_BUFFER_SIZE)
PermissionError: [Errno 13] Permission denied: '/proc/stat'

一般的解决方式执行是setenforce 0,也就是关闭SELinux,但这在我看来太暴力了不安全且影响应用正常运行

因此,本文使用Magisk注入一条SELinux规则,允许访问/proc/stat

做法(二选一即可)

模块

成品(推荐)

可以在这里直接下载、刷入。

手动编辑

创建模块、定位目录等见上篇博文,这里不再赘述

找到模块目录后,若没有sepolicy.rule,则新建

sepolicy.rule中加入如下一行:

allow * proc_stat file { open read getattr }

magiskpolicy(临时)

执行以下这条即可。

magiskpolicy --live "allow * proc_stat file { open read getattr }"

其中--live表示立即生效,因此不需重启即可看到效果,但重启后失效。不加--live貌似没有任何效果

关于*

为什么是*?根据相关注释,用户的应用(目前)根据targetSdkVersion分为 untrusted_app,untrusted_app_25,untrusted_app_27三类(安卓5以上才有untrusted_app_25,安卓8及以上才有untrusted_app_27),但我懒得分别写,所以就这样吧。 要是你觉得这不好,也可以把*换成{ untrusted_app untrusted_app_25 untrusted_app_27 },直观效果是一样的。

以下是分别替换后的版本:

allow { untrusted_app untrusted_app_25 untrusted_app_27 } proc_stat file { open read getattr }
magiskpolicy --live "allow { untrusted_app untrusted_app_25 untrusted_app_27 } proc_stat file { open read getattr }"

参考资料

Developer Guides | Magisk

Android : SELinux 简析&修改 - sheldon_blogs - 博客园