本文转载自:http://blog.csdn.net/LoongEmbedded/article/details/71477203

最近高通平台Android5.1项目中有个关于设置以太网MAC的需求,大致流程是windows写到一块flash片区去保存序列号和以太网MAC地址,然后Android客户端通过相关接口去读取该字符串并加以显示,需要将其MAC地址同步到Android系统中MAC地址。

首先我加了个设备信息显示序列号和以太网的应用程序,通过LOCAL_JAVA_LIBRARIES加载所需要加载的相关接口库,然后再manifest中通过<uses-library></uses-library>加载相关声明(注:此声明在application节点下)。这样一来我们的应用层可以正常读取相关flash片区的保存的内容了。

那么后面问题来了,我们如何同步Android系统内的保存的以太网的MAC地址呢?通过网上查询相关资料文献发现,我们可以通过执行相关Linux命令得到结果。通过串口执行相关命令发现如下命令是可以有效的修改Android5.1的/sys/class/net/eth0/address内保存的地址的:

netcfg(ifconfig) eth0 down

netcfg eth0 hwaddr 10:10:10:10:10:10

netcfg(ifconfig) eth0 up

所以通过增加Java代码执行这三条命令即可:

private void executeCMD(String cmd){
try {
           Log.w(TAG, "cmd= " +cmd);
           Runtime runtime = Runtime.getRuntime();
           Process proc = runtime.exec(cmd);
       } catch (IOException e) {
           Log.w(TAG, "exe fail!!!!");
           e.printStackTrace();
       }
}

我们依次执行上述三条linux命令应该就可达到我们的需求。Okay,基本逻辑已经完成,下面进入调试阶段,笔者调试的是项目中的产品MSM8909 Android5.1的一款平板电脑。当我们编译结束后,通过运行应用程序查看日志发现我们的应用确实已经读取到了保存的序列号和MAC地址,可是后面设置系统MAC地址时报了Permission Denied!那么这样一来,就进入了Android权限的赋予和调试的阶段。首先,我们需要给我们的apk是system apk,于是我将其放到系统/system/app下,后面运行发现仍然报IOExeption:Permission Denied!那么后面我在manifest中加入了android:sharedUserId="android.uid.system"让其运行的进程uid为system,然后需要给其签名platform证书,我也对其进行了相关的签名。后面抱着满满的信息去调试的时候发现又有新的权限异常,后面便进入了Adnroid5.1引入的SElinux相关的权限调试当中,过滤有效日志如下:

avc: denied { net_admin } for capability=12 scontext=u:r:system_app:s0 tcontext=u:r:system_app:s0

tclass=capability permissive=0

如此avc权限问题一般都是selinux相关的问题所在,selinux中我们的解决思路就是缺什么权限我们就加什么权限,这样至少不会导致权限的乱序了。关于selinux的赋权都在源码目录/external/sepolicy/文件下进行代码编辑,下面我们顺藤摸瓜找到我们的system_app的权限配置文件(system_app.te),加上对日志的理解我们尝试着加入为我们的apk赋权的语句:

allow system_app system_app:capability { net_admin };

