Nrfr
🌍 免 Root 的 SIM 卡国家码修改工具,让你的网络更自由


Nrfr 是一款强大的 SIM 卡国家码修改工具,无需 Root 权限即可修改 SIM 卡国家码。本项目完全基于 Android 系统原生 API 实现,不依赖 Xposed、Magisk 等任何第三方框架,仅通过调用系统级接口实现功能。通过修改国家码,你可以:
- 🌏 解锁运营商限制,使用更多本地功能
- 🔓 突破某些区域限制的应用和服务
- 🛠️ 解决国际漫游时的兼容性问题
- 🌐 帮助使用海外 SIM 卡获得更好的本地化体验
- ⚙️ 解决部分应用识别 SIM 卡地区错误的问题
📱 使用案例
运营商配置优化
- 手机无法正确识别运营商配置
- 某些运营商特定功能无法使用
- 网络配置与当地运营商不匹配
运营商参数适配
- 运营商功能配置不完整
- 网络参数与运营商默认配置不匹配
- 运营商特定服务无法正常启用
漫游网络识别
- 漫游时运营商名称显示异常
- 网络配置与漫游地运营商不匹配
- 运营商特定功能无法使用
TikTok 区域限制解除
- TikTok 网络错误
- 无法正常使用 TikTok 的完整功能
Samsung Health 区域限制解除
- 无法通过 Samsung Health 的首次 SIM 卡检测
- 无法同步健康数据
- 无法正常使用 Samsung Health 的完整功能
你可以:
- 使用 Nrfr 修改 SIM 卡国家码为支持的地区(如 JP、US 等)
- 重新打开 TikTok,就可以正常使用了
💡 实现原理
Nrfr 通过调用 Android 系统级 API(CarrierConfigLoader)修改系统内的运营商配置参数,而不是直接修改 SIM 卡。这种实现方式:
- 完全在系统层面工作,不会对 SIM 卡本身进行任何修改或造成损坏
- 仅改变系统对 SIM 卡信息的读取方式
- 基于 Android 原生 API 实现,不依赖任何第三方框架(如 Xposed、Magisk 等)
- 通过 Shizuku 仅提供必要的权限支持
- 所有修改都是可逆的,随时可以还原
✨ 特性
- 🔒 安全可靠
- 无需 Root 权限
- 不修改系统文件
- 不影响系统稳定性
- 不会对 SIM 卡造成任何影响
- 🔄 功能完善
- 支持随时还原修改
- 支持双卡设备,可分别配置
- 一次修改永久生效,重启后保持
- 🚀 简单易用
- 一键启动工具
- 智能检测设备和 SIM 卡状态
- 自动安装所需应用
- 简洁优雅的用户界面
- 轻量且高效,安装包体积小
⚠️ 注意事项
- 需要安装并启用 Shizuku
- 修改国家码可能会影响运营商服务,请谨慎操作
- 部分设备可能不支持修改国家码
- 如需还原设置,请使用应用内的还原功能
🚀 快速开始
下载页面有两个文件,一个是含快速启动工具的压缩包,另一个就只是 APK 安装包。推荐使用快速启动工具,请按照以下步骤操作:
- 准备手机
- 启用开发者选项(具体的自己查一下)
- 进入开发者选项,开启 USB 调试
- 开启 USB 调试(安全设置),如果有就开启
- 开启 USB 安装(允许通过 USB 安装应用)
- 如果提示未知来源应用安装,请允许从此来源安装
- 连接手机到电脑
- 使用数据线将手机连接到电脑
- 在手机上允许 USB 调试授权
- 下载并启动 Nrfr 快速启动工具
- 从 Release 页面下载最新版本的快速启动工具
- 解压并运行 Nrfr 快速启动工具
- 工具会自动检测已连接的设备
- 安装必要组件
- 工具会自动安装 Shizuku 到手机
- 按照提示启用 Shizuku
- 等待工具自动安装 Nrfr 应用
- 修改国家码
- 在手机上打开 Nrfr 应用
- 选择需要修改的 SIM 卡
- 设置目标国家码
- 应用修改
修改完成后无需重启设备,设置会立即生效并永久保持。如需还原,请使用应用内的还原功能。
背景
在开发需要 root 权限的应用时,最常用的方法是在 su shell 中运行一些命令。例如,有一个应用使用该pm enable/disable
命令来启用/禁用组件。
这种方法有很大的缺点:
- 极其缓慢(创建多个进程)
- 需要处理文本(超级不可靠)
- 可能性仅限于可用的命令
- 即使 ADB 具有足够的权限,应用程序也需要 root 权限才能运行
Shizuku 采用了完全不同的方式。请参阅下文的详细说明。
用户指南及下载
Shizuku 如何工作?
首先,我们需要讨论一下应用程序如何使用系统 API。例如,如果应用程序想要获取已安装的应用程序,我们都知道应该使用PackageManager#getInstalledPackages()
。这实际上是应用程序进程和系统服务器进程之间的进程间通信 (IPC) 过程,只是 Android 框架为我们完成了内部工作。
Android 用于binder
执行这种类型的 IPC。Binder
允许服务器端了解客户端的 uid 和 pid,以便系统服务器可以检查应用程序是否有权限执行该操作。
通常,如果存在一个“管理器”(例如)供应用使用,那么系统服务器进程中PackageManager
就应该有一个“服务”(例如)。我们可以简单地理解,如果应用持有该“服务”的 ,它就可以与该“服务”进行通信。应用进程在启动时会收到系统服务的绑定器。PackageManagerService
binder
Shizuku 会引导用户先用 root 或 ADB 运行一个进程,即 Shizuku server。应用启动时,binder
也会向应用发送 to Shizuku server 的消息。
Shizuku 提供的最重要的功能就像一个中间人,负责接收来自应用程序的请求,将其发送到系统服务器,并返回结果。您可以transactRemote
在rikka.shizuku.server.ShizukuService
类中查看该方法,并moe.shizuku.api.ShizukuBinderWrapper
在类中查看详细信息。
这样,我们达到了目标,能够以更高的权限使用系统 API。对于应用来说,这几乎与直接使用系统 API 完全相同。
开发人员指南
API 和示例
https://github.com/RikkaApps/Shizuku-API
从 v11 之前的版本迁移
当然,现有的应用程序仍然有效。
注意力
- ADB权限受限ADB 的权限有限,且在不同系统版本上有所差异。您可以在此处查看授予 ADB 的权限。在调用 API 之前,您可以使用
ShizukuService#getUid
检查 Shizuku 是否正在运行用户 ADB,或者使用ShizukuService#checkPermission
检查服务器是否有足够的权限。 - Android 9 的隐藏 API 限制从 Android 9 开始,普通应用使用隐藏 API 的功能将受到限制。请使用其他方法(例如https://github.com/LSPosed/AndroidHiddenApiBypass)。
- Android 8.0 和 ADB目前,Shizuku 服务获取应用进程的方式是结合
IActivityManager#registerProcessObserver
和IActivityManager#registerUidObserver
(26+),以确保应用启动时会发送应用进程。然而,在 API 26 上,ADB 缺少使用 的权限registerUidObserver
,因此如果您需要在可能并非由 Activity 启动的进程中使用 Shizuku,建议通过启动透明 Activity 来触发发送 Binder。 - 直接使用
transactRemote
需要注意- 该 API 在不同的 Android 版本下可能有所不同,请务必仔细检查。此外,
android.app.IActivityManager
在 API 26 及更高版本中具有 aidl 形式,并且android.app.IActivityManager$Stub
仅在 API 26 上存在。 SystemServiceHelper.getTransactionCode
可能无法获取正确的事务码,比如android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages
在 API 25 上不存在,而又存在android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages_47
(这种情况已经处理,但不排除可能存在其他情况)。该ShizukuBinderWrapper
方法不会遇到此问题。
- 该 API 在不同的 Android 版本下可能有所不同,请务必仔细检查。此外,