Nrfr

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

Platform
Android Version
Go Version
React Version
TypeScript Version
Tailwind Version
Wails Version
Stars
Forks
Issues
Last Commit
Release
Downloads
License
Follow on X
快速启动工具界面
Android 应用界面

Nrfr 是一款强大的 SIM 卡国家码修改工具,无需 Root 权限即可修改 SIM 卡国家码。本项目完全基于 Android 系统原生 API 实现,不依赖 Xposed、Magisk 等任何第三方框架,仅通过调用系统级接口实现功能。通过修改国家码,你可以:

  • 🌏 解锁运营商限制,使用更多本地功能
  • 🔓 突破某些区域限制的应用和服务
  • 🛠️ 解决国际漫游时的兼容性问题
  • 🌐 帮助使用海外 SIM 卡获得更好的本地化体验
  • ⚙️ 解决部分应用识别 SIM 卡地区错误的问题

📱 使用案例

运营商配置优化

  • 手机无法正确识别运营商配置
  • 某些运营商特定功能无法使用
  • 网络配置与当地运营商不匹配

运营商参数适配

  • 运营商功能配置不完整
  • 网络参数与运营商默认配置不匹配
  • 运营商特定服务无法正常启用

漫游网络识别

  • 漫游时运营商名称显示异常
  • 网络配置与漫游地运营商不匹配
  • 运营商特定功能无法使用

TikTok 区域限制解除

  • TikTok 网络错误
  • 无法正常使用 TikTok 的完整功能

Samsung Health 区域限制解除

  • 无法通过 Samsung Health 的首次 SIM 卡检测
  • 无法同步健康数据
  • 无法正常使用 Samsung Health 的完整功能

你可以:

  1. 使用 Nrfr 修改 SIM 卡国家码为支持的地区(如 JP、US 等)
  2. 重新打开 TikTok,就可以正常使用了

💡 实现原理

Nrfr 通过调用 Android 系统级 API(CarrierConfigLoader)修改系统内的运营商配置参数,而不是直接修改 SIM 卡。这种实现方式:

  • 完全在系统层面工作,不会对 SIM 卡本身进行任何修改或造成损坏
  • 仅改变系统对 SIM 卡信息的读取方式
  • 基于 Android 原生 API 实现,不依赖任何第三方框架(如 Xposed、Magisk 等)
  • 通过 Shizuku 仅提供必要的权限支持
  • 所有修改都是可逆的,随时可以还原

✨ 特性

  • 🔒 安全可靠
    • 无需 Root 权限
    • 不修改系统文件
    • 不影响系统稳定性
    • 不会对 SIM 卡造成任何影响
  • 🔄 功能完善
    • 支持随时还原修改
    • 支持双卡设备,可分别配置
    • 一次修改永久生效,重启后保持
  • 🚀 简单易用
    • 一键启动工具
    • 智能检测设备和 SIM 卡状态
    • 自动安装所需应用
    • 简洁优雅的用户界面
    • 轻量且高效,安装包体积小

⚠️ 注意事项

  • 需要安装并启用 Shizuku
  • 修改国家码可能会影响运营商服务,请谨慎操作
  • 部分设备可能不支持修改国家码
  • 如需还原设置,请使用应用内的还原功能

🚀 快速开始

下载页面有两个文件,一个是含快速启动工具的压缩包,另一个就只是 APK 安装包。推荐使用快速启动工具,请按照以下步骤操作:

  1. 准备手机
    • 启用开发者选项(具体的自己查一下)
    • 进入开发者选项,开启 USB 调试
    • 开启 USB 调试(安全设置),如果有就开启
    • 开启 USB 安装(允许通过 USB 安装应用)
    • 如果提示未知来源应用安装,请允许从此来源安装
  2. 连接手机到电脑
    • 使用数据线将手机连接到电脑
    • 在手机上允许 USB 调试授权
  3. 下载并启动 Nrfr 快速启动工具
    • 从 Release 页面下载最新版本的快速启动工具
    • 解压并运行 Nrfr 快速启动工具
    • 工具会自动检测已连接的设备
  4. 安装必要组件
    • 工具会自动安装 Shizuku 到手机
    • 按照提示启用 Shizuku
    • 等待工具自动安装 Nrfr 应用
  5. 修改国家码
    • 在手机上打开 Nrfr 应用
    • 选择需要修改的 SIM 卡
    • 设置目标国家码
    • 应用修改

