Android11 Wifi Mac地址设置随机或者固定分析

本文对Android11 wifi MAC地址设置是否随机问题进行分析。

文章目录

  • Android11 Wifi Mac地址设置随机或者固定分析
    • 一、前言
    • 二、Android11 修改wifi MAC地址是否随机的关键代码
    • 三、Android11 修改wifi MAC应用端可以操作的事情
      • 1、App中获取Wifi MAC地址代码
      • 2、App代码中设置 Wifi MAC是否随机
    • 四、Android11 修改wifi MAC地址是否随机的分析过程
      • 1、从WifiManager 更新wifi配置信息开始分析:
      • 2、MAC获取过程分析
    • 五、Android11 wifi MAC地址是分析总结

一、前言

Android 8.0 开始,设备开始支持Wifi 随机MAC,说是为了安全。
很多手上也能看到Wifi 默认使用的是随机MAC地址。

但是有些情况下,需要固定MAC,比如有些OTA升级用的是Wifi MAC地址,这时候就要MAC固定。

所以有必要对设备 Wifi MAC地址进行研究。

网上搜索了一下,只有下面这个需要csdn 付费的文章:

https://blog.csdn.net/baidu_41666295/article/details/123014817

上面文章主要修改在下面两个文件:

frameworks/base/core/res/res/values/config.xml
packages/apps/Settings/src/com/android/settings/wifi/WifiConfigController.java

网上这个文章是Android10 的,文件位置和主要逻辑可能在其他版本有一定是变化。
从目前接触的framework 网络部分代码来看,
从Android9到10 ,Android11 到12代码变化挺大,代码位置和逻辑封装都有变化。

所以掌握其中的原理,才能正常进行处理。

下面从Android11 的代码,进行Wifi MAC地址是否随机变化的分析。

二、Android11 修改wifi MAC地址是否随机的关键代码

其实大部分情况就修改一个属性就行

frameworks\opt\net\wifi\service\res\values\config.xml

//WiFi MAC 是否随机设置<!-- Indicates that connected MAC randomization is supported on this device --><bool translatable="false" name="config_wifi_connected_mac_randomization_supported">true</bool>//AP (一般是投屏) MAC 是否随机设置<!-- Indicates that p2p MAC randomization is supported on this device --><bool translatable="false" name="config_wifi_p2p_mac_randomization_supported">false</bool>//AP (一般是热点) MAC 是否随机设置<!-- Indicates that AP mode MAC randomization is supported on this device --><bool translatable="false" name="config_wifi_ap_mac_randomization_supported">true</bool>

config_wifi_connected_mac_randomization_supported 属性值修改为 false ,就是不随机变化了!

有些方案中是,有overlay 属性的,就需要在对应位置配置。

当然也是可以在代码中添加打印查看了属性配置情况。
具体分析在后面。

三、Android11 修改wifi MAC应用端可以操作的事情

1、App中获取Wifi MAC地址代码

    public String getWifiMacAddress() {WifiManager mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);if (mWifiManager.isWifiEnabled()) {WifiInfo mWifiInfo = mWifiManager.getConnectionInfo();return mWifiInfo.getMacAddress();}return "Unavailable";}

2、App代码中设置 Wifi MAC是否随机

    //设置mac是否随机public void updateNetworkRamon(boolean isRandom) {WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);WifiInfo wifiInfo = wifiManager.getConnectionInfo();String curWifiName = wifiInfo.getSSID(); //当前连接的wifi 名称List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();for (WifiConfiguration wifiConfiguration : configuredNetworks) {if (curWifiName.equals(wifiConfiguration.SSID)) {String randomizedMacAddress = wifiConfiguration.getRandomizedMacAddress().toString();int macRandomSetting = wifiConfiguration.macRandomizationSetting;//修改mac是否随机wifiConfiguration.macRandomizationSetting = isRandom? WifiConfiguration.RANDOMIZATION_PERSISTENT //persistent 持续的,表示一直随机的MAC: WifiConfiguration.RANDOMIZATION_NONE; //不随机,表示固定的MAC//update 配置信息wifiManager.updateNetwork(wifiConfiguration);wifiManager.disconnect();}}}

系统虽然暴露了设置是否随机的接口方法,但是设置不一定有用!

为啥没用?因为Wifi 配置管理的代码会优先判断配置属性,决定是否MAC地址随机,所以设置的值不一定起到作用。

