【Android 11】AOSP Settings WIFI随机MAC地址功能

AOSP Settings WIFI随机MAC地址功能

背景

最近客户提出了想要实现随机WIFIMAC地址的功能(我们默认WIFI的MAC地址是固定的)。网上搜到了一篇不错的文章,本次改动也是基于这个来写的。
由于客户指定使用的settings是AOSP的,所以在AOSP Settings上改动。
看了一下,其实Amlogic提供的settings在这部分的代码量少多了。更好修改。
Android11 Wifi Mac地址设置随机或者固定分析_android11 获取wifi mac-CSDN博客

一、配置文件属性决定全局开启/关闭WIFI随机MAC

如果是需要固定死开启/关闭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>

不过这样做只能定死,不能随用户心情改动。
这个文件一旦编译完成就不可以更改。
因此需要把这个判断逻辑改掉,不用它判断。

二、修改判断逻辑为prop属性

由于我们要新增加一个prop属性,所以写属性的读取属性的方法都要写。

frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java
这个函数是判断资源文件中是否随机WIFI MAC的位置

/*** Helper method to check if Connected MAC Randomization is supported - onDown events are* skipped if this feature is enabled (b/72459123).** @return boolean true if Connected MAC randomization is supported, false otherwise*/
public boolean isConnectedMacRandomizationEnabled() {return mContext.getResources().getBoolean(                    R.bool.config_wifi_connected_mac_randomization_supported);
}

我们将其修改成判断prop属性:

