用于小米 HyperOS 的 LSPosed 隐私控制模块。按作用域选择手机管家 XSOF、GuardProvider 的 AI 通话检测,以及 SystemHelper 的部分运营商遥测路径。
当前版本:0.3.1-preview,模块包名为 io.github.yunyizea.xsofprivacy。原有 XSOF 功能已有实机生效反馈;新增的两个作用域只完成静态识别和构建检查,尚需真机验证。
- 行为监听拦截:拦截已识别的截图、电话状态、SIM 状态、飞行模式等监听注册,以及呼叫转移状态查询和相关网络状态监听。
- 本地记录写入拦截:针对截图、应用安装、通话、屏幕共享等行为记录的插入和更新路径进行拦截。
- Provider 写入拦截:阻止通过已识别的
FraudDetectionProvider内部写入入口提交数据。 - 对外接口拦截:拒绝已识别的当前行为、历史行为、行为持续时长和风险评分查询。
- 后续版本适配:通过 DEX 特征和调用关系寻找目标,不以固定版本号限制加载。
- 按功能记录状态:分别报告匹配、安装、首次命中、跳过和失败,便于检查实际覆盖情况。
模块作用于手机管家进程,不修改原始系统 APK,也不自动删除已有行为记录。
| 项目 | 已反馈的测试环境 |
|---|---|
| 设备 | Xiaomi 14 / 小米 14 |
| 系统版本 | 3.0.307.0.WNCCNXM.C11,国行 HyperOS |
| Android | 16 |
| 手机管家 | 12.8.7-260927.0.1 |
| 手机管家 versionCode | 40001287 |
| 测试反馈 | 模块实机验证有效 |
| LSPosed | 使用者提供版本 2.2.1 (7912),分支名称未提供 |
上述为已反馈的设备环境和生效结果,不代表所有功能、第三方应用兼容性和长期稳定性均已逐项验证。其他机型、系统区域和手机管家版本仍需自行检查日志与实际行为。
- 已取得 Root 权限。
- 安装了兼容当前 Android 版本的 LSPosed,并支持传统 Xposed API 82。
- 系统安装了小米手机管家:
com.miui.securitycenter。
本模块采用传统 Xposed API;仅支持现代 API 的框架环境不能直接视为兼容。
- 下载发布的模块 APK;从源码构建时,安装
app/build/outputs/apk/debug/app-debug.apk。 - 在 LSPosed 管理器中启用 XSOF Privacy Preview。
- 按下表选择需要的作用域,无需选择系统框架。只选手机管家时不会启用新增两项功能。
- 重启手机,使原有进程退出并重新加载模块。
- 查看 LSPosed 日志,搜索
XsofPrivacy,确认相关进程和功能组的状态。
模块提供独立的日志设置 Activity,可从桌面或 LSPosed 的模块设置入口打开,不需要额外授予模块应用权限。
| 可选作用域 | 包名 | 启用影响 |
|---|---|---|
| 手机管家 | com.miui.securitycenter |
原有 XSOF 监听、写入和查询拦截 |
| 系统安全组件 / GuardProvider | com.miui.guardprovider |
停用已识别的 AI 通话音视频检测服务及该服务统计 |
| SystemHelper | com.mobiletools.systemhelper |
阻止已识别的遥测采集入口与加密提交,可能影响终端注册/运营商体验计划统计 |
建议分别启用新增作用域、重启并检查日志。该模块没有全局禁用网络、定位 SDK、媒体 API 或整个杀毒服务。
更新模块后重启手机。停用时,在 LSPosed 中禁用模块并重启即可恢复原程序行为。
0.2.1 将模块包名从 local.xsofprivacy 改为 io.github.yunyizea.xsofprivacy,Android 会把它视为新的应用。请先在 LSPosed 中禁用并卸载旧模块,再安装新版、重新启用并选择手机管家作用域,最后重启。不要同时启用新旧两个模块。
若更新提示签名不一致,可卸载旧的 XSOF Privacy 模块后重新安装,再启用并设置作用域;不需要卸载手机管家。
模块在所选目标应用的 Application.attach() 完成后进行初始化,并在目标进程中安装 Hook。它采用两条识别路径。
当 base APK 与已分析文件的 SHA-256 完全一致、且没有 split APK 时,使用已经核对的方法列表,省去 DEX 特征扫描。
已分析 APK 的 SHA-256:
f4eda1b7b0f46521c93ddc75f7d833aec7bd48674c561e545f2b84a1edd6284c
该哈希用于选择精确适配路径,不再作为阻止其他版本加载的条件。
哈希不匹配时,扫描 base APK 与 split APK 中的标准 classes*.dex,结合以下证据识别目标:
- 类的父类和方法参数、返回类型。
- 数据库名、表名、字段及相关操作。
- 广播事件、接口标识及其他字符串特征。
- 初始化、写入、查询和回调之间的直接调用关系。
Ra.k、e1 等混淆名称变化后,只要所需特征和结构仍符合匹配条件,就可以继续识别。候选缺失或不唯一时,跳过对应功能组,不任意选择一个候选。
这是对后续版本的适配能力,不是对所有未来实现的兼容承诺。日志中的 ADAPTIVE_UNVERIFIED 表示使用了特征匹配路径,不表示匹配失败。
手机管家策略包含 14 个功能组、28 个 Hook 目标:
| 功能组 | 目标数 | 拦截范围 |
|---|---|---|
listeners |
10 | 监听注册、状态查询及配套清理 |
storage.* |
11 | 8 类记录的插入与部分更新 |
provider.ingress |
3 | Provider 内部写入入口 |
api.* |
4 | 当前行为、历史行为、持续时长和评分接口 |
8 类本地记录对应表为:
airplane_mode
call_forwarding
fraud_phone
fraud_url
install_app
screen_share
screenshot
voip_record
每组完整解析后才安装该组 Hook,失败时尝试撤销该组已经安装的 Hook。监听注册与清理作为一个整体处理,避免只跳过清理而留下运行中的监听。
对外查询使用匹配实现中的拒绝回调 (null, 1017),不返回伪造的“零风险”评分。依赖这些接口的应用可能出现权限或安全服务错误,需要检查常用应用的实际表现。
日志前缀包含目标进程名,例如:
[XsofPrivacy][com.miui.securitycenter:remote] INSTALLED storage.screenshot hooks=1
上例为格式示意,不是附带的实机日志。
| 标记 | 含义 |
|---|---|
PROFILE=EXACT_APK |
使用已分析 APK 的精确方法列表 |
PROFILE=ADAPTIVE_UNVERIFIED |
使用未知 APK 的特征匹配结果 |
INSTALLED |
对应功能组已注册 Hook |
HIT |
对应方法在该进程中首次实际进入拦截 |
SKIPPED |
证据缺失或存在歧义,该功能组未启用 |
FAILED |
该组安装失败,并尝试撤销已经安装的 Hook |
FAILED_ROLLBACK_INCOMPLETE |
未能确认该组 Hook 全部撤销,应禁用模块并重启 |
CALLBACK_FAILED |
拒绝回调发送失败,客户端可能超时 |
DISCOVERY_FAILED |
扫描或准备失败,不能据此认为拦截生效 |
BLOCKED |
开启详细日志后,每次已安装 Hook 跳过原方法的记录 |
DETAIL_SETTINGS_UNAVAILABLE / DETAIL_SETTINGS_RECOVERED |
跨进程日志设置读取失败或恢复,失败期间暂停详细输出 |
SUMMARY |
汇总安装、跳过或失败的组数、Hook 数和初始化耗时 |
安装成功、Hook 注册成功和实际拦截生效是不同阶段。 检查 INSTALLED 后,还应结合 HIT 和实际记录变化判断效果。
基础 HIT 日志仍只记录每个方法在每个进程中的首次命中。模块日志不输出电话号码、行为数据库内容或调用参数。
打开 XSOF Privacy · 日志设置,启用“详细拦截日志”(默认关闭)。开启后,每次已安装 Hook 拦截都会向 LSPosed 输出一条 BLOCKED,涵盖三个作用域,而不只记录首次命中。
详细记录包含 UTC 时间、目标包与进程、应用版本、适配方式、PID/TID、Binder 调用 UID、功能组、完整 DEX 方法签名、该方法在当前进程的累计命中次数、跳过原方法后的返回策略、拒绝回调及停止服务请求的结果。例如:
[XsofPrivacy][com.miui.securitycenter:remote] package=com.miui.securitycenter version=12.8.7-260927.0.1 profile=EXACT_APK pid=1234 BLOCKED time=2026-11-05T08:00:00Z tid=1235 callingUid=1000 group=storage.screenshot method=LRa/k;->e1(LQa/k;)V hit=2 original=skipped result=void callback=not_applicable serviceStop=not_applicable
上例仅为格式示意。callingUid 表示执行 Hook 时的 Binder 调用身份;普通进程内调用通常为自身 UID,不能单凭它认定是某个外部应用发起。serviceStop=requested 只表示已请求停止,不证明服务已经停止。回调会区分 rejected:1017、missing 和 failed:异常类型。
开关保存在模块的私有设置中。目标进程通过只读 Provider 读取布尔值,每个进程最多每秒读取一次;修改后无需重启,在下一次拦截时刷新,缓存最长 1 秒。设置读取失败时关闭详细输出并在后续轮询重试;拦截继续执行。未解锁、模块被强行停止或系统限制跨应用访问时,详细输出可能暂不可用。
关闭开关只停止逐次 BLOCKED 输出,安装、首次命中、错误等基础日志仍保留;已输出的日志不会被删除,开启前的事件不会补记。日志保留及导出由 LSPosed 管理,设置页仅管理开关。详细日志可能较多,排查完成后建议关闭。
- 启用模块并重启,检查手机管家相关进程的日志,包括
remote进程。 - 确认需要的功能组出现
INSTALLED,检查是否存在SKIPPED或FAILED。 - 对截图等事件进行少量正常操作,观察相应的
HIT日志。 - 需要核对本地写入时,重新获取最新的
fraud_detection_data.db副本,比较对应表的记录数和最新时间。 - 分别验证其他事件路径,并确认日常通话、应用安装、权限管理和常用应用工作正常。
已有记录不会被模块删除;数据库自动清理也可能造成数量下降,因此不应只看总数。服务仍出现在 dumpsys 中,也不能直接说明模块无效:模块保留服务生命周期,拦截的是内部方法。
| 依赖 | 版本 |
|---|---|
| JDK | 17 |
| Android SDK Platform | 35 |
| Android Gradle Plugin | 8.7.3 |
| Gradle | 8.9 |
| Xposed API | 82,compileOnly |
| dexlib2 | 2.5.2 |
使用 Android Studio 打开项目目录并同步,随后构建 app;已安装 Gradle 8.9 的环境也可执行:
gradle :app:assembleDebug产物位于 app/build/outputs/apk/debug/。当前源码未附带 Gradle Wrapper,不应直接使用 ./gradlew。
Xposed API 由运行时框架提供,不打入模块 APK;DEX 解析所需依赖随模块打包。第三方许可证位于 app/src/main/assets/third-party/。
现有预览 APK 使用 AAPT2、D8 和 apksig 直接工具链构建;Gradle 构建尚未完整执行验证。resources.arsc 的不压缩存储、4 字节对齐及 APK 签名已检查。
除上述实机生效反馈外,项目包含主机端识别回归测试:
日志开关、连续命中、失败恢复和并发读取的单元测试可运行 gradle :app:testDebugUnitTest。0.3.1 本地构建与验证限制见 日志功能验证记录。
python tools/run_resolver_tests.py /path/to/securitycenter-12.8.7.apk需要 Python 与包含 jdk.compiler 的 Java 17 环境。脚本在临时目录下载并校验固定依赖,不执行或修改目标 APK。
已覆盖的识别场景:
- 在已分析 APK 上强制走特征识别,结果与精确配置的 28 个目标一致。
- 在索引测试数据中模拟类名、方法名及回调名变化。
- 多个匹配候选时跳过相关功能组。
- 监听注册证据缺失时跳过整组配对逻辑。
- 回调关系或拒绝码证据变化时跳过受影响接口。
测试源码见 tests/ResolverTest.java,结果见 tests/RESULTS.txt。重命名场景是索引测试数据,不等于已经测试真实的后续固件。
| 文件 | 职责 |
|---|---|
PrivacyHook.java |
入口、识别路径选择、按组安装 Hook、回调和日志 |
SettingsActivity.java |
详细拦截日志的开关界面 |
LoggingSettings.java / LoggingSettingsProvider.java |
私有设置与只读跨进程开关读取 |
InterceptionLog.java |
逐次拦截日志及设置刷新 |
DexIndex.java |
读取 DEX 并建立所需的语义索引 |
CompatibilityResolver.java |
精确配置、候选匹配和功能分组 |
tests/ResolverTest.java |
识别规则的主机端测试 |
tools/run_resolver_tests.py |
准备依赖并执行识别测试 |
tools/repack_apk.py |
直接工具链的签名前组装与资源对齐检查 |
Java 源码位于 app/src/main/java/io/github/yunyizea/xsofprivacy/。
- 拦截范围限于已经识别的路径,不代表覆盖 HyperOS 的全部数据采集或联网行为。
- 未识别的新增表、接口及其他组件不会自动受到保护。
- 方法内联、动态加载、native 实现、字符串加密和较大结构变化都可能导致匹配或拦截失效。
- 未知 APK 在目标进程初始化期间同步扫描,可能增加启动时间;日志记录耗时,但不同设备上的延迟、内存和长期稳定性仍需评估。
- DEX 格式不支持、单个 DEX 超过 96 MiB、累计超过 256 MiB 或解析失败时,停止识别;每个进程只尝试一次,失败后需要重启进程。
- 数据库不再增长不能单独证明不存在内存采集、其他存储位置或上传。模块也不据此判断原系统是否将数据提供给任何特定机构。
提交 Issue 时,请提供机型、完整系统版本、手机管家版本、模块版本、LSPosed 分支与版本,以及相关的 XsofPrivacy 日志。
如涉及某次操作,请说明复现步骤、预期结果、实际结果和是否能在停用模块后恢复。日志、截图或数据库片段中的个人信息请先脱敏;通常无需上传完整行为数据库。
新增 GuardProvider guard.ai_detection 1 组、1 个目标;SystemHelper 的许可判断、
加密 POST、应用统计线程和 7 类专用广播入口共 10 组、10 个目标。三个作用域
合计 25 组、39 个目标,日志在各进程分别汇总。
新增作用域同样支持已分析 APK 的哈希快速路径和未知 APK 的特征匹配路径。
专用 Receiver 还匹配组件类名,组件改名后会跳过,不保证所有未来版本兼容。
helper.policy_gate 只改变本进程中的返回结果,不修改手机保存的许可设置。
helper.encrypted_post 返回 false,不伪造成功;调用方可能重试,需检查实际开销。
guard.ai_detection 跳过启动命令、返回 START_NOT_STICKY 并请求 stopSelf(startId)。
若出现 STOP_FAILED,停止请求未成功,需检查实际服务状态。
这会关闭相关 AI 音视频反诈和运营商遥测功能,不是仅隐藏提示。GuardProvider 其他应用扫描/上报、未知 native 或动态加载路径仍可能运行,不代表全面阻断采集。
新增样本:GuardProvider 3.1.4-20260902.0(330),SystemHelper
3.0.1-20260313(34)。分析证据、开关条件及限制见
扩展分析记录。
新增源码 ExtendedResolver.java,测试见 tests/ExtendedResolverTest.java 和
tests/EXTENDED_RESULTS.txt。可用下列命令同时运行两套主机识别测试:
python tools/run_resolver_tests.py securitycenter-12.8.7.apk guardprovider-3.1.4.apk systemhelper-3.0.1.apk0.3.0 新增功能尚未实机验证。原有实机反馈不能直接用于新增功能的效果结论。