//下面这个地址包含了wifi配置信息的管理,比如MAC 地址的重新定义
frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiConfigManager.java代码判断配置属性:R.bool.config_wifi_connected_mac_randomization_supported
如果ture,MAC地址默认随机,这时候通过接口设置MAC是否随机是有作用。
如果false,MAC地址为固定的设备地址,通过接口设置MAC是否随机无作用。
代码后续分析。

从 wifiConfiguration 源码看,里面有设置随机MAC地址的方法,是hide的,应用无法调用,只能系统内部调用。

 wifiConfiguration.setRandomizedMacAddress( MacAddress.fromString("11:22:33:44:55:66"));

但是也可以看出随机MAC 在系统内部是可以控制的。如果要定制成某个MAC地址是可以实现的。

wifiConfiguration 就相当于一个Bean对象,扫描到的wifi列表,每个都有对应的wifiConfiguration 对象。

Android11 中所有的wifi列表配置属性都是保存在文件:

wifi信息保存位置:
/data/misc/apexdata/com.android.wifi/WifiConfigStore.xml热点信息保存位置:
/data/misc/apexdata/com.android.wifi/WifiConfigStoreSoftAp.xml

四、Android11 修改wifi MAC地址是否随机的分析过程

1、从WifiManager 更新wifi配置信息开始分析:

frameworks\base\wifi\java\android\net\wifi\WifiManager.java

WifiManager.updateNetwork(wifiConfiguration);

public int updateNetwork(WifiConfiguration config) {if (config == null || config.networkId < 0) {return -1;}return addOrUpdateNetwork(config);}private int addOrUpdateNetwork(WifiConfiguration config) {try {return mService.addOrUpdateNetwork(config, mContext.getOpPackageName());} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}

frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiServiceImpl.java

  public int addOrUpdateNetwork(WifiConfiguration config, String packageName) {...Log.i("addOrUpdateNetwork", " uid = " + Binder.getCallingUid()+ " SSID " + config.SSID+ " nid=" + config.networkId);return mWifiThreadRunner.call(() -> mWifiConfigManager.addOrUpdateNetwork(config, callingUid, packageName).getNetworkId(),WifiConfiguration.INVALID_NETWORK_ID);}

frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiConfigManager.java

