Android5.1修改以太网MAC地址(SElinux)
来源:互联网 发布:java executor 线程池 编辑:程序博客网 时间:2024/06/06 13:10
点击打开链接
最近高通平台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)
- Android5.1修改以太网MAC地址(SElinux)
- 修改以太网mac地址
- android5.1 以太网启动已经修改为静态IP
- 获取以太网MAC地址
- Android5.1以太网相关记录
- 以太网MAC地址获得 android
- MAC地址,ARP协议,以太网
- Android 修改 以太网 IP地址
- 修改Android5.1源码,配置以太网设置默认为静态ip
- Android 以太网MAC地址,wifiMAC地址
- 修改MAC地址 (苹果电脑)
- android如何获取以太网mac地址
- linux下读取以太网mac地址:
- Android 获取以太网Mac地址和IP地址
- 修改 Mac 的 MAC 地址
- mac 上修改mac地址
- Mac OS修改Mac地址
- 每天一个算法: 全排列算法
- 如何让编码更加的标准
- js数组与 json 的区别
- 文件IO编程四
- 【网络基础】为什么要对url进行encode呢?
- Android5.1修改以太网MAC地址(SElinux)
- CRC校验在线工具
- 【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库
- 大数据和机器学习等基本概念
- Unity3D学习(一)井字棋
- iOS图片压缩处理
- js获取web应用的根目录上下文
- Android中ConstraintLayout使用
- extjs combobox setValue 显示问题