--- a/frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java
+++ b/frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -153,6 +153,7 @@ import java.util.List;import java.util.Set;import java.util.concurrent.atomic.AtomicBoolean;import java.util.concurrent.atomic.AtomicInteger;
+import android.os.SystemProperties;@@ -210,6 +211,7 @@ public class ClientModeImpl extends StateMachine {protected void log(String s) {Log.d(getName(), s);}
+    private static final String PROP_MAC_RANDOMIZATION = "persist.mac_randomization_enabled";private final WifiMetrics mWifiMetrics;private final WifiInjector mWifiInjector;private final WifiMonitor mWifiMonitor;
@@ -3334,8 +3336,7 @@ public class ClientModeImpl extends StateMachine {public boolean isConnectedMacRandomizationEnabled() {
-        return mContext.getResources().getBoolean(
-                R.bool.config_wifi_connected_mac_randomization_supported);
+           return SystemProperties.getBoolean(PROP_MAC_RANDOMIZATION, false);}

还有一个地方也涉及到随机WIFI MAC的判断

--- a/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConfigManager.java
+++ b/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConfigManager.java
@@ -75,6 +75,7 @@ import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;
+import android.os.SystemProperties;@@ -329,6 +330,7 @@ public class WifiConfigManager {private final NetworkListSharedStoreData mNetworkListSharedStoreData;private final NetworkListUserStoreData mNetworkListUserStoreData;private final RandomizedMacStoreData mRandomizedMacStoreData;
+    private static final String PROP_MAC_RANDOMIZATION = "persist.mac_randomization_enabled";@@ -645,10 +647,10 @@ public class WifiConfigManager {* Returns whether MAC randomization is supported on this device.* @param config* @return
+     * modified by zhangt 2024.02.19*/private boolean isMacRandomizationSupported() {
-        return mContext.getResources().getBoolean(
-                R.bool.config_wifi_connected_mac_randomization_supported);
+           return SystemProperties.getBoolean(PROP_MAC_RANDOMIZATION, false);}

我是在同时修改上面两处内容后才成功的。

三、在WIFI 详细内容界面增加Switch开关用来开启关闭该功能

packages/apps/Settings/res/xml/wifi_network_details_fragment2.xml
--- a/packages/apps/Settings/res/xml/wifi_network_details_fragment2.xml
+++ b/packages/apps/Settings/res/xml/wifi_network_details_fragment2.xml
@@ -83,6 +83,12 @@android:summary="@string/wifi_subscription_summary"settings:allowDividerAbove="true"/>+    <SwitchPreference
+        android:key="random_mac_address_switch"
+        android:title="@string/random_mac_address_title"
+        android:summary="@string/random_mac_address_summary"
+        android:defaultValue="false" />
+

这里WIFI 详细内容界面的xml文件是上面这个。
然后我们要在这个界面的具体逻辑代码中进行实现。

--- a/packages/apps/Settings/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java
+++ b/packages/apps/Settings/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java
@@ -55,6 +55,10 @@ import java.time.Clock;import java.time.ZoneOffset;import java.util.ArrayList;import java.util.List;
+import android.os.SystemProperties;
+import androidx.preference.SwitchPreference;
+import androidx.preference.Preference;
+import android.os.Bundle;@@ -75,6 +79,12 @@ public class WifiNetworkDetailsFragment2 extends DashboardFragment implements// Interval between initiating SavedNetworkTracker scansprivate static final long SCAN_INTERVAL_MILLIS = 10_000;+    private WifiManager wifiManager;
+    private SwitchPreference randomMacAddressPreference;
+
+    private static final String PROP_MAC_RANDOMIZATION = "persist.mac_randomization_enabled";
+
+@VisibleForTestingNetworkDetailsTracker mNetworkDetailsTracker;private HandlerThread mWorkerThread;@@ -134,6 +145,25 @@ public class WifiNetworkDetailsFragment2 extends DashboardFragment implementssuper.onCreateOptionsMenu(menu, inflater);}+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        wifiManager = (WifiManager) requireContext().getSystemService(Context.WIFI_SERVICE);
+        randomMacAddressPreference = findPreference("random_mac_address_switch");
+
+        if (randomMacAddressPreference != null) {
+        randomMacAddressPreference.setChecked(isMacRandomizationSupported());
+            randomMacAddressPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object newValue) {
+                    boolean isWifiMacRandomEnabled = (boolean) newValue;
+                    setRandomMacAddress(isWifiMacRandomEnabled);
+                    return true;
+                }
+            });
+        }
+    }
+@Overridepublic boolean onOptionsItemSelected(MenuItem menuItem) {switch (menuItem.getItemId()) {
@@ -218,6 +248,15 @@ public class WifiNetworkDetailsFragment2 extends DashboardFragment implementsreturn mControllers;}+    private void setRandomMacAddress(boolean isWifiMacRandomEnabled) {
+        SystemProperties.set(PROP_MAC_RANDOMIZATION, Boolean.toString(isWifiMacRandomEnabled));
+    }
+
+    private boolean isMacRandomizationSupported() {
+        return SystemProperties.getBoolean(PROP_MAC_RANDOMIZATION, false);
+    }
+

在代码中搜索的时候我发现有WifiNetworkDetailsFragment2.javaWifiNetworkDetailsFragment.java两个差不多的文件,根据验证我的是WifiNetworkDetailsFragment2.java

  1. 这里我首先添加了setRandomMacAddress和isMacRandomizationSupported方法,用来写入和读取prop属性。
  2. 然后在onCreate方法中获取到我们新建的自动连接Switch按钮与属性相绑定。如果没有改属性则写入属性。
  3. 最后在开关的事件监听中改变属性值

四、最终现象

  • 默认的效果是WIFI MAC不随机。
  • 在点开我们新加的Switch前也是没有prop属性的。
  • 在打开开关后,新连接的WIFI的MAC地址会随机掉。
  • 在关掉开关后,所有的WIFI MAC地址会变成一样的。

注意,如果你随机到新MAC之后关闭这个开关,那么所有的WIFI MAC都会变成你新随机到的这个,而不是出厂默认MAC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/705747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对数据结构的初步认识

前言: 牛牛开始更新数据结构的知识了.本专栏后续会分享用c语言实现顺序表,链表,二叉树,栈和队列,排序算法等相关知识,欢迎友友们互相学习,可以私信互相讨论哦! &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&a…

dash shell 和 zsh shell 简单介绍

一、dash shell dash shell不能识别bash shell的所有脚本编程功能 dash shell支持expr命令和双圆括号方法&#xff0c;但不支持方括号方法。 bash shell的test命令允许你使用双等号()来测试两个字符串是否相等。这是为了照顾习惯在其他编程语言中使用这种格式的程序员而加上去…

【简写Mybatis】02-注册机的实现以及SqlSession处理

前言 注意&#xff1a; 学习源码一定一定不要太关注代码的编写&#xff0c;而是注意代码实现思想&#xff1a; 通过设问方式来体现代码中的思想&#xff1b;方法&#xff1a;5W1H 源代码&#xff1a;https://gitee.com/xbhog/mybatis-xbhog&#xff1b;https://github.com/xbh…

%00截断 [GKCTF 2020]cve版签到

打开题目 F12之后在Headers中发现hint 两者结合利用零字符截断使get_headers()请求到本地127.0.0. 结合链接 构造 ?urlhttp://127.0.0.1%00www.ctfhub.com 必须以123结尾 ?urlhttp://127.0.0.123%00www.ctfhub.com 得到flag 知识点&#xff1a; PHP中get_headers函数 g…

解析ChatGPT Plus相比chatgpt3.5有哪些优势

「ChatGPT Plus」提供更出色的对话体验和更广泛的应用能力&#xff0c;学生可以用来写作、职场人也可以用来写计划书、策划书等等&#xff0c;并且问它一些问题比搜索引擎好用多了简直。但普通人使用起来有一点门槛&#xff0c;并且升级4.0也难住了许多爱好者。 ChatGPT主要功能…

【Excel PDF 系列】EasyExcel + iText 库

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录 前言转换前后效果引入 pom 配置代码实现定义 ExcelDataVo 对象主方法EasyExcel 监听器 前言 最近遇到生成 …

微信小程序蓝牙通信HC08

总结这两天研究的蓝牙串口。人话版资料不多&#xff0c;主要靠翻别人的仓库和文档。 单片机部分&#xff0c;与蓝牙串口通信是通过串口。比我想的要简单&#xff0c;小程序部分&#xff0c;有非常多的服务和特征&#xff0c;而且人话版资料不多。 如果本文有什么问题&#xf…

代理模式(Proxy Pattern)

定义 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;其目的是为其他对象提供一个代理或占位符&#xff0c;以控制对这个对象的访问。代理类通常在客户端和目标对象之间起到中介的作用&#xff0c;用于控制对目标对象的访问&#xff0c;并在必…

Kafka是如何保证消息不丢失

Apache Kafka通过多种机制来确保消息不丢失&#xff0c;包括数据复制&#xff08;Replication&#xff09;、持久化&#xff08;Persistence&#xff09;、确认机制&#xff08;Acknowledgments&#xff09;、幂等生产者&#xff08;Idempotent Producer&#xff09;、事务性发…

AI绘画工具合集,让想象触手可及!

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

【JS】【Vue3】【React】获取鼠标位置的方法:JavaScript、Vue 3和React示例

目录 使用JavaScript原生方法在Vue 3中获取鼠标位置在React中获取鼠标位置 随着Web应用程序的复杂性不断增加&#xff0c;获取用户交互信息变得越来越重要。其中&#xff0c;获取鼠标位置是一项常见的任务&#xff0c;可以用于实现各种交互效果&#xff0c;如拖拽、悬停提示等。…

通过curl 请求接口 /usr/bin/curl: Argument list too long

因为要发送的json数据为图片的base64码&#xff0c;使用该命令时提示参数过长&#xff0c;解决方法使用如下命令 curl -X POST -d data.json http://example.com/api 将要发送的报文体放入data.json 然后执行 使用来从文件中读取数据而不是直接在命令行上写入大量数据 示例&…

【目标检测新SOTA!v7 v4作者新作!】YOLO v9 思路设计 + 全流程优化 + 手把手训练自己数据

YOLO v9 思路复现 全流程优化 手把手训练自己数据 提出背景&#xff1a;深层网络的 信息丢失、梯度流偏差YOLO v9 设计逻辑可编程梯度信息&#xff08;PGI&#xff09;&#xff1a;使用PGI改善训练过程广义高效层聚合网络&#xff08;GELAN&#xff09;&#xff1a;使用GELAN…

java面试:分布式事务理论基础(CAP原理、BASE理论、本地事务)

文章目录 引言I 基础知识1.1 事务(Transaction)1.2 本地事务1.3 分布式事务II 分布式理论2.1 CAP原理2.2 BASE理论2.3 刚柔事务2.4 解决分布事务模型2.5 2PC2.6 3PC2.7 TCC(Try-Confirm-Cancel)补偿事务引言 分布式事务:实现跨服务事务回滚,需要用到分布式事务。

华为数通方向HCIP-DataCom H12-821题库(单选题:481-500)

第481题 以下关于基于SD-WAN思想的EVPN互联方案的描述,错误的是哪一项? A、通过部署独立的控制面,将网络转发和控制进行了分离,从而实现了网络控制的集中化 B、通过对WAN网络抽象和建模,将上层网络业务和底层网络具体实现架构进行解耦,从而实现网络自动化 C、通过集中的…

四、分类算法 - 决策树

目录 1、认识决策树 2、决策树分类原理详解 3、信息论基础 3.1 信息 3.2 信息的衡量 - 信息量 - 信息熵 3.3 决策树划分的依据 - 信息增益 3.4 案例 4、决策树API 5、案例&#xff1a;用决策树对鸢尾花进行分类 6、决策树可视化 7、总结 8、案例&#xff1a;泰坦尼…

深度学习手写字符识别:推理过程

说明 本篇博客主要是跟着B站中国计量大学杨老师的视频实战深度学习手写字符识别。 第一个深度学习实例手写字符识别 深度学习环境配置 可以参考下篇博客&#xff0c;网上也有很多教程&#xff0c;很容易搭建好深度学习的环境。 Windows11搭建GPU版本PyTorch环境详细过程 数…

stable diffusion学习笔记 手部修复

图片手部修复原理 某张图片在生成后&#xff0c;仅有手部表现不符合预期&#xff08;多指&#xff0c;畸形等&#xff09;。这种情况下我们通常使用【局部重绘】的方式对该图片的手部进行【图生图】操作&#xff0c;重新绘制手部区域。 但是仅采用重绘的方式也很难保证生成的…

python爬虫实战:获取电子邮件和联系人信息

引言 在数字时代&#xff0c;电子邮件和联系人信息成为了许多企业和个人重要的资源&#xff0c;在本文中&#xff0c;我们将探讨如何使用Python爬虫从网页中提取电子邮件和联系人信息&#xff0c;并附上示例代码。 目录 引言 二、准备工作 你可以使用以下命令来安装这些库&a…

将文件从windows传入到ubuntu

实现效果图 2.方法&#xff1a; 2.1打开 Ubuntu 的终端窗口&#xff0c;然后执行如下命令来安装 FTP 服务 输入&#xff1a;sudo apt-get install vsftpd 等待软件自动安装&#xff0c;安装完成以后使用如下 VI 命令打开/etc/vsftpd.conf&#xff0c;命令如下&#xff1a;su…