Android为何不再让App读取MAC地址?CatShare用Shizuku+AIDL绕过限制的完整方案
【免费下载链接】CatShare类原生 & 海外设备,现已加入互传联盟。项目地址: https://gitcode.com/gh_mirrors/ca/CatShare
🐱CatShare是一款面向 Android 的类原生跨品牌"互传"文件分享工具,现已加入互传联盟协议生态。由于 Android 10 起系统禁止普通 App 读取 MAC 地址,而互传联盟恰恰需要 MAC 地址做设备认证,CatShare 巧妙地借助Shizuku + AIDL组合绕过了这一限制。本文将讲清楚:系统为什么要封 MAC、CatShare 是怎么绕的、以及你如何三步开启这个功能。
一、为什么 Android 不再让 App 读 MAC 地址?
从 Android 6.0 开始系统就逐步收紧了硬件标识符的访问,到Android 10(API 29)彻底封死:普通第三方应用调用WifiInfo.getMacAddress()只会拿到02:00:00:00:00:00这样的假值。
背后的原因很简单:
- 🔒隐私保护:MAC 地址出厂即固定、无法重置,厂商和 App 可以借此在用户不知情时做跨应用、跨时间的追踪;
- 🎭防指纹定位:MAC 是天然的"设备指纹",与 IMEI、序列号一起构成了设备追踪的基础设施。
系统只对自身进程和系统级应用(各品牌的系统互传 App)保留真实的 MAC 读取能力。这也正是第三方"互传"类应用最大的拦路虎。
二、互传联盟为什么离不开 MAC 地址?
CatShare 支持小米、OPPO/一加、vivo 等品牌的系统互传协议,让非系统应用也能与这些设备互传文件。
问题在于:互传联盟协议把设备 MAC 地址当作认证信息的一部分,接收方要用它校验"对面是不是同一台设备"。普通 App 拿不到真实 MAC,认证就过不去——这不是 App 能"装一装"糊弄过去的,因为协议要求的是物理网卡的真实地址。
CatShare 的答案是:换一条有权限的路把 MAC 读出来。
项目截图
三、CatShare 的破解思路:Shizuku 提供权限,AIDL 跨进程读取
整个方案可以拆成两层,非常经典:
1️⃣ Shizuku:让应用"借用"系统级权限
Shizuku 是一个开源工具,它把一部分系统权限"租借"给已授权的应用使用(通过 ADB 授权或免 root 方式启动)。CatShare 在 MainActivity.kt 中监听了 Shizuku 的 Binder 状态:
- 当 Shizuku 可用且用户授权后,CatShare 会创建一个运行在 Shizuku 进程内的用户服务;
- 该服务拥有
LOCAL_MAC_ADDRESS这个系统级权限的访问路径,可以读取真实网卡地址。
2️⃣ AIDL:定义跨进程接口,按需取 MAC
跨进程怎么调?答案是AIDL(Android Interface Definition Language)。CatShare 在app/src/main/aidl/moe/reimu/catshare/IMacAddressService.aidl中定义了一个极简接口:
getP2pMacAddress()—— 直接取 Wi-Fi Direct(互传通道)所用网卡的 MAC;getMacAddressByName(String name)—— 按网卡名取任意 MAC,互传场景固定读p2p0网卡。
服务端实现在 MacAddressService.kt:遍历NetworkInterface列表,找到p2p0后把hardwareAddress转成xx:xx:xx:xx:xx:xx格式返回。就这么几行代码,却是整个方案的钥匙。🔑
四、调度中枢:ShizukuUtils 如何"无缝降级"
真正聪明的设计在 ShizukuUtils.kt:
| 场景 | 行为 |
|---|---|
系统已授予LOCAL_MAC_ADDRESS | 直接本地读取,完全不依赖 Shizuku |
| 未授权 | 绑定 Shizuku 用户服务,通过 AIDL 远程取 MAC |
| 服务尚未绑好 | 等待最长 20 秒,期间自动完成绑定 |
调用方只需一行ShizukuUtils.getMacAddress(context, "p2p0") { ... },底层是"直读还是跨进程"对它完全透明。发送文件时 P2pSenderService.kt 会用取到的 MAC 做设备标识,拿不到就兜底用02:00:00:00:00:00。
五、三步开启:Shizuku 授权配置指南
- 安装 Shizuku:从应用商店安装 Shizuku 并保持运行(需通过 ADB 或无线调试方式启动一次);
- 在 CatShare 主页授权:打开 CatShare,主页会显示 Shizuku 状态卡片,点击它弹出授权请求,选择"允许";
- 验证状态:卡片出现 ✅(
ic_done)即表示可用;此时发起文件互传,CatShare 会自动读取p2p0网卡 MAC 完成互传联盟认证。
💡 提示:如果你的系统已直接授予
LOCAL_MAC_ADDRESS权限,CatShare 会自动走本地直读路径,Shizuku 卡片可直接忽略。
六、常见问题 FAQ
Q1:不用 Shizuku 能收能发吗?接收没问题;发送文件需要 Shizuku(发送端要提供真实 MAC 认证)。
Q2:Shizuku 授权后重启还有效吗?Shizuku 本身需要保持运行(建议在其设置中开启自启动/后台白名单),授权结果会被记住,无需重复点"允许"。
Q3:这个方案会被 Android 未来版本废掉吗?LOCAL_MAC_ADDRESS是系统签名权限,Shizuku 走的是系统服务通道,与厂商系统互传 App 获取 MAC 的机制同源,稳定性取决于 Shizuku 生态的维护。
结语
CatShare 展示了一个教科书式的组合拳:Shizuku 解决"权限从哪来",AIDL 解决"怎么跨进程拿",让第三方应用第一次能完整接入互传联盟协议。如果你想深入了解各品牌兼容情况与日志抓取方法,可以看看项目里的 README.md;本地克隆源码阅读:
git clone https://gitcode.com/gh_mirrors/ca/CatShare希望这篇指南帮你理解了 Android MAC 地址限制的来龙去脉,也祝你互传顺利!📁
【免费下载链接】CatShare类原生 & 海外设备,现已加入互传联盟。项目地址: https://gitcode.com/gh_mirrors/ca/CatShare
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考