public NetworkUpdateResult addOrUpdateNetwork(WifiConfiguration config, int uid,@Nullable String packageName) {WifiConfiguration existingConfig = getInternalConfiguredNetwork(config);
...NetworkUpdateResult result = addOrUpdateNetworkInternal(config, uid, packageName);if (!result.isSuccess()) {Log.e(TAG, "Failed to add/update network " + config.getPrintableSsid());return result;}WifiConfiguration newConfig = getInternalConfiguredNetwork(result.getNetworkId());sendConfiguredNetworkChangedBroadcast(result.isNewNetwork()? WifiManager.CHANGE_REASON_ADDED: WifiManager.CHANGE_REASON_CONFIG_CHANGE);// Unless the added network is ephemeral or Passpoint, persist the network update/addition.if (!config.ephemeral && !config.isPasspoint()) {saveToStore(true);//保存配置文件到本地}//更新数据到之前的所有监听for (OnNetworkUpdateListener listener : mListeners) {if (result.isNewNetwork()) {listener.onNetworkAdded(createExternalWifiConfiguration(newConfig, true, Process.WIFI_UID));//有修改配置的地方} else {listener.onNetworkUpdated(createExternalWifiConfiguration(newConfig, true, Process.WIFI_UID),createExternalWifiConfiguration(existingConfig, true, Process.WIFI_UID));}}return result;}//返回提供给外部的wifi配置对象private WifiConfiguration createExternalWifiConfiguration(WifiConfiguration configuration, boolean maskPasswords, int targetUid) {WifiConfiguration network = new WifiConfiguration(configuration);if (maskPasswords) {maskPasswordsInWifiConfiguration(network);}if (targetUid != Process.WIFI_UID && targetUid != Process.SYSTEM_UID&& targetUid != configuration.creatorUid) {maskRandomizedMacAddressInWifiConfiguration(network);}//重点:这里可以看到如果不是随机MAC,也就是设置false的情况,无法设置什么参数,最后MAC都是固定的if (!isMacRandomizationSupported()) {network.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE; //固定MAC}return network;}     //判断wifi是否设置随机MACprivate boolean isMacRandomizationSupported() {return mContext.getResources().getBoolean(R.bool.config_wifi_connected_mac_randomization_supported);}

从上面代码可以看到设置 config_wifi_connected_mac_randomization_supported 属性,可以控制是否随机MAC的情况。

R.bool.config_wifi_connected_mac_randomization_supported
如果ture,MAC地址默认随机,这时候通过接口设置MAC是否随机是有作用。
如果false,MAC地址为固定的设备地址,通过接口设置MAC是否随机无作用。

这里每个wifi都有对应的WifiConfiguration 对象,
如果要动态设置全局的Wifi MAC都随机或者固定,可以在 createExternalWifiConfiguration 方法中,添加prop属性,强制修改即可。

另外上面addOrUpdateNetwork代码看,配置的属性是先保存到本地,之后再进行重新复制的,
所以本地保存的配置文件,会与系统上的状态不一致。

2、MAC获取过程分析

 WifiInfo mWifiInfo = mWifiManager.getConnectionInfo();mWifiInfo.getMacAddress();

WifiManager.getConnectionInfo() --> WifiServiceImpl.getConnectionInfo()

 public WifiInfo getConnectionInfo(String callingPackage, String callingFeatureId) {enforceAccessPermission();int uid = Binder.getCallingUid();if (mVerboseLoggingEnabled) {mLog.info("getConnectionInfo uid=%").c(uid).flush();}long ident = Binder.clearCallingIdentity();try {WifiInfo result = mClientModeImpl.syncRequestConnectionInfo();if (hideDefaultMacAddress) {result.setMacAddress(WifiInfo.DEFAULT_MAC_ADDRESS);}
...return result;} finally {Binder.restoreCallingIdentity(ident);}}

frameworks\opt\net\wifi\service\java\com\android\server\wifi\ClientModeImpl.java

//内部类,连接状态机,构造方法中监听class ConnectModeState extends State {@Overridepublic void enter() { //wifi首次连接的情况Log.d(TAG, "entering ConnectModeState: ifaceName = " + mInterfaceName);mOperationalMode = CONNECT_MODE;setupClientMode();...}@Overridepublic boolean processMessage(Message message) {//保存、连接等处理}}/*** Helper method to start other services and get state ready for client mode*/private void setupClientMode() {Log.d(TAG, "setupClientMode() ifacename = " + mInterfaceName);
...//如果MAC随机,就先设置MACif (isConnectedMacRandomizationEnabled()) {mWifiNative.setMacAddress(mInterfaceName, MacAddressUtils.createRandomUnicastAddress()); //获取一个随机MAC地址,每次都是一个随机数}//获取刚才设置的MAC地址,设置到wifi对象中,所以随机MAC属性设置了的情况,获取到的是随机MAC,//未设置的情况,获取的是节点的MAC,是设备的固定MACmWifiInfo.setMacAddress(mWifiNative.getMacAddress(mInterfaceName));
...}//通过配置属性判断是否MAC随机public boolean isConnectedMacRandomizationEnabled() {return mContext.getResources().getBoolean(R.bool.config_wifi_connected_mac_randomization_supported);}

上代码可以看到,wifi 配置获取到后会判断MAC地址是否随机,如果随机随把随机MAC设置到WifiInfo 对象中。

五、Android11 wifi MAC地址是分析总结

wifi 的MAC 地址是可以随机显示或者固定,可以根据需求进行开发设计。

修改:frameworks\opt\net\wifi\service\res\values\config.xml 的
config_wifi_connected_mac_randomization_supported 属性值修改为 false ,Wifi MAC地址不随机变化了!

如果要固定wifi MAC地址进行定制设计,可以在 WifiConfigManager.java中进行。

ps:无论是wifi MAC还是有线MAC/设备MAC都是6位的用冒号隔开的字符串类似: 02:ad:36:01:09:74

