本文转载自:http://blog.csdn.net/mike8825/article/details/49428417

版权声明:本文为博主原创文章,未经博主允许不得转载。

关于selinux的详细资料,请查阅http://blog.csdn.net/innost/article/details/19299937

在Android开发的过程中,遇到关于selinux相关的东西,当时还一下子看不懂,现在好像有点眉目了。

比如,内核打印这个提示

type=1400 audit(32.939:25): avc: denied { open } for pid=2592 comm="chmod" path="/dev/block/mmcblk0p25" dev="tmpfs" ino=6494 scontext=u:r:init_shell:s0 tcontext=u:object_r:block_device:s0 tclass=blk_file permissive=1

当然,这种信息有时太长了,以致于在minicom中出现了信息丢失的情况,可按参考http://blog.csdn.net/mike8825/article/details/49422727里的方法解决。

我们可以遵循这个方法,从头开始寻找关键对象,然后调整一下顺序,生成一条语句,最后将该语句填写到.te文件(external/sepolicy/*.te)中即可。

denied { open }             u:r:init_shell:s0            u:object_r:block_device:s0       tclass=blk_file

A                               B                                              C                                       D
  
             B                               C                                              D                                       A

allow init_shell  block_device:blk_file open;

这条语句表示允许init_shell域中的block_device进程打开block_device类型的块设备文件。

 

有时候会遇到编译该规则失败,这也许就是neverallow语句做怪了。

neverallow用来检查安全策略文件中是否有违反该项规则的allow语句

如external/sepolicy/netd.te文件中,语句

neverallow netd dev_type:blk_file { read write };

表示永远不允许netd域中的进程读写dev_type类型的块设备文件,这时只需屏蔽该语句即可。

当然,在调试阶段,可在终端上运行如下命令获取SELinux的状态和临时关闭SELinux

setenforce 0                  ##设置SELinux 成为permissive模式(SELinux开启,但对违反selinux规则的行为只记录,不会阻止)

setenforce 1                  ##设置SELinux 成为enforcing模式 (SELinux开启)

getenforce                     ##获取SELinux状态(permissive,enforcing,disabled)

当然,测试的时候也可以在cmdline中加入androidboot.selinux=disabled来关闭selinux

或者到Android源码的根目录下,直接修改system/core/init/init.c文件。

  1. static void selinux_initialize(void)
  2. {
  3. if (selinux_is_disabled()) {
  4. return;
  5. }
  6. INFO("loading selinux policy\n");
  7. if (selinux_android_load_policy() < 0) {
  8. ERROR("SELinux: Failed to load policy; rebooting into recovery mode\n");
  9. android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
  10. while (1) { pause(); }  // never reached
  11. }
  12. selinux_init_all_handles();
  13. bool is_enforcing = selinux_is_enforcing();
  14. INFO("SELinux: security_setenforce(%d)\n", is_enforcing);
  15. security_setenforce(is_enforcing);
  16. }

修改is_enforcing的值(0或者1)。

快速解决Android中的selinux权限问题【转】的更多相关文章

  1. android中获取root权限的方法以及原理(转)

    一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. 二. Root 的介绍 1. Root 的目的 可以让我们拥有 ...

  2. 解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题

    解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题http ...

  3. 如何快速解决myeclipse中导入jquery文件的报错。

    如何快速解决myeclipse中导入jquery文件的报错. 解决: 选中错误的文件, 点击右键, 选中myeclipse,点击Exclude From Validation.

  4. 如何快速排查解决Android中的内存泄露问题

    概述 内存泄露是Android开发中比较常见的问题,一旦发生会导致大量内存空间得不到释放,可用内存急剧减少,导致运行卡顿,部分功能不可用甚至引发应用crash.对于复杂度比较高.多人协同开发的项目来讲 ...

  5. Android 系统添加SELinux权限

    本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=11185476 CPU:RK3288 系统:Android 5.1 SEL ...

  6. 缓存AsimpleCache -- 解决Android中Sharedpreferences无法存储List数据/ASimpleCache

    Sharedpreferences想必大家在项目中都经常会用到,但是如果需要在本地需要存储比较多的数据,存储一个集合的时,发现Sharedpreferences并不 是那么好使了. 分析 如果需要在本 ...

  7. 解决Android中多次点击(快速点击多次 )启动多个相同界面的问题

    通过以下代码可以解决这个问题. /** * 防止快速点击 * @param ev * @return */ @Override public boolean dispatchTouchEvent(Mo ...

  8. 解决Android中多次点击启动多个相同界面的问题

    在Android开发过程中我们经常会碰到这样的问题,当用户点击一个View启动一个新的Activity的时候,如果快速地多次点击就会启动多个相同的界面.虽然说很少会有用户这么玩自己的手机,但是一旦出现 ...

  9. Android中的文件权限操作

    默认本工程创建的文件本工程对其有读写权限. 我们可以通过context.openFileOutput("文件名", 模式): 我们可以创建私有, 共有, 只读, 只写文件, 默认的 ...

随机推荐

  1. 《从零开始搭建游戏服务器》项目管理工具Maven

    简介 什么是Maven?Maven是一个项目管理和综合工具,提供了开发人员构建一个完整的生命周期框架. Maven使用标准的目录结构和默认构建生命周期,在多个开发团队环境时,Maven可以设置按标准在 ...

  2. Codeforces 691F Couple Cover

    可以暴力预处理出每一种小于3000000的乘积有几种.询问的时候可以用总的方案减去比p小的有几种o(1)输出. #pragma comment(linker, "/STACK:1024000 ...

  3. netframework中等待多个子线程执行完毕并计算执行时间

    本文主要描述在.netframework中(实验环境.netframework版本为4.6.1)提供两种方式等待多个子线程执行完毕. ManualResetEvent 在多线程中,将ManualRes ...

  4. spring lifeCycle

    Lifecycle接口定义了每个对象的生命周期.如下 public interface Lifecycle { void start(); void stop(); boolean isRunning ...

  5. 唤醒你的大脑 --- javascript冒泡排序

    var a; a = [1, 2, 3, 11, 55, 5, 0, 44]; (function bubbleSort() { for (var i = 0; i <= a.length - ...

  6. INDY9发送tstream

    INDY9发送tstream 首先都要发送stream.Size, 这是必须的. // 服务端 AThread.Connection.WriteInteger(stream2.Size); AThre ...

  7. Android获取窗口可视区域大小: getWindowVisibleDisplayFrame()

    getWindowVisibleDisplayFrame()方法 getWindowVisibleDisplayFrame()是View类下的一个方法,从方法的名字就可以看出,它是用来获取当前窗口可视 ...

  8. Neural Networks and Deep Learning学习笔记ch1 - 神经网络

    近期開始看一些深度学习的资料.想学习一下深度学习的基础知识.找到了一个比較好的tutorial,Neural Networks and Deep Learning,认真看完了之后觉得收获还是非常多的. ...

  9. mybatis表名反射实体

    package com.eshore.wbtimer.executor.service.impl; import com.baomidou.mybatisplus.mapper.EntityWrapp ...

  10. Headroom.js插件用法

    一.Headroom.js是什么? Headroom.js是一个轻量级.高性能的JS小工具(不依赖不论什么工具库.),它能在页面滚动时做出响应. 此页面顶部的导航条就是一个鲜活的案例,当页面向下滚动时 ...