提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
[四、日常adb 调试技巧](#四、日常adb 调试技巧)
[setenforce 0](#setenforce 0)
[setenforce 1](#setenforce 1)
[Permissive 宽容模式](#Permissive 宽容模式)
[Enforcing 强制模式](#Enforcing 强制模式)
前言
Linux系统底层开发、Android系统开发 绕不开 权限、绕不开 SELinux 权限,这里讲解如何关闭SELinux 权限
一、目的
日常经常用到,特别是项目调试时候能够快速定位;快速验证问题、实现功能,绕开各种权限问题;必备技能知识点。
- 总结知识点、方便后续高效开发
- 日常开发快速验证问题、得出结论、验证功能
二、参考资料
以下提供相关资料参考,主要目的:理解SELinux 权限,当然也只有自己在做系统底层开发工作时候才会更加深刻理解。
Android SELinux权限
Android SELinux权限 _
别再乱加allow了!Android SELinux权限配置避坑指南(附audit2allow实战)
系统端提供Data分区upgrade目录创建-实现OTA功能接口-授权SELinux权限:以前一个功能相关案例,如何配置功能相关的SELinux 权限
三、实现方案
涉及到修改文件
/system/core/init/selinux.cpp
解决方案
在**/system/core/init/selinux.cpp 文件中的 IsEnforcing 方法,直接返回false**
bool IsEnforcing() {
return false;//huanghb add
if (ALLOW_PERMISSIVE_SELINUX) {
return StatusFromProperty() == SELINUX_ENFORCING;
}
return true;
}
四、日常adb 调试技巧
日常调试命令
如下
C:\Users\Administrator>adb shell
k69v1_64_k419:/ $ su
k69v1_64_k419:/ # getenforce
Permissive
k69v1_64_k419:/ # setenforce 0
k69v1_64_k419:/ # getenforce
Permissive
k69v1_64_k419:/ # setenforce 1
k69v1_64_k419:/ # getenforce
Enforcing
k69v1_64_k419:/ # setenforce 0
k69v1_64_k419:/ #
四个关键词含义
getenforce
查看当前 SELinux 工作模式,只会返回两种结果:
Permissive:宽容模式Enforcing:强制模式
setenforce 0
临时设置 SELinux 为 宽容模式 Permissive
setenforce 1
临时设置 SELinux 为 强制模式 Enforcing
Permissive 宽容模式
- SELinux 不拦截、不禁止任何权限违规行为
- 只是把违规行为打印日志(avc:denied) ,但不杀进程、不阻止运行
- 就算权限不够,APP / 二进制照样能跑
- 适合调试 SELinux 权限用
Enforcing 强制模式
- SELinux 真正生效、严格强制权限
- 一旦出现
avc:denied,直接拦截、禁止访问、甚至闪退 / 进程挂掉 - 量产固件默认都是这个模式
命令-结果关键词核心对比表
| 命令 | 含义 | 行为表现 | 适用场景 |
|---|---|---|---|
| setenforce 0 | 设为宽容模式 Permissive | 只记录报错日志,不拦截、不限制权限 | 调试 SELinux、临时绕过权限报错 |
| setenforce 1 | 设为强制模式 Enforcing | 严格权限校验,拒绝违规、拦截、闪退 | 量产正式版本 |
| Permissive | 当前是宽容模式 | 放行所有违规,仅打日志 | 开发调试 |
| Enforcing | 当前是强制模式 | 严格拦截所有 SELinux 权限拒绝 | 正式量产 |
getenforce → Permissive 默认开机就是宽容模式
setenforce 0 → 还是宽容
setenforce 1 → 变成强制模式
setenforce 0 → 又切回宽容
五、实战分析
日志分析
比如如下日志: 只有在开放了SELinux 权限之后,日志中涉及到SELinux 相关的permissive=1 标志位的值才会等于1,关闭SELinux 权限后,标志位permissive 一定等于零,表示拦截掉了。
05-12 14:36:31.376 E/SELinux ( 401): avc: denied { find } for pid=3451 uid=99000 name=content_capture scontext=u:r:isolated_app:s0:c512,c768 tcontext=u:object_r:content_capture_service:s0 tclass=service_manager permissive=1

案例分享
如下都是之前遇到过的相关SELinux 权限知识点,并实际配置 实现相关功能。
系统端提供Data分区upgrade目录创建-实现OTA功能接口-授权SELinux权限 : 涉及到文件相关的SELinux 权限
系统定制服务-IPC实战-系统新增aidl接口-实现自定义系统服务功能 : 涉及到服务文件权限、进程权限等 配置SELinux 权限
六、思考
- 经验分享:快速验证功能,抛开权限来讲,直接关闭SELinux 权限,证明功能是否可用,然后在打开SELinux 针对性的解决各种权限问题。通过代码里面直接关闭,也可以用adb 命令零时关闭
- SELinux 权限问题、分析解决才是核心的技能知识点,这里只是为了高效开发,在国内太多太多绝多数系统开发中是可以打开的。
- SELinux 权限开关是否打开或者关闭:认证的软件特别是产品是国外产品认证基本上不允许关闭的,按照规范来。 国内工控软件、消费级软件 都是可以关闭的。
总结
- 这里只是一个知识点的总结,实际开发中高频配置使用
- 理解并尝试具备SELinux 开发的技能,权限始终贯穿整个开发周期,这个才是核心技能点,需要掌握并理解原理
- 对于新手很难理解,慢慢就理解了