【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…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
