本文转载自: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. 前端传list,springmvc接收list的方法

    handler: function() { var baseCustomerForm = me.getAddBaseCustomerForm().getForm(); var linkStore = ...

  2. python015 Python3 函数

    Python3 函数函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  3. VS Code 列编辑功能说明

    新版本v1.13.1或者附近的版本中的列编辑功能已经调整. 一.多光标插入功能 Alt+鼠标左键,添加多光标输入 二.自由多行选择 Alt键+鼠标左键拖动选择各行的部分内容 三.列选择 Shift+A ...

  4. CodeVs1519 过路费

    题目描述 Description 在某个遥远的国家里,有 n个城市.编号为 1,2,3,…,n.这个国家的政府修建了m 条双向道路,每条道路连接着两个城市.政府规定从城市 S 到城市T需要收取的过路费 ...

  5. 【frameset】frameset设置不能拖动

    <frameset rows='20%,*' >           <!--  row 行 col 列    分行列要为rows  cols  --> <frame s ...

  6. loj6169 相似序列(可持久化线段树)

    题目: https://loj.ac/problem/6169 分析: 如果是要求两段序列全等的话,有一个套路: 对于{a1,a2,a3} {a4,a5,a6} 设一个素数p,那么如果p^a1+p^a ...

  7. EclipseEE的Web开发环境配置(使用Tomcat作为Web服务器)

    进行JavaWeb开发,我们总共需要5个步骤:JDK的安装与配置:Tomcat的安装:EclipseEE的安装与配置:创建工程;编写代码并运行.安装的三个软件在版本和适用构架上要一致.当JDK是32位 ...

  8. java学习(4)——动手动脑

    根据ppt所给的例子,运行的结果如下所示: ppt中出现的第二个动手动脑如下: 代码如下: 其运行结果如下: 作出简单的分析如下:有点类似于if 和else的关系,总是对应try和catch同层中的异 ...

  9. zmq.error.ZMQError: Address already in use

    1.如下代码,启动的时候python app.py会报如题的错误 app.py #!/user/bin python # -*- coding:utf-8 -*- import os from dat ...

  10. 【stl学习笔记】list

    list使用双向链表来管理元素. 与vector.deque的区别: 1.list不支持随机存取,在list中随机遍历任意元素,是很缓慢的行为 2.任何位置上执行元素的安插和移除都非常快,始终是常数时 ...