tags: [Android, Magisk, SELinux] title: 允许安卓应用访问 /proc/stat last_modified_at: 2022-12-21 slug: allow-proc-stat redirect_from:
Android 8.0更新后,/proc/stat
的访问被限制,因此带来很多不便。对我来说,主要是以下两点:
/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,但这在我看来<del>太暴力了</del>不安全且影响应用正常运行
因此,本文使用Magisk注入一条SELinux规则,允许访问/proc/stat
可以在这里直接下载、刷入。
创建模块、定位目录等见上篇博文,这里不再赘述
找到模块目录后,若没有sepolicy.rule
,则新建
在sepolicy.rule
中加入如下一行:
allow * proc_stat file { open read getattr }
执行以下这条即可。
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 }"