Android11 Wifi Mac地址设置随机或者固定分析相关推荐

  1. mac地址修改_快速更改WiFi MAC地址

    想要快速修改自己的Mac地址吗?这里为大家推荐一款特别好用的修改工具,这款WiFiSpoof for Mac能够快速生成随机的Mac地址,这款生成的这些地址会每隔30分钟随机改变,可以将这些地址在工作 ...

  2. WIFI MAC地址规则常见问题(WIFI MAC)

    在日常问题中,常常会遇到一些问题,部分问题可能有MAC地址设置有关 WIFI MAC 地址共分为 3 种,分别为单播 MAC 地址.组播 MAC 地址.广播 MAC 地址 制造商在生产制造网卡之前,必 ...

  3. 如何正确获取 wifi mac地址

    获取wifi mac地址 今日研读讯飞 AIUI SDK 对其工具类的实现 进行一下简单记录 正式版本中使用的功能 值得我们借鉴 getWifiMac 为每一个设备设置对应唯一的SN(最好使用设备硬件 ...

  4. rk3399 9.0 AP6356 自定义WIFI MAC地址

    功能:使用客户自定义的MAC地址 rk3399 9.0 系统之后不再使用drmboot.ko,直接可以读取vendor分区数据. 1.使用RKDevInfoWriteTool_Setup_V1.0.3 ...

  5. Android10 WIFI MAC地址获取流程

    这里以QCS8250平台为例. Wi-Fi MAC地址的获取流程位于:vendor/qcom/opensource/wlan/qcacld-3.0/core/hdd/src/wlan_hdd_main ...

  6. adb 获取蓝牙 mac地址 、wifi mac地址的方法

    获取蓝牙 mac地址 adb shell settings get secure bluetooth_address 要么 adb shell service call bluetooth_manag ...

  7. android获取wifi mac地址吗,Android 获取WIFI MAC地址的方法

    1. 经常用法,调用Android的API:WifiManager WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SER ...

  8. 【瑞芯微Rockchip Linux平台】SoftAp需求实现(2)根据传参修改SSID和密码,SSID以wifi MAC地址后四位对结尾

    [瑞芯微Rockchip Linux平台]SoftAp需求实现(2)根据传参修改SSID和密码 1. main 函数实现 2. set_hostap_ssid 函数,配置修改hostapd.conf文 ...

  9. Wi-Fi MAC 地址随机化与人群监控

    文章目录 摘要 1 简介 2 相关工作 3 MAC地址随机化对行人计数的影响 3.1 分析 4 系统模型 4.1 目前的人群监控系统 4.2 处理随机 MAC 地址 4.3 讨论 5 实验 5.1 实 ...

最新文章

  1. 使用amaze ui的分页样式封装一个通用的JS分页控件
  2. Internet Explorer 8 Beta 2十大看点
  3. C#开发C/S结构如何通信的问题?
  4. android6鼠标驱动,USB鼠标按键驱动(示例代码)
  5. neo4j设置节点或者边的显示,包括颜色、属性、大小
  6. js cookies 存数组_用一个例子理解JS函数的底层处理机制
  7. 八位图 16位图_了解位图
  8. zincrby redis python_【Redis数据结构 序】使用redis-py操作Redis数据库
  9. js对象数组计算总计_如何计算数组中的对象
  10. [bzoj2242] [SDOI2011]计算器
  11. iOS 列表三级展开
  12. 搞定分布式系列:缓存 热key 问题解决方案
  13. 【数据结构与算法】删除线性表中的零元素
  14. 为什么需要 Mini-batch 梯度下降,及 TensorFlow 应用举例
  15. java 对 Map的遍历
  16. ON在电子计算机上是什么键,计算机on是什么键
  17. 区块链3.0在2018年爆发?不要讲颠覆世界的故事,耐心做好区块链应用……
  18. 比较一下 Spring Security 和 Shiro 各自的优缺点
  19. mingw c语言编译器集合,MinGW-GNU工具集合-MinGW下载 v5.1.6官方版-完美下载
  20. 腾讯云从业者认证报名官网地址

热门文章

  1. 2020年Java开发工程师面试问题
  2. MySQL关键词和保留词
  3. lisp捕捉垂足_AutoLISP目标捕捉函数osnap
  4. 枪火游侠显示无法连接服务器,枪火游侠游戏登录不了怎么解决 进不去游戏
  5. FLASH ActionScript运行时错误列表
  6. 用树莓派纯手工打造车载车牌识别检测系统,家用车秒变智能车!
  7. 在手机端浏览器模拟F12(实用小工具)
  8. 苹果分屏功能怎么用?教你一键开启iPad分屏
  9. 面试总结应届生必须在学校就找好工作不然你会后悔的
  10. Android的一生