Android5.1修改以太网MAC地址(SElinux)【转】
本文转载自: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)【转】的更多相关文章
- 怎么修改电脑MAC地址 电脑MAC地址修改图文教程
本文转载:http://www.45fan.com/a/Router/2677.html MAC地址是指电脑网卡的硬件地址,此地址一般烧录在网卡上.MAC地址工作在OSI七层模型的第二层,即数据链接层 ...
- Linux 下修改网卡MAC地址
Linux下修改网卡MAC地址 by:授客 QQ:1033553122 例子:修改网卡接口eth0的mac地址 #停用网卡接口,比如eth0 # ifconfig eth0 down #编辑对应的网卡 ...
- linux/Centos下查看和修改网卡Mac地址(ifconfig命令)
本文转载自http://www.169it.com/article/14360294838474691537.html linux/Centos下查看网卡Mac地址,输入命令: #ifconfig - ...
- Centos下查看和修改网卡Mac地址
linux/Centos下查看网卡Mac地址,输入命令: #ifconfig -a eth0 Link encap:Ethernet HWaddr 00:e4:56:2E:D8:20 00:e4:56 ...
- 修改网卡MAC地址后出现问题:device eth0 does not seem to be present, delaying initialization
修改网卡MAC地址后出现问题:device eth0 does not seem to be present, delaying initialization 1.修改网卡对应的文件,将配置文件中 ...
- 以太网MAC地址组成与交换机基本知识
以太网MAC地址 MAC地址由48位二进制组成,通常分为六段,用十六进制表示,工作在数据链路层. 数据链路层功能: 链路的建立,维护与拆除 帧包装,帧传输,帧同步 帧的差错恢复 简单的流量控制 第八位 ...
- 以太网MAC地址规范
原文地址:http://blog.csdn.net/skyflying2012/article/details/40322563 之前一段时间在做网卡驱动的工作,现在产品量产,利用ifconfig e ...
- vmware克隆centos修改linux mac地址
故障背景: 在vmware workstation中了完全克隆了一个已经存在的centos的虚拟机,启动之后发现网卡没有启动.于是重启一下network服务,发现提示错误信息“Device eth0 ...
- linux 下修改网关mac地址
以rtl8196e为例 eth0:mac 地址设为123456789012 # flash set hw_nic0_addr 123456789012 eth1:mac 地址设为1122334455 ...
随机推荐
- 在Ubuntu 16.04 LTS上用g++和gcc编译C/C++代码错误提示“.../x86_64-linux-gnu/crt1.o: ELF section name out of range”
(有一些图片我是直接从个人的CSDN博客上复制来的) 最近一个多月来,我曾经多次尝试在Ubuntu 16.04 LTS上使用g++和gcc(这俩好像合起来叫MinGW?)来编译C/C++代码,但是在解 ...
- luogu3563 逛公园
两遍 spfa 然后建立分层图拓扑排序 dp 一下. 写得很差劲.效率很低. 时间复杂度 \(\mathrm{O}(Tnk)\). 参见这里秒懂. #include <iostream> ...
- python004 Python3 解释器
Python3 解释器Linux/Unix的系统上,一般默认的 python 版本为 2.x,我们可以将 python3.x 安装在 /usr/local/python3 目录中.安装完成后,我们可以 ...
- 谁才是最强战舰!-From 南京理工大学第八届程序设计大赛(校外镜像),博弈~~
谁才是最强战舰! Time Limit: 1000MS Memory Limit: 65536KB Description 依阿华来到镇守府的第一件事情,就是找大和solo!然而这并不是什么好消息,说 ...
- 1013. Battle Over Cities (25)(DFS遍历)
For example, if we have 3 cities and 2 highways connecting city1-city2 and city1-city3. Then if city ...
- poj 3417 Network 题解
题意: 先给出一棵树,然后再给出m条边,把这m条边连上,然后剪掉两条边,一条是原边,一条是新边,问有多少种方案能使图不连通. 思路: 从原边的角度看 1.树加边,一定成环,加一条(u,v)边就有u-& ...
- [codeforces538D]Weird Chess
[codeforces538D]Weird Chess 试题描述 Igor has been into chess for a long time and now he is sick of the ...
- lightoj 1293 - Document Analyzer [ 两指针 + 字符串 ]
传送门 1293 - Document Analyzer PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: ...
- gerrit ssh 登陆设置
[root@web ~]# cat ~/.ssh/config Host gerrit User deploy-gerrit Port Hostname gerrit.demo.com Identit ...
- msp430入门编程44
msp430中C语言的人机交互--菜单交互方式