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

这篇具有很好参考价值的文章主要介绍了Android11 Wifi Mac地址设置随机或者固定分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android11 Wifi 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是否设置随机MAC
    private 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 {

        @Override
        public void enter() { //wifi首次连接的情况
            Log.d(TAG, "entering ConnectModeState: ifaceName = " + mInterfaceName);
            mOperationalMode = CONNECT_MODE;
            setupClientMode();
 ...
        }

		@Override
        public 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随机,就先设置MAC
        if (isConnectedMacRandomizationEnabled()) {
            mWifiNative.setMacAddress(mInterfaceName, MacAddressUtils.createRandomUnicastAddress()); //获取一个随机MAC地址,每次都是一个随机数
        }
		//获取刚才设置的MAC地址,设置到wifi对象中,所以随机MAC属性设置了的情况,获取到的是随机MAC,
		//未设置的情况,获取的是节点的MAC,是设备的固定MAC
        mWifiInfo.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文章来源地址https://www.toymoban.com/news/detail-415396.html

到了这里,关于Android11 Wifi Mac地址设置随机或者固定分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Android11 有线网和wifi优先级设置

    Android6.0之后系统中优先级设置都是根据Score分值来设置优先级,分值0-100,数值越高,越优先。 系统默认分值: 手机网络设置都有自己的Factory设置类,都继承自NetworkFactory.java wifi网络设置类:WifiNetworkFactory.java packages/modules/Wifi/service/java/com/android/server/wifi/WifiNetworkFactory.java

    2024年02月09日
    浏览(9)
  • 【QCA6174】QCA6174 5G WiFi 52信道检测到雷达之后,手动设置36信道会自动跳到48信道或者其他信道问题分析

           QCA6174 5G WiFi 52信道检测到雷达之后,手动设置36信道会自动跳到48信道,手动固定信道也会跳转,正常36信道为非dfs雷达信道,手动固定信道应该正常才对。在52信道没有检测到雷达之前,设置固定信道是正常的,但是检测到雷达之后,发现固定信道也会出问题

    2024年02月12日
    浏览(7)
  • Android 11.0 以太网设置默认静态ip地址

    在11.0的系统rom开发过程中,在进行以太网产品开发的过程中,有功能要求设置默认静态ip地址的功能,不使用动态ip, 方便ip地址管理所以就需要熟悉以太网的ip设置流程,然后设置对应的ip地址就可以了

    2024年02月16日
    浏览(35)
  • GB28181监控视频统一汇聚平台LiveGBS将海康大华华为宇视等厂家监控设备统一接入后如何生成固定播放链接或者固定的流地址可以直接无插件播放或者拉取

    GB28181监控视频统一汇聚平台LiveGBS将海康大华华为宇视等厂家监控设备统一接入后如何生成固定播放链接或者固定的流地址可以直接无插件播放或者拉取

    目前汇聚各种厂家监控设备的视频汇聚平台,基本都是通过GB28181标准协议实现的。下面介绍下LiveGBS Web无插件直播的GB28181视频平台将各厂家(包括海康、大华、华为、宇视、天地伟业等)监控汇聚到同一个服务器上后,如何或者直播链接可以直播浏览器播放,或者二次开发嵌

    2024年02月10日
    浏览(12)
  • 有ip地址为什么要mac地址,或者说没有mac地址可以吗?

    有ip地址为什么要mac地址,或者说没有mac地址可以吗?

    前言:         首先明确一个问题:IP地址是IP协议的一个点标识,MAC地址也只是MAC子层的一个链路层标识。IP协议与MAC协议是分属两层的,功能是不冲突的,主要问题是IP地址和MAC地址是否可以统一使用一个标识。此文仅讨论在一般以太网中的场景。        我们知道IP协议

    2024年02月09日
    浏览(11)
  • 虚拟机设置固定ip地址

    虚拟机设置固定ip地址

    1.将虚拟机的网络适配器的网络连接模式设置为NAT模式。 2.编辑虚拟机网络  3.用root账号登录(否则权限不够),修改linux系统网络配置信息  在终端输入命令:vim /etc/sysconfig/network-scripts/ifcfg-eth0 编辑配置文件后保存退出,然后执行命令:service network restart 重启网络服务  4

    2024年02月15日
    浏览(11)
  • CentOS 7设置固定IP地址

    CentOS 7设置固定IP地址

      当我们安装了一个虚拟机或者装了一个系统的时候,经常会遇到需要设置固定ip的情况,本文就以Centos 7为例,讲述如何修改固定IP地址。 如上图所示,我们就会看到我们目前使用的网卡名称 用vim打开网卡地址文件/etc/sysconfig/network-scripts/ifcfg-XXX,其中XXX就是上一步查询到

    2024年02月08日
    浏览(10)
  • ubuntu设置固定ip地址的方法

    ubuntu设置固定ip地址的方法

    检查了数据库的连接信息后,发现并没有问题,然后去虚拟机上查看ip地址,发现是ip地址发生了变化,下面教大家如何设置固定的ip地址。 首先在虚拟机命令行终端输入: ifconfig ,将你的网关和ip记录下来。 输入 netstat -rn 查看网关: 可以看到我这里网关名是: ens33 网关i

    2024年02月03日
    浏览(6)
  • Vmware 设置固定ip地址--桥接模式

    Vmware 设置固定ip地址--桥接模式

    前言: 若虚拟机没有设置固定ip地址,每次关机重启后都会更新ip地址。导致连接工具得跟着一起修改,每次修改很烦。 之前使用NAT模式,因为使用此模式后,每次打开网页都会转几秒钟后才会显示网页。所以才使用桥接模式,记录分享。 1 首先打开Vmware,打开虚拟网络编辑器

    2024年02月09日
    浏览(11)
  • 如何设置本地连接ip 本机固定IP地址设置方法

    本地IP怎么设置?很多配置路由器的时候有时候找不到192.168.1.1就是因为本地固定ip地址有问题,这个时候就需要我们设置本地固定ip地址了,近日又有不少网友向编辑问这个问题,今天yii666编辑专门针对本地连接ip设置做详细介绍,方便大家查找。 其实需要设置本地IP一般是在

    2024年02月05日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包