对于此语句的语法我们可以网上百度或者参照原本有的内容进行理解,allow后面跟的几个参数分别是scontext(表示一个group),后面跟上需要为此组所添加的权限,分别是tcontext和tclass和权限的名称(关于权限的分类我们可以参考out/target/product/msm8909/obj/ETC/sepolicy_intermediates/policy.conf相关即可。好了,做完这步我们需要重新编译内核bootimage进行烧写。抱着满满的自信心进行编译,结果发现天哪竟然编译不过,看看服务器报的错误信息发现,也就是说在app.tc中不允许添加类似的capability相关类的权限,我们进入app.tc中发现如下语句:

neverallow { appdomain -bluetooth } self:capability *;

初步的理解是绝不能允许appdomain除了是bluetooth group的,而我们的system_app.tc中恰好定义了appdomain,那么我们大胆的理解我们可以在app.tc中将我们的group也加进去就行啦。于是就有下面的修改:

neverallow { appdomain -bluetooth -system_app} self:capability *;

Okay , 大功告成,再次对内核进行编译。哈哈,竟然编译通过了,这时候感觉比之前的每次调试都更加信心满满了。拷贝出bootimage后进行烧录,重启,运行,查看日志,netcfg查看以太网MAC地址。哈哈,Android系统的MAC地址已经改为我所读出来的MAC地址了,此项需求圆满结束!

通过此次的需求变更,这让我对Android5.1的SElinux又有了更加深层次的认识了。遇到问题,不慌不忙,我们慢慢的分析问题,定位问题,解决问题(离不开对日志的重要信息的提取和理解)。

Android5.1修改以太网MAC地址(SElinux)【转】的更多相关文章

  1. 怎么修改电脑MAC地址 电脑MAC地址修改图文教程

    本文转载:http://www.45fan.com/a/Router/2677.html MAC地址是指电脑网卡的硬件地址,此地址一般烧录在网卡上.MAC地址工作在OSI七层模型的第二层,即数据链接层 ...

  2. Linux 下修改网卡MAC地址

    Linux下修改网卡MAC地址 by:授客 QQ:1033553122 例子:修改网卡接口eth0的mac地址 #停用网卡接口,比如eth0 # ifconfig eth0 down #编辑对应的网卡 ...

  3. linux/Centos下查看和修改网卡Mac地址(ifconfig命令)

    本文转载自http://www.169it.com/article/14360294838474691537.html linux/Centos下查看网卡Mac地址,输入命令: #ifconfig - ...

  4. Centos下查看和修改网卡Mac地址

    linux/Centos下查看网卡Mac地址,输入命令: #ifconfig -a eth0 Link encap:Ethernet HWaddr 00:e4:56:2E:D8:20 00:e4:56 ...

  5. 修改网卡MAC地址后出现问题:device eth0 does not seem to be present, delaying initialization

    修改网卡MAC地址后出现问题:device eth0 does not seem to be present, delaying initialization   1.修改网卡对应的文件,将配置文件中 ...

  6. 以太网MAC地址组成与交换机基本知识

    以太网MAC地址 MAC地址由48位二进制组成,通常分为六段,用十六进制表示,工作在数据链路层. 数据链路层功能: 链路的建立,维护与拆除 帧包装,帧传输,帧同步 帧的差错恢复 简单的流量控制 第八位 ...

  7. 以太网MAC地址规范

    原文地址:http://blog.csdn.net/skyflying2012/article/details/40322563 之前一段时间在做网卡驱动的工作,现在产品量产,利用ifconfig e ...

  8. vmware克隆centos修改linux mac地址

    故障背景:  在vmware workstation中了完全克隆了一个已经存在的centos的虚拟机,启动之后发现网卡没有启动.于是重启一下network服务,发现提示错误信息“Device eth0 ...

  9. linux 下修改网关mac地址

    以rtl8196e为例 eth0:mac 地址设为123456789012 # flash set hw_nic0_addr  123456789012 eth1:mac 地址设为1122334455 ...

随机推荐

  1. js总结(三):面向对象,prototype ,oo模拟

    http://aralejs.org/class/docs/competitors.html http://javascript.crockford.com/prototypal.html proto ...

  2. loadrunner使用随机值

    用户登录设置:系统用1000000001.1000000002等可以登录系统,这个代表登录的用户名

  3. python蛋疼的编码decode、encode、unicode、str、byte的问题都在这了

    相信很多人和我一样,被python蛋疼的编码问题纠缠不清,比如下面的 私以为出现这种错误的原因还是对一些基本的编解码概念不够熟悉,下面就说说我的理解: 首先python刚出来的时候unicode还没有 ...

  4. Trac常用插件描述! - wang_xf的Study home - 博客频道 - CSDN.NET

    Trac常用插件描述! - wang_xf的Study home - 博客频道 - CSDN.NET

  5. SQL Server 2008 R2 安装时提示“Reporting Services目录数据库文件存在”

    打开MSSQL数据库管理系统的安装目录,例如: X:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA. 其中 X:\ ...

  6. Linux信号通讯编程

    信号通讯流程为: ①进程A/内核选择信号 ②发送信号 ③进程B接收信号并处理 Linux系统支持的全部信号均定义在/usr/include/asm/signal.h.当中常见的信号有: ①SIGKIL ...

  7. (转)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现

     转载:http://www.cnblogs.com/felixYeou/archive/2008/08/27/1277250.html 快速导航 一. 回顾历史二. 智能指针简介三. Delphi中 ...

  8. Office WORD如何输入长下划线

    选中一段文字,点击下划线按钮,可以添加下划线   同样,选中一段空格,点下划线,也可以添加下划线    

  9. fedora下安装xdot和objgraph

    前提:安装好了python 1.先下载xdot-0.6.tar.gz和objgraph-1.8.0-py27-none-any.whl,你也可以在官网上下载其他版本. 2.下载完后,解压. 3.打开终 ...

  10. 爬取指定网页的源代码显示在GUI中

    建立一个GUI图形界面用来用来输入网址和代码显示的区域 #encoding=utf-8 __author__ = 'heng' #创建一个可以抓取输入网址源代码的GUI from urllib2 im ...