修改完成后无需重启设备,设置会立即生效并永久保持。如需还原,请使用应用内的还原功能。

Shizuku

背景

在开发需要 root 权限的应用时,最常用的方法是在 su shell 中运行一些命令。例如,有一个应用使用该pm enable/disable命令来启用/禁用组件。

这种方法有很大的缺点:

  1. 极其缓慢(创建多个进程)
  2. 需要处理文本(超级不可靠
  3. 可能性仅限于可用的命令
  4. 即使 ADB 具有足够的权限,应用程序也需要 root 权限才能运行

Shizuku 采用了完全不同的方式。请参阅下文的详细说明。

用户指南及下载

https://shizuku.rikka.app

Shizuku 如何工作?

首先,我们需要讨论一下应用程序如何使用系统 API。例如,如果应用程序想要获取已安装的应用程序,我们都知道应该使用PackageManager#getInstalledPackages()。这实际上是应用程序进程和系统服务器进程之间的进程间通信 (IPC) 过程,只是 Android 框架为我们完成了内部工作。

Android 用于binder执行这种类型的 IPC。Binder允许服务器端了解客户端的 uid 和 pid,以便系统服务器可以检查应用程序是否有权限执行该操作。

通常,如果存在一个“管理器”(例如)供应用使用,那么系统服务器进程中PackageManager就应该有一个“服务”(例如)。我们可以简单地理解,如果应用持有该“服务”的 ,它就可以与该“服务”进行通信。应用进程在启动时会收到系统服务的绑定器。PackageManagerServicebinder

Shizuku 会引导用户先用 root 或 ADB 运行一个进程,即 Shizuku server。应用启动时,binder也会向应用发送 to Shizuku server 的消息。

Shizuku 提供的最重要的功能就像一个中间人,负责接收来自应用程序的请求,将其发送到系统服务器,并返回结果。您可以transactRemoterikka.shizuku.server.ShizukuService类中查看该方法,并moe.shizuku.api.ShizukuBinderWrapper在类中查看详细信息。

这样,我们达到了目标,能够以更高的权限使用系统 API。对于应用来说,这几乎与直接使用系统 API 完全相同。

开发人员指南

API 和示例

https://github.com/RikkaApps/Shizuku-API

从 v11 之前的版本迁移

当然,现有的应用程序仍然有效。

https://github.com/RikkaApps/Shizuku-API#migration-guide-for-existing-applications-use-shizuku-pre-v11

注意力

  1. ADB权限受限ADB 的权限有限,且在不同系统版本上有所差异。您可以在此处查看授予 ADB 的权限。在调用 API 之前,您可以使用ShizukuService#getUid检查 Shizuku 是否正在运行用户 ADB,或者使用ShizukuService#checkPermission检查服务器是否有足够的权限。
  2. Android 9 的隐藏 API 限制从 Android 9 开始,普通应用使用隐藏 API 的功能将受到限制。请使用其他方法(例如https://github.com/LSPosed/AndroidHiddenApiBypass)。
  3. Android 8.0 和 ADB目前,Shizuku 服务获取应用进程的方式是结合IActivityManager#registerProcessObserverIActivityManager#registerUidObserver(26+),以确保应用启动时会发送应用进程。然而,在 API 26 上,ADB 缺少使用 的权限registerUidObserver,因此如果您需要在可能并非由 Activity 启动的进程中使用 Shizuku,建议通过启动透明 Activity 来触发发送 Binder。
  4. 直接使用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方法不会遇到此问题。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注