【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.java
和WifiNetworkDetailsFragment.java
两个差不多的文件,根据验证我的是WifiNetworkDetailsFragment2.java
。
- 这里我首先添加了setRandomMacAddress和isMacRandomizationSupported方法,用来写入和读取prop属性。
- 然后在onCreate方法中获取到我们新建的自动连接Switch按钮与属性相绑定。如果没有改属性则写入属性。
- 最后在开关的事件监听中改变属性值
四、最终现象
- 默认的效果是WIFI MAC不随机。
- 在点开我们新加的Switch前也是没有prop属性的。
- 在打开开关后,新连接的WIFI的MAC地址会随机掉。
- 在关掉开关后,所有的WIFI MAC地址会变成一样的。
注意,如果你随机到新MAC之后关闭这个开关,那么所有的WIFI MAC都会变成你新随机到的这个,而不是出厂默认MAC
相关文章:
【Android 11】AOSP Settings WIFI随机MAC地址功能
AOSP Settings WIFI随机MAC地址功能 背景 最近客户提出了想要实现随机WIFIMAC地址的功能(我们默认WIFI的MAC地址是固定的)。网上搜到了一篇不错的文章,本次改动也是基于这个来写的。 由于客户指定使用的settings是AOSP的,所以在…...
dmrman备份还原
脱机还原工具-dmrman 前言 根据达梦官网文档整理 一、概述 DMRMAN 命令行设置参数执行又可分为命令行指定脚本、命令行指定语句两种执行方式。 指定语句 $ DMRMAN RMAN>BACKUP DATABASE/dmdata/data/DAMENG/dm.ini;指定脚本 创建一个名为 cmd_file.txt 的文件&#x…...
网页403错误(Spring Security报异常 Encoded password does not look like BCrypt)
这个错误通常表现为"403 Forbidden"或"HTTP Status 403",它指的是访问资源被服务器理解但拒绝授权。换句话说,服务器可以理解你请求看到的页面,但它拒绝给你权限。 也就是说很可能测试给定的参数有问题,后端…...
单细胞多组学整合与对齐的计算方法
Computational Methods for Single-cell Multi-omics Integration and Alignment Bioinformatics-2022-密西根大学 关键词:单细胞;多组学;机器学习;无监督学习;集成 摘要 最近发展起来的生成单细胞基因组数据的技术在生物学领域产生了革命性的影响。多组学测定提…...
33.openeuler OECA认证模拟题16
一 、选择题 1.如何查看系统支持的 shell? A、cat /etc/passwd B、cat /etc/shells C、echo SSHELL D、echo $0 答案 :B 2.下列哪项不是 shell的功能? A 、 用户界面,提供用户与内核交互接口 B 、 命令解释器 C 、提供编译环境 D 、 提供各种管理工具,…...
javaScript数组去重的几种实现方式——适用非引用数据去重
最传统的使用循环遍历 //最传统的使用循环遍历 function getUnique(arr) {let newArr [];for (let i 0; i < arr.length; i) {for (let j i 1; j < arr.length; j) {if (arr[i] arr[j]) {i; //相同丢掉前面的元素}}newArr.push(arr[i]);}return newArr; } 利用Set实…...
Nexus Repository Manager
Nexus Repository Manager https://s01.oss.sonatype.org/#welcome https://mvnrepository.com/-CSDN博客...
Python世界之运算符
一、算术运算符 以下假设变量: a10,b20: 运算符 描述 实例 加 - 两个对象相加 a b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结…...
蓝桥杯倒计时47天!DFS基础——图的遍历
倒计时47天! 深度优先搜索——DFS 温馨提示:学习dfs之前最好先了解一下递归的思想。 DFS基础——图的遍历 仙境诅咒 问题描述 在一片神秘的仙境中,有N位修仙者,他们各自在仙境中独立修炼,拥有自己独特的修炼之道…...
体验LobeChat搭建私人聊天应用
LobeChat是什么 LobeChat 是开源的高性能聊天机器人框架,支持语音合成、多模态、可扩展的(Function Call)插件系统。支持一键免费部署私人 ChatGPT/LLM 网页应用程序。 地址:https://github.com/lobehub/lobe-chat 为什么要用Lobe…...
ClickHouse 指南(三)最佳实践 -- 主键稀疏索引
在ClickHouse主索引的实用介绍 ClickHouse release 24.1, 2024-01-30 1、简介 在本指南中,我们将深入研究ClickHouse索引。我们将详细说明和讨论: ClickHouse中的索引与传统的关系数据库管理系统有何不同ClickHouse是如何构建和使用表的稀疏主索引的什么是在Clic…...
【Nginx】Nginx配置反向代理 和 https
nginx.conf配置 进入linux /etc/nginx/ 打开nginx.conf 进行以下配置 http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {#监听443端口listen 443 ssl;#你的域名server_name huiblog.top;#ssl证书的pe…...
ChatGPT第七讲
ChatGPT为什么会被热炒? 2023年上半年,ChatGPT引起了广泛的热议,对于ChatGPT有多热,不需要我重复了,你可能在网上看到了很多报道,标题如《ChatGPT揭开AI战幔:杀死黄页一样摧毁Google?…...
Chapter 2 of Effective C++ (构造/析构/赋值运算)
条款06:了解C默默编写并调用哪些函数 Know what functions C silently writes and calls 编译器会为空类生成一个copy构造函数、copy assignment操作符和一个析构函数。此外如果你没有声明任何构造函数,它也会生成一个默认构造函数。 (对C1…...
Android学习笔记 service启动方式
在Android系统中,Service的启动方式主要有两种: ## 1. startService 这种方式用于启动一个服务执行后台任务,不进行通信。当你调用startService()方法启动服务后,服务会一直无限期运行下去,只有在外部调用了stopServi…...
Redis 工具类 与 Redis 布隆过滤器
Redis 工具类 1. 核心依赖 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>com.google.guava…...
自定义el-upload 上传文件
前言 最近在做一个文件上传的功能,后端接口写好了、发现前端上传文件的页面不会写……(我很笨的)然后我就找啊找发现element有个组件是<el-upload/>能直接上传文件。我就想直接用拿来改改改成自己想要的,可是就是这样我花了…...
LeetCode69. x 的平方根(C++)
LeetCode69. x 的平方根 题目链接代码 题目链接 https://leetcode.cn/problems/sqrtx/description/ 代码 class Solution { public:int mySqrt(int x) {int right x, left 0, ans -1;while(left < right){long long mid left (right - left) / 2;if(mid * mid <…...
[c++] 单例模式 + cyberrt TimingWheel 单例分析
单例模式要求一个类在一个进程中只能创建一个对象。比如 cyberrt 中的 TimingWheel 类就是单例模式,这个类管理着一个进程内的所有定时器,只需要一个对象就可以。 单例模式的实现有两种方式,懒汉式和饿汉式。懒汉式,当第一次使用…...
如何在cmd里面创建一个vue项目
在命令提示符(CMD)中创建一个Vue项目,你需要先确保你已经全局安装了Vue CLI(Vue的命令行工具)。如果你还没有安装Vue CLI,可以通过以下命令进行安装: bash复制代码 npm install -g vue/cli # O…...
Day2 JS基础
2.1 运算符 赋值运算符 一元运算符 -- <script>let h20let kh hconsole.log(h) //22console.log(k) //42let i1console.log(i i i) //7 // 递增运算符:var a8aconsole.log(a) //9 var num10var bnumconsole.log(b) //10</script> 比较运…...
mybatis----有用配置知识归纳(狂神说学习总结)
1.mybatis介绍 MyBatis 是一款优秀的持久层框架MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类映射成数据库中的记录 官网 Mybatis中文官方文档 : https…...
【TCP/IP】组播
一、组播介绍 组播(Multicast)是网络技术中数据传输的一种方法,它允许将数据包同时发送给一组指定的目标,而不是单个的目标(单播 Unicast)或所有可能的目标(广播 Broadcast)。组播传…...
java 内存模型
程序计数器 线程私有主要字节码解释器通过读取程序计数器来选取下一条需要执行的指令,比如分支,循环,跳转和异常处理如果执行的是java 方法,那么程序计数器记录的时候虚拟机字节码指令的地址,如果执行的是native 方法…...
Linux——缓冲区封装系统文件操作
📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、FILE二、封装系统接口实现文件操作1、text.c2、mystdio.c3、mystdio.h 一、FILE 因为IO相…...
深度学习系列59:文字识别
1. 简单文本: 使用google加的tesseract,效果不错。 首先安装tesseract,在mac直接brew install即可。 python调用代码: import pytesseract from PIL import Image img Image.open(1.png) pytesseract.image_to_string(img, lan…...
学习JAVA的第七天(基础)
目录 static 静态变量 静态方法 工具类: static的注意事项 继承 继承的好处 继承的特点 方法的重写 书写格式 override重写注解 方法重写的要求 this关键字 super关键字 static static表示静态,是Java中的一个修饰符,可以修饰成…...
GoLand 相关
goland 下载依赖 go mod tidy:保持依赖整洁 go mod tidy 命令的作用是清理未使用的依赖,并更新 go.mod 以及 go.sum 文件。 go mod tidy 和 go mod vendor 两个命令是维护项目依赖不可或缺的工具。go mod tidy 确保了项目的 go.mod 文件精简且准确&…...
顶顶通呼叫中心中间件-如何使处于机器人话术中的通话手动转接到坐席分机上
文章目录 前言联系我们实现步骤freeswitch命令转接api接口转接 前言 本文讲解呼叫中心中间件如何手动转接通话。 场景:利用自动外呼进入机器人,在通话过程中,转接到坐席分机上。 联系我们 有意向了解呼叫中心中间件的用户,可以点…...
RabbitMQ开启MQTT协议支持
1)RabbitMQ启用MQTT插件 rootmq:/# rabbitmq-plugins enable rabbitmq_mqtt Enabling plugins on node rabbitmq: rabbitmq_mqtt The following plugins have been configured:rabbitmq_managementrabbitmq_management_agentrabbitmq_mqttrabbitmq_web_dispatch Ap…...
网站地图怎么做/网页模板下载
最近在用virtual box做实验,在设置中提示“需要禁用硬件虚拟化才能启动虚拟机”,确认按钮灰色,并且无法启动虚拟机。 于是重启,进到bios系统。 网上说按F2或者根据电脑上的提示再开机的时候一直按就能进入,我没进去。…...
dw动态网站怎么做搜索框/常见的网络营销方式有哪些
只要能存储数据的器件都可以称之为存储器,它的含义覆盖了寄存器,缓存,内存,硬盘。 cpu访问快慢的速度依次为:寄存器-> 缓存->内存->硬盘 寄存器(register)是中央处理器的组成部分,是…...
网站建设的流程推广方案/成品ppt网站国外
硬件环境介绍:最近花了两周终于建成了Hyper-V Failover Clustering,多数时间基本上用在了去了解HP的刀片服务器及VC模块配置,由于是第一次使用所以去查询了很多文档,经过此次部署也对HP的刀片服务器有了点基本了解。先介绍下所使用…...
wordpress主题大前端dux去授权/免费网站制作成品
什么是守护线程 守护线程的作用是为用户线程提供服务的,且仅在用户线程运行时才需要。当所有用户线程完成执行后,JVM就会终止,也就是说,守护线程会自动退出。但是守护线程并不是 100% 不能阻止 JVM 退出的。守护线程中设计不良的…...
成都住房和城乡建设局网站/百度统计数据分析
ecshop2.7的版权耍了一下花样,不能按以前的方式清除了,不过只要是源码就有可以清除的办法。其实也很简单,方法如下:themes\default\library\page_footer.lbi 文件(default是你的模板文件夹),找到下面一行 {foreach f…...
免费做三级网站/百度学术论文查重免费
循环扇在美国是一个比较常见的家电产品,它的作用是通过循环空气来改善室内空气流通,使室内温度更加舒适。对于循环扇,美国人关注的主要点是性能、价格、耐用性和使用便捷性。 在性能方面,美国人更加关注循环扇的效率和噪音水平。他…...