修复 Cloudflare One 代理无法代理 Google Play 商店和 Google 网站的问题。基于 libxposed API 102 的 LSPosed / Vector 模块,把 Cloudflare One 的 VPN 从「排除列表」模式改成「白名单」模式,让 Google 应用也能正常走代理。
- 拦截
VpnService$Builder.allowBypass(),禁止应用(如 Google Play Services)主动绕过 VPN; - 拦截
addDisallowedApplication(),阻止 Cloudflare 把 Google 应用加入排除列表; - 在
establish()建立 VPN 前,自动把白名单应用(以及 Cloudflare Agent 自身)加入 allowlist; - 内置配置界面:勾选任意应用加入白名单,支持搜索、显示/隐藏系统应用、亮暗主题适配;
- 配置通过 libxposed API 102 的 Remote Preferences 在 UI 与 Hook 之间同步。
| Hook | 目标 | 作用 |
|---|---|---|
allowBypass() |
VpnService$Builder |
拦截,禁止任何应用绕过 VPN |
addDisallowedApplication(String) |
VpnService$Builder |
拦截,阻止 Cloudflare 排除应用 |
establish() |
VpnService$Builder |
建立 VPN 前注入白名单(用户配置 + Cloudflare Agent 自身) |
仅作用于 com.cloudflare.cloudflareoneagent(Cloudflare One Agent)进程。
默认白名单:Google Play(com.android.vending)、Google Play Services(com.google.android.gms)、Google Services Framework(com.google.android.gsf)。
- 安装支持 libxposed API 102 的框架(Vector,或新版 LSPosed);
- 安装本模块,在框架中启用并勾选作用域
com.cloudflare.cloudflareoneagent; - 打开本模块的配置界面,勾选需要走代理的应用(默认已含 Google 三件套);
- 修改后重启 Cloudflare One 应用生效。
环境要求:JDK 21、Android SDK 37(build-tools 37.0.0)、Gradle(使用仓库内 wrapper)。
Debug 包(无需签名):
./gradlew assembleDebugRelease 包(需要 app/signing.properties,release.keystore 与 signing.properties 均被 .gitignore 忽略,不提交):
STORE_FILE=release.keystore
STORE_PASSWORD=<你的密码>
KEY_ALIAS=<别名>
KEY_PASSWORD=<密钥密码>./gradlew assembleReleaseCloudflareOneProxyFix/
├── app/
│ ├── build.gradle.kts # 构建脚本(含签名读取)
│ ├── proguard-rules.pro # R8 混淆规则
│ ├── signing.properties # 本地签名(不提交,需自行创建)
│ └── src/main/
│ ├── java/io/github/a422015028/cfproxyfix/
│ │ ├── MainHook.kt # 模块入口与 hook 逻辑
│ │ ├── Config.kt # 配置常量与默认白名单
│ │ ├── App.kt # Application(注册 XposedService)
│ │ └── MainActivity.kt # 白名单配置界面
│ └── resources/META-INF/xposed/ # java_init.list / scope.list / module.prop
├── gradle/libs.versions.toml # 版本目录
└── settings.gradle.kts
本项目仅用于解决你自己设备上 Cloudflare One 的代理行为,不收集、不上传任何数据。请勿用于违反 Google / Cloudflare 服务条款的用途,由此产生的一切后果由使用者自行承担。