MTK Android11获取真实wifi mac地址

文章目录

读取MAC地址的问题

开发了system系统应用,读取到的mac地址与真实写入的不对应。

尝试的方法

  1. 读取 /sys/class/net/wlan0/address 发现不对。
  2. 通过WifiManager读取不对。
java 复制代码
 WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        try {
            mac = wifi.getConnectionInfo().getMacAddress();
        } catch (Exception e) {
            e.printStackTrace();
        }

不对的原因

  1. Android 10+ 引入了 Wi-Fi 随机化(MAC randomization)机制;
  2. Wi-Fi HAL / driver 层可能默认启用了随机 MAC;
  3. 即使是系统应用,若未正确配置权限或未关闭随机化,也无法获取真实 MAC。

在设置中,连接的wifi详情中可以看到有标注 MAC是随机的:

在关于中可以查看真实的MAC地址:

获取真实MAC地址

某些产商的Android高版本,可以通过读取 /sys/class/net/wlan0/address来实现,但有些则不行。

目标:自开发的 system 应用在 MTK Android 11 上获取 真实(烧录)的 Wi-Fi MAC 地址

通过在设备中查找,找到此文件

复制代码
/mnt/vendor/nvdata/APCFG/APRDEB/WIFI

在linux系统上打印WIFI的十六进制:

可以看到开关几个字节数据

而我们真实的MAC地址是a4:3f:51:5d:90:67,所以我们可以从第5个字节开始

读取该二进制文件的6 字节;

按大端顺序 解析为标准 MAC 地址格式。

不同的MTK可能存储方式不同,有些开始偏移是从0开始,有些是按小端顺序存储的。

java 复制代码
    /**
     * 从 MTK NVRAM WIFI 文件 offset=4 开始读取 6 字节,
     */
    public static String readRealWifiMacFromNv() {
        final String WIFI_NV_PATH = "/mnt/vendor/nvdata/APCFG/APRDEB/WIFI";
        File file = new File(WIFI_NV_PATH);
        if (!file.exists()) {
            android.util.Log.e("MacReader", "WIFI NVRAM file not found: " + WIFI_NV_PATH);
            return null;
        }

        RandomAccessFile raf = null;
        try {
            raf = new RandomAccessFile(file, "r");
            if (raf.length() < 10) {
                android.util.Log.e("MacReader", "WIFI file too short: " + raf.length());
                return null;
            }

            raf.seek(4); // 跳过 header
            byte[] rawBytes = new byte[6];
            int bytesRead = raf.read(rawBytes);
            if (bytesRead != 6) {
                android.util.Log.e("MacReader", "Failed to read 6 bytes for MAC");
                return null;
            }

            // 检查是否全零
            boolean allZero = true;
            for (byte b : rawBytes) {
                if (b != 0) {
                    allZero = false;
                    break;
                }
            }
            if (allZero) {
                android.util.Log.w("MacReader", "MAC is all zeros!");
                return null;
            }

            // 格式化为标准 MAC 字符串
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < rawBytes.length; i++) {
                if (i > 0) sb.append(':');
                sb.append(String.format("%02X", rawBytes[i] & 0xFF));
            }

            String macStr = sb.toString();
            android.util.Log.d("MacReader", "Real Wi-Fi MAC (after word swap): " + macStr);
            return macStr;

        } catch (IOException e) {
            android.util.Log.e("MacReader", "IO error reading NVRAM WIFI file", e);
            return null;
        } finally {
            if (raf != null) {
                try {
                    raf.close();
                } catch (IOException ignored) {}
            }
        }
    }

就算是system_app系统应用,读取nvdata下文件selinux也会拦截的:

复制代码
W  type=1400 audit(0.0:22891): avc: denied { search } for name="/" dev="mmcblk0p6" ino=2 scontext=u:r:system_app:s0:c512,c768 tcontext=u:object_r:nvdata_file:s0 tclass=dir permissive=0
W  type=1400 audit(0.0:22892): avc: denied { search } for name="/" dev="mmcblk0p6" ino=2 scontext=u:r:system_app:s0:c512,c768 tcontext=u:object_r:nvdata_file:s0 tclass=dir permissive=0

需要修改system_app.te绕过去,

MTK修改

复制代码
device/mediatek/sepolicy/bsp/non_plat/system_app.te

添加

xml 复制代码
allow system_app nvdata_file:dir rw_dir_perms;
allow system_app nvdata_file:file {create open read write getattr};

为什么android中要禁止上层应用获取真实的wifi地址

Android 禁止上层应用(非系统 / 特权应用)获取真实 WiFi MAC 地址,核心是隐私保护为首要目标,同时兼顾设备安全、合规要求和系统生态管控,这一限制从 Android 10(API 29)开始全面落地,后续版本持续强化。

Android Framework专栏

Android Framework专栏链接

部分内容如下:

作者:帅得不敢出门

相关推荐
阿巴斯甜6 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker6 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95277 小时前
Andorid Google 登录接入文档
android
黄林晴9 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab21 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android